一、線性回歸算法的原理
回歸是基於已有數據對新的數據進行預測,比如預測股票走勢。這里我們主要講簡單線性回歸。基於標准的線性回歸,可以擴展出更多的線性回歸算法。
線性回歸就是能夠用一個直線較為精確地描述數據之間的關系,這樣當出現新的數據的時候,就能夠預測出一個簡單的值。
線性回歸的模型形如:
線性回歸得出的模型不一定是一條直線:
(1)在只有一個變量的時候,模型是平面中的一條直線;
(2)有兩個變量的時候,模型是空間中的一個平面;
(3)有更多變量時,模型將是更高維的。
線性回歸模型有很好的可解釋性,可以從權重W直接看出每個特征對結果的影響程度。線性回歸適用於X和y之間存在線性關系的數據集,可以使用計算機輔助畫出散點圖來觀察是否存在線性關系。我們嘗試使用一條直線來擬合數據,使所有點到直線的距離之和最小。
實際上,線性回歸中通常使用殘差平方和,即點到直線的平行於y軸的距離而不用垂線距離,殘差平方和除以樣本量n就是均方誤差。均方誤差作為線性回歸模型的損失函數(cost function)。使所有點到直線的距離之和最小,就是使均方誤差最小化,這個方法叫做最小二乘法。
損失函數公式:
因為
最后通過求解,得到w及b的計算公式分別如下:
,
推理過程:
假設我們找到了最佳擬合的直線方程 : ,
則對每一個樣本點 ,根據我們的直線方程,預測值為:
,其對應的真值為
。
我們希望 和
的差距盡量小,這里我們用
表達
和
的距離,
考慮所有樣本則為:
我們的目標是使 盡可能小,而
,所以我們要找到 a 、b ,使得
盡可能小。
被稱為損失函數或效用函數。
通過分析問題,確定問題的損失函數或效用函數,通過最優化損失函數或者效用函數,獲得機器學習的模型,這是參數學習算法的一般套路。
求損失函數可轉化為典型的最小二乘法問題: 最小化誤差的平方。
最小二乘法的求解過程:
目標:找到 a 、b ,使得 盡可能小。
一般過程:

其中第


線性模型通過建立線性組合進行預測。我們的假設函數為:

其中

令








損失函數為均方誤差,即

最小二乘法求解參數,損失函數



令


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)