Это самые простые типы моделей машинного обучения, и мы собираемся реализовать их с помощью Python за несколько шагов.
Предполагается, что две переменные связаны линейно. Следовательно, мы попытаемся найти линейную функцию, которая предсказывает ответ (y) по значению признака (x).
Итак, начнем:
#Шаг 1: Настройте среду
Вы можете использовать Jupiter Notebook, Google colab или загрузить python и PyCharm на свой локальный компьютер.
Нам понадобятся только две библиотеки: Numpy и Matplotlib.
#Шаг 2: Импорт библиотек
import math import numpy as np import matplotlib.pyplot as plt
#Шаг 3: Реализуйте эти функции
Вы должны быть знакомы с функциями и алгоритмами машинного обучения. Во-первых, у нас есть линейная функция, которая отображает линейную связь между единичными входными данными и выходными данными:
def compute_model_output(x,w,b): m=x.shape[0] f_wb=np.zeros(m) for i in range(m): f_wb[i]=w*x[i]+b return f_wb
затем функция стоимости, которая помогает нам определить, работает ли наша модель нормально:
def compute_cost(x,y,w,b): m=x.shape[0] cost_sum=0 for i in range(m): fx=w*x[i]+b cost=(fx-y[i])**2 cost_sum=cost_sum+cost return cost_sum/2*m
чтобы минимизировать функцию стоимости, нам нужно обновить параметры w и b с помощью алгоритма градиентного спуска, чтобы минимизировать функцию стоимости:
def gradient_descent(x,y,w_in,b_in,alpha,iterations,cost_function,derivative_function): # save valuse of cost function to plot them later j_history=[] p_history=[] w=w_in b=b_in for i in range(iterations): dj_dw,dj_db=derivative_function(x,y,w,b) b=b-alpha*dj_db w=w-alpha*dj_dw if i<100000: j_history.append(cost_function(x,y,w,b)) p_history.append([w,b]) # Print cost every at intervals 10 times or as many iterations if < 10 if i % math.ceil(iterations / 10) == 0: print(f"Iteration {i:4}: Cost {j_history[-1]:0.2e} ", f"dj_dw: {dj_dw: 0.3e}, dj_db: {dj_db: 0.3e} ", f"w: {w: 0.3e}, b:{b: 0.5e}") return w,b,j_history,p_history
чтобы запустить градиентный спуск, нам нужно вычислить производную от w и b:
def compute_derivative(x,y,w,b): m=x.shape[0] dj_dw=0 dj_db=0 for i in range(m): fx=w*x[i]+b dj_dw_i=(fx-y[i])*x[i] dj_db_i=fx-y[i] dj_dw+=dj_dw_i dj_db+=dj_db_i dj_dw=dj_dw/m dj_db=dj_db/m return dj_dw,dj_db
эта функция предназначена для построения функции стоимости для количества итераций:
def plot_cost(j_history): fig, (ax1, ax2) = plt.subplots(1, 2, constrained_layout=True, figsize=(12, 4)) ax1.plot(j_history[:100]) ax2.plot(100 + np.arange(len(j_history[100:])), j_history[100:]) ax1.set_title("Cost vs. iteration(start)"); ax2.set_title("Cost vs. iteration (end)") ax1.set_ylabel('Cost'); ax2.set_ylabel('Cost') ax1.set_xlabel('iteration step'); ax2.set_xlabel('iteration step') plt.show()
эта функция предназначена для построения наших данных и модели после обучения:
def represent_data(x_train, y_train,fx): plt.scatter(x_train, y_train, marker='x', c='r',label='actual valus') plt.plot(x_train, fx, c='b', label='our prediction') plt.title('Housing Prices') plt.ylabel('Price (in 1000s of dollars)') plt.xlabel('Size (1000 sqft)') plt.legend() plt.show()
#Шаг 4: обучаем модель и прогнозируем
сначала импортируйте свои данные из файла csv:
data = np.genfromtxt("data1.csv", delimiter=',') x_train=data[:,0] y_train=data[:,1] m=x_train.shape[0]
ознакомиться с данными:
print(f"x_tarin={x_train}") print((f"y_train={y_train}")) print(f"number of training examples= {m}")
установить начальные значения для параметров w, b, alpha и o=iterations
w=0 b=0 # alpha=0.02e-2 alpha=0.02 iterations=1000
запустите градиентный спуск, чтобы обновить параметры:
final_w,final_b,j_history,p_history=gradient_descent(x_train,y_train,w,b,alpha,iterations,compute_cost,compute_derivative)
вычислите свою модель и постройте данные и функцию стоимости:
fx=compute_model_output(x_train,final_w,final_b) represent_data(x_train,y_train,fx) plot_cost(j_history)
сделать прогноз:
print(f"1000 sqft house prediction {final_w*300 + final_b} Thousand dollars")
И все, спасибо за прочтение, вы можете проверить код проекта на gitlab