Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
13.05.2026
Размер:
7.78 Кб
Скачать
import os
clear = lambda: os.system('cls')
clear()
import numpy as np
import matplotlib.pyplot as plt
import random

#Функция вычисления гипотезы
def hypothesis(x, theta):
h = theta @ x.T
return h

#Функция вычисления значения функции стоимости
def J(y, h):
qdc_err = (h - y)**2
J = 1/2 * qdc_err
return J

#Функция вычисления новых значений коэффициентов гипотезы
def Theta_new(theta_i, alpha, x, y, h, m):
err = 0
for i in range(0, len(h)):
err += (h[i] - y[i]) * x[i]
theta = theta_i - alpha/m * err
return theta

#Считывание из файла необходимых данных
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)
theta.shape = (1,12)
for i in range(0, 12):
theta[0][i] = random.random()
cost_func = 0
H = []

#Вычисление значений гипотезы и функции стоимости
i = 0
while i != count:
H.append(hypothesis(parameters[i], theta))
cost_func += J(result[i], H[i])
i += 1
i = 0
cost_func = cost_func / count

#Сохранение коэффициентов гипотезы для дальнейшего построения графика
TH = [[],[],[],[],[],[],[],[],[],[],[],[]]
for f in range(0,12):
TH[f].append(theta[0][f])

#Реализация градиентного спуска
alpha = 0.1
iter_number_arr = [0]

i = 1
j = 0
print(TH[0][-1])
while TH[0][-1] <= 9.147253400204098:
#Вычисление новых значений коэффициентов гипотезы
for u in range(0, len(theta)):
theta[u] = Theta_new(theta[u], alpha, parameters, result, H, count)
H = []

#Вычисление новых значений гипотезы и функции стоимости
while j != count:
H.append(hypothesis(parameters[j], theta))
cost_func += J(result[j], H[j])
j += 1
j = 0
cost_func = cost_func / count

#Сохранение значений номера итерации градиентного спуска и значения функции стоимости
#для дальнейшего построения графика
iter_number_arr.append(i)

#Сохранение коэффициентов гипотезы для дальнейшего построения графика
for f in range(0,12):
TH[f].append(theta[0][f])
print(f'Iter number{i}, thrta_0 = {TH[0][-1]}')
i += 1
i = 0

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 = {TH[0][-1]: 0.4f} Theta6 = {TH[6][-1]: 0.4f} {chr(0x2503)}\
\n{chr(0x2503)} Theta1 = {TH[1][-1]: 0.4f} Theta7 = {TH[7][-1]: 0.4f} {chr(0x2503)}\
\n{chr(0x2503)} Theta2 = {TH[2][-1]: 0.4f} Theta8 = {TH[8][-1]: 0.4f} {chr(0x2503)}\
\n{chr(0x2503)} Theta3 = {TH[3][-1]: 0.4f} Theta9 = {TH[9][-1]: 0.4f} {chr(0x2503)}\
\n{chr(0x2503)} Theta4 = {TH[4][-1]: 0.4f} Theta10 = {TH[10][-1]: 0.4f} {chr(0x2503)}\
\n{chr(0x2503)} Theta5 = {TH[5][-1]: 0.4f} Theta11 = {TH[11][-1]: 0.4f} {chr(0x2503)}\
\n{chr(0x2517)}{s}{chr(0x251B)}')

#Построение графика зависимостей значений коэффициентов гипотезы
#от номера итерации градиентного спуска
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.figure(1)
plt.show()
Соседние файлы в папке семестр 1