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

1、線性迴歸算法的原理算法

  迴歸是基於已有數據對新的數據進行預測,好比預測股票走勢。這裏咱們主要講簡單線性迴歸。基於標準的線性迴歸,能夠擴展出更多的線性迴歸算法。 機器學習

  線性迴歸就是可以用一個直線較爲精確地描述數據之間的關係,這樣當出現新的數據的時候,就可以預測出一個簡單的值。函數

  線性迴歸的模型形如:學習

                  

  線性迴歸得出的模型不必定是一條直線:優化

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

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

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

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

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

  損失函數公式:

              由於  

  最後經過求解,獲得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
 
2、算法優缺點
   優勢:
    (1)思想簡單,實現容易。建模迅速,對於小數據量、簡單的關係頗有效;
    (2)是許多強大的非線性模型的基礎。
    (3)線性迴歸模型十分容易理解,結果具備很好的可解釋性,有利於決策分析。
    (4)蘊含機器學習中的不少重要思想。
    (5)能解決迴歸問題。
  缺點:
    (1)對於非線性數據或者數據特徵間具備相關性多項式迴歸難以建模.
    (2)難以很好地表達高度複雜的數據。
3、代碼實現
  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)

  

相關文章
相關標籤/搜索