Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

семестр 1 / lab18

.py
Скачиваний:
0
Добавлен:
13.05.2026
Размер:
8.51 Кб
Скачать
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 = []
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)

#Вывод результатов
s = ""
for g in range(0,63):
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(0x2517)}{s}{chr(0x251B)}')

s = ""
for g in range(0,38):
s += chr(0x2501)
print(f'\n\n{chr(0x250F)}{s}{chr(0x2513)}\
\n{chr(0x2503)} MINIMAL COEFFICIENTS {chr(0x2503)}\
\n{chr(0x2503)} Theta0 = {J_min.x[0]: 0.4f} Theta6 = {J_min.x[6]: 0.4f} {chr(0x2503)}\
\n{chr(0x2503)} Theta1 = {J_min.x[1]: 0.4f} Theta7 = {J_min.x[7]: 0.4f} {chr(0x2503)}\
\n{chr(0x2503)} Theta2 = {J_min.x[2]: 0.4f} Theta8 = {J_min.x[8]: 0.4f} {chr(0x2503)}\
\n{chr(0x2503)} Theta3 = {J_min.x[3]: 0.4f} Theta9 = {J_min.x[9]: 0.4f} {chr(0x2503)}\
\n{chr(0x2503)} Theta4 = {J_min.x[4]: 0.4f} Theta10 = {J_min.x[10]: 0.4f} {chr(0x2503)}\
\n{chr(0x2503)} Theta5 = {J_min.x[5]: 0.4f} Theta11 = {J_min.x[11]: 0.4f} {chr(0x2503)}\
\n{chr(0x2517)}{s}{chr(0x251B)}')

print(f'\nMinimum value of cost function is {J_min.fun:0.5f}')

plt.figure(1)
#Построение линий зависимостей соответствующих коэффициентов с подписями в легенде
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.plot(iter_number_arr, TH[5], label=r"$\theta_5$")
plt.plot(iter_number_arr, TH[6], label=r"$\theta_6$")
plt.plot(iter_number_arr, TH[7], label=r"$\theta_7$")
plt.plot(iter_number_arr, TH[8], label=r"$\theta_8$")
plt.plot(iter_number_arr, TH[9], label=r"$\theta_9$")
plt.plot(iter_number_arr, TH[10], label=r"$\theta_{10}$")
plt.plot(iter_number_arr, TH[11], label=r"$\theta_{11}$")
#Добавление подписей осям
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.show()
Соседние файлы в папке семестр 1