lin python get stat linspace oms mach 實現 all

在《機器學習---線性回歸(Machine Learning Linear Regression)》一文中,我們主要介紹了最小二乘線性回歸模型以及簡單地介紹了梯度下降法。現在,讓我們來實踐一下吧。

先來回顧一下用最小二乘法求解參數的公式:技術分享圖片

(其中:技術分享圖片技術分享圖片技術分享圖片

再來看一下隨機梯度下降法(Stochastic Gradient Descent)的算法步驟:

技術分享圖片

除了算法中所需的超參數α(學習速率,代碼中寫為lr)和epsilon(誤差值),我們增加了另一個超參數epoch(叠代次數)。此外,為方便起見,在代碼中我們用w代替θ。

我們自己創建了一組數據,是最簡單的一元線性回歸,以便畫圖展示。由於整個過程基本上就是上述算法步驟的重復,故在此次不一一分解了,請自行查看完整代碼。至於學習速率alpha的選擇,請查看:如何選擇梯度下降法中的學習速率α(Gradient Descent Alpha)。

完整代碼如下:

import matplotlib.pyplot as plt
fig,ax=plt.subplots()
import numpy as np

#創建數據
x=np.linspace(0,100,10).reshape(10,1)
rng=np.random.RandomState(4)
noise=rng.randint(-10,10,size=(10,1))*4
y=4*x+4+noise

class Linear_Regression:
    def __init__(self):
        self._w = None

    def fit(self, X, y, lr=0.01, epsilon=0.01, epoch=1000):
        #訓練數據
        #將輸入的X,y轉換為numpy數組
        X, y = np.asarray(X, np.float32), np.asarray(y, np.float32)
        #給X增加一列常數項
        X=np.hstack((X,np.ones((X.shape[0],1))))
        #初始化w
        self._w = np.zeros((X.shape[1],1)) 
        
        for _ in range(epoch):
            #隨機選擇一組樣本計算梯度
            random_num=np.random.choice(len(X))
            x_random=X[random_num].reshape(1,2)
            y_random=y[random_num]
        
            gradient=(x_random.T)*(np.dot(x_random,self._w)-y_random)
            
            #如果收斂,那麽停止叠代
            if (np.abs(self._w-lr*gradient)<epsilon).all():    
                break
            #否則,更新w
            else:
                self._w =self._w-lr*gradient          
        
        return self._w
        
    def print_results(self,w):
        print("參數w:{}".format(w))
        print("回歸擬合線:y={}x+{}".format(w[0],w[1]))

    def draw_pics(self,X,w):
       #畫出原始數據
       ax.scatter(X,y,marker="o")
       ax.set_xlabel("x")
       ax.set_ylabel("y")
        
       #畫出擬合線
       line_x=np.linspace(0,100,10)
       line_y=w[0]*line_x+w[1]
       ax.plot(line_x,line_y) 
        
    def predict(self,x):
        x=np.asarray(x, np.float32)
        x=x.reshape(x.shape[0],1)
        x=np.hstack((x,np.ones((x.shape[0],1))))
        return np.dot(x,self._w)

if __name__=="__main__":
    Regression=Linear_Regression()
    w=Regression.fit(x,y,lr=0.0001,epsilon=0.001,epoch=20)
    Regression.print_results(w)
    Regression.draw_pics(x,w)

運行結果:

參數w:[[3.95933261]
 [0.06683964]]
回歸擬合線:y=[3.95933261]x+[0.06683964]

畫出的擬合線:

技術分享圖片

機器學習---用python實現最小二乘線性回歸並用隨機梯度下降法求解 (Machine Learning Least Squares Linear Regression Application SGD)