1、線性迴歸算法的原理算法
迴歸是基於已有數據對新的數據進行預測,好比預測股票走勢。這裏咱們主要講簡單線性迴歸。基於標準的線性迴歸,能夠擴展出更多的線性迴歸算法。 機器學習
線性迴歸就是可以用一個直線較爲精確地描述數據之間的關係,這樣當出現新的數據的時候,就可以預測出一個簡單的值。函數
線性迴歸的模型形如:學習
線性迴歸得出的模型不必定是一條直線:優化
(1)在只有一個變量的時候,模型是平面中的一條直線;spa
(2)有兩個變量的時候,模型是空間中的一個平面;code
(3)有更多變量時,模型將是更高維的。orm
線性迴歸模型有很好的可解釋性,能夠從權重W直接看出每一個特徵對結果的影響程度。線性迴歸適用於X和y之間存在線性關係的數據集,可使用計算機輔助畫出散點圖來觀察是否存在線性關係。咱們嘗試使用一條直線來擬合數據,使全部點到直線的距離之和最小。blog
實際上,線性迴歸中一般使用殘差平方和,即點到直線的平行於y軸的距離而不用垂線距離,殘差平方和除以樣本量n就是均方偏差。均方偏差做爲線性迴歸模型的損失函數(cost function)。使全部點到直線的距離之和最小,就是使均方偏差最小化,這個方法叫作最小二乘法。ip
損失函數公式:
由於
最後經過求解,獲得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)