機器學習--線性回歸算法的原理及優缺點


一、線性回歸算法的原理

  回歸是基於已有數據對新的數據進行預測,比如預測股票走勢。這里我們主要講簡單線性回歸。基於標准的線性回歸,可以擴展出更多的線性回歸算法。 

  線性回歸就是能夠用一個直線較為精確地描述數據之間的關系,這樣當出現新的數據的時候,就能夠預測出一個簡單的值。

  線性回歸的模型形如:

                  

  線性回歸得出的模型不一定是一條直線:

    (1)在只有一個變量的時候,模型是平面中的一條直線;

    (2)有兩個變量的時候,模型是空間中的一個平面;

    (3)有更多變量時,模型將是更高維的。

  線性回歸模型有很好的可解釋性,可以從權重W直接看出每個特征對結果的影響程度。線性回歸適用於X和y之間存在線性關系的數據集,可以使用計算機輔助畫出散點圖來觀察是否存在線性關系。我們嘗試使用一條直線來擬合數據,使所有點到直線的距離之和最小。

  實際上,線性回歸中通常使用殘差平方和,即點到直線的平行於y軸的距離而不用垂線距離,殘差平方和除以樣本量n就是均方誤差。均方誤差作為線性回歸模型的損失函數(cost function)。使所有點到直線的距離之和最小,就是使均方誤差最小化,這個方法叫做最小二乘法

  損失函數公式:

              因為  

  最后通過求解,得到w及b的計算公式分別如下:

                 ,  

 

   推理過程:

 

                                             

   假設我們找到了最佳擬合的直線方程 : 

    則對每一個樣本點    ,根據我們的直線方程,預測值為:,其對應的真值為   

  我們希望    和   的差距盡量小,這里我們用   表達   和  的距離,

    考慮所有樣本則為:

  我們的目標是使   盡可能小,而    ,所以我們要找到  a 、b  ,使得  盡可能小。

    被稱為損失函數或效用函數。

 

  通過分析問題,確定問題的損失函數或效用函數,通過最優化損失函數或者效用函數,獲得機器學習的模型,這是參數學習算法的一般套路。

  求損失函數可轉化為典型的最小二乘法問題: 最小化誤差的平方。

    最小二乘法的求解過程:

                   目標:找到  a 、b  ,使得  盡可能小。

        

           

       

                 

               

                  

                  

                   

                 

                      

                                

                

                            

                   

            

  一般過程:

               假設輸入數據集D有n個樣本,d個特征,則:
                          D=\lgroup{ (x^{(1)},y_1) , (x^{(2)},y_2) ...(x^{(n)},y_n) } \rgroup
              其中第i個樣本表示為:
                         (x^{(i)},y_i)=(x_1^{(i)},x_2^{(i)},...x_d^{(i)},y_i)
              線性模型通過建立線性組合進行預測。我們的假設函數為:
                          h_\theta(x_1,x_2,...x_d)=\theta_0+\theta_1x_1+\theta_2x_2+...+\theta_dx_d \qquad(1)
                                   其中\theta_0,\theta_1...\theta_d為模型參數。
              令x_0=1x^{(i)}=(x_1^{(i)},x_2^{(i)},...x_d^{(i)})為行向量,令
                               X=\begin{bmatrix} x^{(0)}\\ x^{(1)}\\ \vdots\\ x^{(n)} \end{bmatrix}_{n \times d}, \theta=\begin{bmatrix} \theta_0\\ \theta_1\\ \vdots\\ \theta_d \end{bmatrix}_{d \times 1} , Y=\begin{bmatrix} y_1\\ y_2\\ \vdots\\ y_n \end{bmatrix}_{n \times 1}
                              Xn \times d維矩陣,\thetad \times 1維向量,則假設函數(1)式可表示為:
                                                                   h_\theta(X)=X\theta
                             損失函數為均方誤差,即
                                            J(\theta)=\frac{1}{2} (X\theta - Y)^T (X\theta - Y)
                           最小二乘法求解參數,損失函數J(\theta)\theta求導:
                                                  \nabla J(\theta)=2X^T(X\theta-Y)
                           令\nabla J(\theta)=0,得
                                                            \theta=(X^TX)^{-1}X^TY
 
二、算法優缺點
   優點:
    (1)思想簡單,實現容易。建模迅速,對於小數據量、簡單的關系很有效;
    (2)是許多強大的非線性模型的基礎。
    (3)線性回歸模型十分容易理解,結果具有很好的可解釋性,有利於決策分析。
    (4)蘊含機器學習中的很多重要思想。
    (5)能解決回歸問題。
  缺點:
    (1)對於非線性數據或者數據特征間具有相關性多項式回歸難以建模.
    (2)難以很好地表達高度復雜的數據。
三、代碼實現
  1.簡單的線性回歸算法
import numpy as np
import matplotlib.pyplot as plt

x=np.array([1,2,3,4,5],dtype=np.float)
y=np.array([1,3.0,2,3,5])
plt.scatter(x,y)

x_mean=np.mean(x)
y_mean=np.mean(y)
num=0.0
d=0.0
for x_i,y_i in zip(x,y):
    num+=(x_i-x_mean)*(y_i-y_mean)
    d+=(x_i-x_mean)**2
    a=num/d
    b=y_mean-a*x_mean
y_hat=a*x+b

plt.figure(2)
plt.scatter(x,y)
plt.plot(x,y_hat,c='r')
x_predict=4.8
y_predict=a*x_predict+b
print(y_predict)
plt.scatter(x_predict,y_predict,c='b',marker='+')

  輸出結果:

                          

  2.基於sklearn的簡單線性回歸

import numpy as np 
import matplotlib.pyplot as plt  
from sklearn.linear_model import LinearRegression  # 線性回歸


# 樣本數據集,第一列為x,第二列為y,在x和y之間建立回歸模型
data=[
    [0.067732,3.176513],[0.427810,3.816464],[0.995731,4.550095],[0.738336,4.256571],[0.981083,4.560815],
    [0.526171,3.929515],[0.378887,3.526170],[0.033859,3.156393],[0.132791,3.110301],[0.138306,3.149813],
    [0.247809,3.476346],[0.648270,4.119688],[0.731209,4.282233],[0.236833,3.486582],[0.969788,4.655492],
    [0.607492,3.965162],[0.358622,3.514900],[0.147846,3.125947],[0.637820,4.094115],[0.230372,3.476039],
    [0.070237,3.210610],[0.067154,3.190612],[0.925577,4.631504],[0.717733,4.295890],[0.015371,3.085028],
    [0.335070,3.448080],[0.040486,3.167440],[0.212575,3.364266],[0.617218,3.993482],[0.541196,3.891471]
]


#生成X和y矩陣
dataMat = np.array(data)
X = dataMat[:,0:1]   # 變量x
y = dataMat[:,1]   #變量y


# ========線性回歸========
model = LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
model.fit(X, y)   # 線性回歸建模
print('系數矩陣:\n',model.coef_)
print('線性回歸模型:\n',model)
# 使用模型預測
predicted = model.predict(X)

plt.scatter(X, y, marker='x')
plt.plot(X, predicted,c='r')

plt.xlabel("x")
plt.ylabel("y")

輸出結果:

     系數矩陣:
     [ 1.6314263]
    線性回歸模型:
     LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM