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

семестр 1 / lab17

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

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

	tmp1 = cost_func
	H = []
	cost_func = 0
	
	#Вычисление новых значений гипотезы и функции стоимости
	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
	
	#Сохранение значений номера итерации градиентного спуска и значения функции стоимости 
	#для дальнейшего построения графика
	tmp2 = cost_func
	cost_func_arr.append(cost_func)
	iter_number_arr.append(i)

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

	sub = tmp1 - tmp2
	i += 1
i = 0

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

#Объявление необходимых параметров ученика
custom_par = [1, 507%5, (3*507)%5, 507%4+1, (3*507)%4+1, (4*507)%5+1, (2*507)%5+1, (5-507)%5+1, (3*507)%5+1, 507%5+1, (2*507)%5+1, 57]
custom_par_arr = np.array(custom_par, dtype = np.float16)
custom_par_arr.shape = (1,12)

#Вывод параметров на экран
print(f'Введённые параметры\n\
=============================================\n\
Образование матери                          {custom_par[1]}\n\
Образование отца                            {custom_par[2]}\n\
Время поездки до школы                      {custom_par[3]}\n\
Время учёбы в неделю                        {custom_par[4]}\n\
Отношения в семье                           {custom_par[5]}\n\
Свободное время после школы                 {custom_par[6]}\n\
Время, проведённое с друзьями               {custom_par[7]}\n\
Количество выпиваемого алкоголя в будни     {custom_par[8]}\n\
Количество выпиваемого алкоголя в выходные  {custom_par[9]}\n\
Уровень здоровья ученика                    {custom_par[0]}\n\
Количество пропусков                        {custom_par[11]}\n\
=============================================\n')

#Нормализация введённых параметров
x_mx = 0
x_mn = 0
x_mx = np.max(custom_par, 0)
x_mn = np.min(custom_par, 0)
x_sub = x_mx - x_mn
left_border = 0
right_border = 1

for i in range(1,12):
	custom_par_arr[0][i] = left_border + ((custom_par_arr[0][i] - x_mn)/x_sub)*(right_border - left_border)

#Расчёт предполагаемого результата экзамена ученика 
#с учётом возвращения от нормализованных значений к реальным
custom_res = int(float(hypothesis(custom_par_arr,theta)))

#Вывод предполагаемого результата на экран
print(f'Предполагаемый результат экзамена ученика: {custom_res}\n')

#Поочерёдное отображение необходимых графиков
plt.figure(2)
plt.figure(1)
plt.show()
Соседние файлы в папке семестр 1