Добавил:
chrysler_a57_mltbnk
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:семестр 1 / lab18_prot
.pyimport os
clear = lambda: os.system('cls')
clear()
import scipy
import random
import numpy as np
import matplotlib.pyplot as plt
from os.path import isfile
#Функция вычисления значений гипотезы
def hypothesis(x, theta, count):
h = []
i = 0
while i != count:
tmp1 = x[i].T
tmp2 = 0
for p in range(0,12):
tmp2 += theta[p]*tmp1[p]
h.append(tmp2)
i += 1
i = 0
return h
#Функция вычисления значения функции стоимости
def qdc_err(h, y, count):
i = 0
err = 0
while i != count:
err += (h[i]-y[i])**2
i += 1
i = 0
J = (1/(2*count)*err)
return float(J[0])
#Функция вычисления частной производной по одному из коэффициентов гипотезы
def partial_J(h, x, y, n, count):
i = 0
partial = 0
while i != count:
partial += (h[i]-float(y[i]))*x[i][n]
i += 1
i = 0
return float(partial)
#Функция вычисления значения функции стоимости
def J(theta):
coeff = theta
cost_func = 0
H = hypothesis(parameters, coeff, count)
cost_func = qdc_err(H, result, count)
return float(cost_func)
#Функция вычисления частных производных по каждому из коэффициентов гипотезы
def diff_J(theta):
coeff = theta
dJ = []
j = 0
H = hypothesis(parameters, coeff, count)
while j != len(theta):
dJ.append(partial_J(H, parameters, 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 != 12:
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 Callback(theta):
DJ = diff_J(theta)
mid = 0
iter_count(iter_number_arr)
theta_save(theta)
for f in DJ:
mid += f
mid = abs(mid/12)
print(f'\n{chr(0x2503)} Mean value of partial derivatives at {iter_number_arr[-1]:02d} iteration is {mid:0.2e} {chr(0x2503)}', end="")
#Считывание из файла необходимых данных
all_data = [[],[],[],[],[],[],[],[],[],[],[],[]]
headings = []
count = 0
i = 0
f = open('student-mat-2.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[1]))
all_data[1].append(float(tmp[2]))
all_data[2].append(float(tmp[3]))
all_data[3].append(float(tmp[4]))
all_data[4].append(float(tmp[5]))
all_data[5].append(float(tmp[6]))
all_data[6].append(float(tmp[7]))
all_data[7].append(float(tmp[8]))
all_data[8].append(float(tmp[9]))
all_data[9].append(float(tmp[10]))
all_data[10].append(float(tmp[11]))
all_data[11].append(float(tmp[12]))
count += 1
f.close()
count -= 1
#Разделение входных данных на матрицу параметров и матрицу результатов
parameters = np.ones(count*12)
parameters.shape = (count, 12)
result = np.zeros(count*1)
result.shape = (count, 1)
while i != count:
parameters[i][1] = all_data[0][i]
parameters[i][2] = all_data[1][i]
parameters[i][3] = all_data[2][i]
parameters[i][4] = all_data[3][i]
parameters[i][5] = all_data[4][i]
parameters[i][6] = all_data[5][i]
parameters[i][7] = all_data[6][i]
parameters[i][8] = all_data[7][i]
parameters[i][9] = all_data[8][i]
parameters[i][10] = all_data[9][i]
parameters[i][11] = all_data[10][i]
result[i] = all_data[11][i]
i +=1
i = 0
#Нормализация значений параметров
x_mx = np.max(parameters, 0)
x_mn = np.min(parameters, 0)
x_sub = []
left_border = 0
right_border = 1
i = 1
while i != len(x_mn):
x_sub.append(x_mx[i]-x_mn[i])
i += 1
i = 0
#Замена исходных параметров на нормализованные
while i != count:
parameters[i][1] = left_border + ((parameters[i][1] - x_mn[1])/x_sub[0])*(right_border - left_border)
parameters[i][2] = left_border + ((parameters[i][2] - x_mn[2])/x_sub[1])*(right_border - left_border)
parameters[i][3] = left_border + ((parameters[i][3] - x_mn[3])/x_sub[2])*(right_border - left_border)
parameters[i][4] = left_border + ((parameters[i][4] - x_mn[4])/x_sub[3])*(right_border - left_border)
parameters[i][5] = left_border + ((parameters[i][5] - x_mn[5])/x_sub[4])*(right_border - left_border)
parameters[i][6] = left_border + ((parameters[i][6] - x_mn[6])/x_sub[5])*(right_border - left_border)
parameters[i][7] = left_border + ((parameters[i][7] - x_mn[7])/x_sub[6])*(right_border - left_border)
parameters[i][8] = left_border + ((parameters[i][8] - x_mn[8])/x_sub[7])*(right_border - left_border)
parameters[i][9] = left_border + ((parameters[i][9] - x_mn[9])/x_sub[8])*(right_border - left_border)
parameters[i][10] = left_border + ((parameters[i][10] - x_mn[10])/x_sub[9])*(right_border - left_border)
parameters[i][11] = left_border + ((parameters[i][11] - x_mn[11])/x_sub[10])*(right_border - left_border)
i += 1
i = 0
#Вычисление первых значений коэффициентов
theta = np.zeros(12)
for i in range(0, 12):
theta[i] = random.random()
#Сохранение коэффициентов гипотезы для дальнейшего построения графика
TH = [[],[],[],[],[],[],[],[],[],[],[],[]]
f = 0
while f != 12:
TH[f].append(theta[f])
f += 1
f = 0
#Поиск минимума функции стоимости
iter_number = 0
iter_number_arr = [iter_number]
cost_func = J(theta)
if isfile("minimize_res.txt") == False:
J_min = scipy.optimize.minimize(J, theta, method='BFGS', jac=diff_J, callback=Callback)
f = open("minimize_res.txt", 'wt')
for i in J_min.x:
f.write(str(i)+' ')
f.write('\n'+str(J_min.fun))
f.close()
elif isfile("minimize_res.txt") == True:
f = open("minimize_res.txt", 'rt')
line = f.read().split(' ')
line = np.array(line[0:-1], dtype=np.float64)
f.close()
print(line)
Соседние файлы в папке семестр 1
