機器學(xué)習(xí)筆記 線性回歸 2018-07-24

從最簡單的線性回歸開始。
線性回歸求參數(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    #否則, 確認本次參數(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容