從最簡單的線性回歸開始。
線性回歸求參數(shù)w和b瘸味,有直接快速的最小二乘法宫仗,但是這里用到的是梯度下降法。
設(shè)損失函數(shù)為平方損失函數(shù)旁仿,即所有預(yù)測y值與訓(xùn)練真實y值之差的平方之和藕夫。
那么即可根據(jù)梯度下降公式a = a - η*(?L/?a) 來更新參數(shù)。
注意,學(xué)習(xí)速率η過大會導(dǎo)致震蕩而不收斂毅贮;過小則會導(dǎo)致收斂過慢办悟。
代碼如下。
import numpy as np
class Linear_Regression(object):
def __init__(self, learning_rate=0.001, max_iter=1000, init_w=0.0, init_b=0.0):
self.learning_rate = learning_rate
self.max_iter = max_iter
self.w = init_w
self.b = init_b
def fit(self, train_X, train_Y):
for i in range(self.max_iter):
predict_Y = self.w * train_X + self.b
loss_a = np.sum(np.square(train_Y - predict_Y)) #更新參數(shù)前的損失
dldw = np.sum((train_Y - predict_Y) * (-1) * train_X) #損失函數(shù)對參數(shù)w求導(dǎo)
dldb = np.sum((train_Y - predict_Y) * (-1)) #損失函數(shù)對參數(shù)b求導(dǎo)
temp_w = self.w - self.learning_rate * dldw #梯度下降更新參數(shù)w
temp_b = self.b - self.learning_rate * dldb #梯度下降更新參數(shù)b
predict_Y = temp_w * train_X + temp_b
loss_b = np.sum(np.square(train_Y - predict_Y)) #更新參數(shù)后的損失
if loss_b - loss_a > 0:
break #如果更新參數(shù)后損失變大了, 說明要么已經(jīng)收斂, 要么學(xué)習(xí)速率過大出現(xiàn)震蕩
else:
self.w = temp_w #否則, 確認(rèn)本次參數(shù)更新
self.b = temp_b
def get_parameters(self):
print("w = %.3f, b = %.3f"%(self.w, self.b))
return self.w, self.b
def predict(self, test_X):
predict_Y = self.w * test_X + self.b
print(predict_Y)
return predict_Y