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

семестр 2 / лабы / lab1_prot

.py
Скачиваний:
0
Добавлен:
13.05.2026
Размер:
9 Кб
Скачать
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()
Соседние файлы в папке лабы