Добавил:
chrysler_a57_mltbnk
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
import os
clear = lambda: os.system('cls')
clear()
import scipy
import random
import numpy as np
import matplotlib.pyplot as plt
#Функция вычисления значений гипотезы
def hypothesis(x, theta, count):
h = X@theta.T
'''
while i != count:
tmp += theta.T@x[i]
h.append(tmp)
j = 0
tmp = 0
i += 1
i = 0
'''
return h
#Функция вычисления значения функции стоимости
def qdc_err(h, y, count):
i = 0
err = 0
while i != count:
err += (h[i]-y[i][0])**2
i += 1
i = 0
J = (1/(2*count)*err)
return float(J)
#Функция возвращения значения функции стоимости
def J(theta):
coeff = theta
cost_func = 0
H = hypothesis(X, coeff, count)
cost_func = qdc_err(H, result, count)
return float(cost_func)
#Функция вычисления частной производной по одному из коэффициентов гипотезы
def partial_J(h, x, y, n, count):
i = 0
partial = 0
while i != count:
partial += ((h[i]-y[i][0])*x[i][n])/count
i += 1
i = 0
return float(partial)
#Функция вычисления частных производных по каждому из коэффициентов гипотезы
def diff_J(theta):
coeff = theta
dJ = []
j = 0
H = hypothesis(X, coeff, count)
while j != len(coeff):
dJ.append(partial_J(H, X, result, j, count))
j += 1
j = 0
return dJ
#Функция обращения к массиву коэффициентов
def theta_call(TH):
return TH
#Функция сохранения коэффициентов гипотезы
def theta_save(theta):
t = theta
ty = theta_call(TH)
f = 0
while f != 5:
ty[f].append(t[f])
f += 1
f = 0
return TH
#Счётчик итераций минимизации
def iter_count(iter_number_arr):
iter_number_arr.append(iter_number_arr[-1]+1)
return iter_number_arr
#Функция сохранения значений функции стоимости
def cost_func_save(cost_func_arr, J):
cost_func_arr.append(J)
return cost_func_arr
#Функция отклика
def Callback(theta):
J_min_fun = J(theta)
iter_count(iter_number_arr)
theta_save(theta)
cost_func_save(cost_func_arr,J_min_fun)
print(f'\n{chr(0x2503)} Cost func value at {iter_number_arr[-1]:02d} iteration is {J_min_fun:e} {chr(0x2503)}', end="")
all_data = [[], []]
headings = []
count = 0
i = 0
j = 0
#Считывание данных из файла
f = open('kc_house_data.csv', mode='r', encoding='cp1251')
for line in f:
if count == 0:
headings.extend(line.split(','))
elif count > 0:
tmp = line.split(',')
all_data[0].append(float(tmp[11]))
all_data[1].append(float(tmp[2]))
count += 1
f.close()
count -= 1
#Разделение входных данных на матрицу параметров и матрицу результатов
parameters = np.ones(count*1)
parameters.shape = (count, 1)
result = np.zeros(count*1)
result.shape = (count, 1)
while i != count:
parameters[i][0] = all_data[0][i]
result[i][0] = all_data[1][i]
i +=1
i = 0
#Построение графика зависимости результата от параметра
plt.figure(1)
plt.scatter(parameters, result)
#Нормирование значений параметров
x_mx = float(np.max(parameters, 0))
x_mn = float(np.min(parameters, 0))
x_sub = x_mx - x_mn
left_border = 0
right_border = 1
#Замена исходных параметров на нормированные
while i != count:
parameters[i][0] = left_border + ((parameters[i][0] - x_mn)/x_sub)*(right_border - left_border)
i += 1
i = 0
#Создание матрицы переменных для гипотезы
X = np.ones(count*5)
X.shape = (count,5)
#Заполнение матрицы переменных для гипотезы необходимимы данными
while i != count:
while j != 5:
X[i][j] = parameters[i][0]**j
j += 1
i += 1
j = 0
i = 0
j = 0
#Вычисление первых значений коэффициентов гипотезы
theta = np.zeros(5)
theta.flatten(order="F")
while i != 5:
theta[i] = random.random()
i += 1
i = 0
#Сохранение коэффициентов гипотезы для простроения графика
TH = [[],[],[],[],[]]
while i != 5:
TH[i].append(theta[i])
i += 1
i = 0
#Необходимые данные для сохранения значений для построения графиков
iter_number = 0
iter_number_arr = [iter_number]
cost_func = J(theta)
cost_func_arr = [cost_func]
#Вывод результатов
s = ""
for g in range(0,49):
s += chr(0x2501)
print(f'{chr(0x250F)}{s}{chr(0x2513)}', end='')
print(f'\n{chr(0x2503)} MINIMIZE ITERATIONS {chr(0x2503)}',end='')
#Поиск минимума функции стоимости
J_min = scipy.optimize.minimize(J, theta, method='BFGS', jac=diff_J, callback=Callback)
print(f'\n{chr(0x2523)}{s}{chr(0x252B)}')
s = ""
for g in range(0,49):
s += chr(0x2501)
print(f'\
{chr(0x2503)} MINIMAL COEFFICIENTS {chr(0x2503)}\
\n{chr(0x2503)} Theta0 = {J_min.x[0]: 0.4e} Theta3 = {J_min.x[3]: 0.4e} {chr(0x2503)}\
\n{chr(0x2503)} Theta1 = {J_min.x[1]: 0.4e} Theta4 = {J_min.x[4]: 0.4e} {chr(0x2503)}\
\n{chr(0x2503)} Theta2 = {J_min.x[2]: 0.4e} {chr(0x2503)}\
\n{chr(0x2517)}{s}{chr(0x251B)}')
#Построение графиков
##График гипотезы
x_line = np.linspace(0, 13, count)
x_line.flatten(order="F")
x_line_norm = x_line.copy()
###Нормирование значений параметров
x_mx = float(np.max(x_line, 0))
x_mn = float(np.min(x_line, 0))
x_sub = x_mx - x_mn
###Замена исходных параметров на нормированные
while i != count:
x_line[i] = left_border + ((x_line[i] - x_mn)/x_sub)*(right_border - left_border)
i += 1
i = 0
j = 0
###Создание матрицы переменных для гипотезы
x_line_p = np.ones(count*5)
x_line_p.shape = (count,5)
###Заполнение матрицы переменных для гипотезы необходимимы данными
while i != count:
while j != 5:
x_line_p[i][j] = x_line[i]**j
j += 1
i += 1
j = 0
i = 0
j = 0
plt.figure(1)
plt.plot(x_line_norm, hypothesis(x_line_p, J_min.x, count),c="g", label="Гипотеза")
##График зависимости результата от параметра
###Добавление подписей осям
plt.xlabel("Grade")
plt.ylabel("Price")
###Добавление более частой сетки
plt.grid(which='major')
plt.minorticks_on()
plt.grid(which='minor', linestyle=':')
plt.tight_layout()
plt.legend()
##График зависимости значений коэффициентов гипотезы от итерации минимизации
plt.figure(2)
###Построение линий зависимостей соответствующих коэффициентов с подписями в легенде
plt.plot(iter_number_arr, TH[0], label=r"$\theta_0$")
plt.plot(iter_number_arr, TH[1], label=r"$\theta_1$")
plt.plot(iter_number_arr, TH[2], label=r"$\theta_2$")
plt.plot(iter_number_arr, TH[3], label=r"$\theta_3$")
plt.plot(iter_number_arr, TH[4], label=r"$\theta_4$")
###Добавление подписей осям
plt.xlabel("Количество итераций")
plt.ylabel("Значения коэффициентов")
###Добавление более частой сетки
plt.grid(which='major')
plt.minorticks_on()
plt.grid(which='minor', linestyle=':')
plt.tight_layout()
###Добавление легенды
plt.legend(loc='upper left')
##График зависимости значения функции стоимости от итерациии минимизации
plt.figure(3)
##Построение зависимости
plt.plot(iter_number_arr, cost_func_arr)
###Добавление подписей осям
plt.xlabel("Количество итераций")
plt.ylabel("Значение функции стоимости")
###Добавление более частой сетки
plt.grid(which='major')
plt.minorticks_on()
plt.grid(which='minor', linestyle=':')
plt.tight_layout()
plt.show()
clear = lambda: os.system('cls')
clear()
import scipy
import random
import numpy as np
import matplotlib.pyplot as plt
#Функция вычисления значений гипотезы
def hypothesis(x, theta, count):
h = X@theta.T
'''
while i != count:
tmp += theta.T@x[i]
h.append(tmp)
j = 0
tmp = 0
i += 1
i = 0
'''
return h
#Функция вычисления значения функции стоимости
def qdc_err(h, y, count):
i = 0
err = 0
while i != count:
err += (h[i]-y[i][0])**2
i += 1
i = 0
J = (1/(2*count)*err)
return float(J)
#Функция возвращения значения функции стоимости
def J(theta):
coeff = theta
cost_func = 0
H = hypothesis(X, coeff, count)
cost_func = qdc_err(H, result, count)
return float(cost_func)
#Функция вычисления частной производной по одному из коэффициентов гипотезы
def partial_J(h, x, y, n, count):
i = 0
partial = 0
while i != count:
partial += ((h[i]-y[i][0])*x[i][n])/count
i += 1
i = 0
return float(partial)
#Функция вычисления частных производных по каждому из коэффициентов гипотезы
def diff_J(theta):
coeff = theta
dJ = []
j = 0
H = hypothesis(X, coeff, count)
while j != len(coeff):
dJ.append(partial_J(H, X, result, j, count))
j += 1
j = 0
return dJ
#Функция обращения к массиву коэффициентов
def theta_call(TH):
return TH
#Функция сохранения коэффициентов гипотезы
def theta_save(theta):
t = theta
ty = theta_call(TH)
f = 0
while f != 5:
ty[f].append(t[f])
f += 1
f = 0
return TH
#Счётчик итераций минимизации
def iter_count(iter_number_arr):
iter_number_arr.append(iter_number_arr[-1]+1)
return iter_number_arr
#Функция сохранения значений функции стоимости
def cost_func_save(cost_func_arr, J):
cost_func_arr.append(J)
return cost_func_arr
#Функция отклика
def Callback(theta):
J_min_fun = J(theta)
iter_count(iter_number_arr)
theta_save(theta)
cost_func_save(cost_func_arr,J_min_fun)
print(f'\n{chr(0x2503)} Cost func value at {iter_number_arr[-1]:02d} iteration is {J_min_fun:e} {chr(0x2503)}', end="")
all_data = [[], []]
headings = []
count = 0
i = 0
j = 0
#Считывание данных из файла
f = open('kc_house_data.csv', mode='r', encoding='cp1251')
for line in f:
if count == 0:
headings.extend(line.split(','))
elif count > 0:
tmp = line.split(',')
all_data[0].append(float(tmp[11]))
all_data[1].append(float(tmp[2]))
count += 1
f.close()
count -= 1
#Разделение входных данных на матрицу параметров и матрицу результатов
parameters = np.ones(count*1)
parameters.shape = (count, 1)
result = np.zeros(count*1)
result.shape = (count, 1)
while i != count:
parameters[i][0] = all_data[0][i]
result[i][0] = all_data[1][i]
i +=1
i = 0
#Построение графика зависимости результата от параметра
plt.figure(1)
plt.scatter(parameters, result)
#Нормирование значений параметров
x_mx = float(np.max(parameters, 0))
x_mn = float(np.min(parameters, 0))
x_sub = x_mx - x_mn
left_border = 0
right_border = 1
#Замена исходных параметров на нормированные
while i != count:
parameters[i][0] = left_border + ((parameters[i][0] - x_mn)/x_sub)*(right_border - left_border)
i += 1
i = 0
#Создание матрицы переменных для гипотезы
X = np.ones(count*5)
X.shape = (count,5)
#Заполнение матрицы переменных для гипотезы необходимимы данными
while i != count:
while j != 5:
X[i][j] = parameters[i][0]**j
j += 1
i += 1
j = 0
i = 0
j = 0
#Вычисление первых значений коэффициентов гипотезы
theta = np.zeros(5)
theta.flatten(order="F")
while i != 5:
theta[i] = random.random()
i += 1
i = 0
#Сохранение коэффициентов гипотезы для простроения графика
TH = [[],[],[],[],[]]
while i != 5:
TH[i].append(theta[i])
i += 1
i = 0
#Необходимые данные для сохранения значений для построения графиков
iter_number = 0
iter_number_arr = [iter_number]
cost_func = J(theta)
cost_func_arr = [cost_func]
#Вывод результатов
s = ""
for g in range(0,49):
s += chr(0x2501)
print(f'{chr(0x250F)}{s}{chr(0x2513)}', end='')
print(f'\n{chr(0x2503)} MINIMIZE ITERATIONS {chr(0x2503)}',end='')
#Поиск минимума функции стоимости
J_min = scipy.optimize.minimize(J, theta, method='BFGS', jac=diff_J, callback=Callback)
print(f'\n{chr(0x2523)}{s}{chr(0x252B)}')
s = ""
for g in range(0,49):
s += chr(0x2501)
print(f'\
{chr(0x2503)} MINIMAL COEFFICIENTS {chr(0x2503)}\
\n{chr(0x2503)} Theta0 = {J_min.x[0]: 0.4e} Theta3 = {J_min.x[3]: 0.4e} {chr(0x2503)}\
\n{chr(0x2503)} Theta1 = {J_min.x[1]: 0.4e} Theta4 = {J_min.x[4]: 0.4e} {chr(0x2503)}\
\n{chr(0x2503)} Theta2 = {J_min.x[2]: 0.4e} {chr(0x2503)}\
\n{chr(0x2517)}{s}{chr(0x251B)}')
#Построение графиков
##График гипотезы
x_line = np.linspace(0, 13, count)
x_line.flatten(order="F")
x_line_norm = x_line.copy()
###Нормирование значений параметров
x_mx = float(np.max(x_line, 0))
x_mn = float(np.min(x_line, 0))
x_sub = x_mx - x_mn
###Замена исходных параметров на нормированные
while i != count:
x_line[i] = left_border + ((x_line[i] - x_mn)/x_sub)*(right_border - left_border)
i += 1
i = 0
j = 0
###Создание матрицы переменных для гипотезы
x_line_p = np.ones(count*5)
x_line_p.shape = (count,5)
###Заполнение матрицы переменных для гипотезы необходимимы данными
while i != count:
while j != 5:
x_line_p[i][j] = x_line[i]**j
j += 1
i += 1
j = 0
i = 0
j = 0
plt.figure(1)
plt.plot(x_line_norm, hypothesis(x_line_p, J_min.x, count),c="g", label="Гипотеза")
##График зависимости результата от параметра
###Добавление подписей осям
plt.xlabel("Grade")
plt.ylabel("Price")
###Добавление более частой сетки
plt.grid(which='major')
plt.minorticks_on()
plt.grid(which='minor', linestyle=':')
plt.tight_layout()
plt.legend()
##График зависимости значений коэффициентов гипотезы от итерации минимизации
plt.figure(2)
###Построение линий зависимостей соответствующих коэффициентов с подписями в легенде
plt.plot(iter_number_arr, TH[0], label=r"$\theta_0$")
plt.plot(iter_number_arr, TH[1], label=r"$\theta_1$")
plt.plot(iter_number_arr, TH[2], label=r"$\theta_2$")
plt.plot(iter_number_arr, TH[3], label=r"$\theta_3$")
plt.plot(iter_number_arr, TH[4], label=r"$\theta_4$")
###Добавление подписей осям
plt.xlabel("Количество итераций")
plt.ylabel("Значения коэффициентов")
###Добавление более частой сетки
plt.grid(which='major')
plt.minorticks_on()
plt.grid(which='minor', linestyle=':')
plt.tight_layout()
###Добавление легенды
plt.legend(loc='upper left')
##График зависимости значения функции стоимости от итерациии минимизации
plt.figure(3)
##Построение зависимости
plt.plot(iter_number_arr, cost_func_arr)
###Добавление подписей осям
plt.xlabel("Количество итераций")
plt.ylabel("Значение функции стоимости")
###Добавление более частой сетки
plt.grid(which='major')
plt.minorticks_on()
plt.grid(which='minor', linestyle=':')
plt.tight_layout()
plt.show()
Соседние файлы в папке лабы
