機器學習_最小二乘法,線性迴歸與邏輯迴歸
1. 線性迴歸
線性迴歸是利用數理統計中迴歸分析,來確定兩種或兩種以上變數間相互依賴的定量關係的一種統計分析方法。
直觀地說,在二維情況下,已知一些點的X,Y座標,統計條件X與結果Y的關係,畫一條直線,讓直線離所有點都儘量地近(距離之和最小),用直線抽象地表達這些點,然後對新的X預測新的Y。具體實現一般使用最小二乘法。
線性迴歸的優點是理解和計算都相對簡單,缺點是無法解決非線性問題。
2. 最小二乘法
1) 原理
最小二乘法(ordinary least squares,簡稱OLS)的核心就是保證所有資料偏差的平方和最小(“平方”的在古時侯的稱謂為“二乘”)。
如果有一個變數,我們用直線擬合一些點,直線方是y’=ax+b,每點偏差是y-y’,其中y是實際值,y’是估計值。sum((y-y’)2)最小時,直線擬合最好。上試代入y’,可得M=sum((y-(ax+b))
假設有兩個變數(多元迴歸)y’=w0+w1x1+w2x2,就變成了一個三維的問題,同樣也用誤差平方最小的方法M=sum((y’-(w0+w1x1+w2x2))^2),M對w0,w1,w2的偏導為0處是極值,然後解出w0,w1,w2。更多元的情況見下面的公式推導。
預測時,用迴歸係數乘以輸入值,再將結果加在一起就得到了預測值,一般用矩陣乘法實現。
2) 公式推導
通過矩陣運算求解迴歸係數的W={w0,w1,w2…}
3. 線性迴歸程式碼實現
注意:迴歸係數的個數應該比屬性多一個,用於表示截距,在sklearn中也是這樣,只不過截距相關的放在intercept_中,其它放在coef_中。# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt # 訓練 def standRegres(xArr,yArr): m,n = np.shape(xArr) xMat = np.mat(np.ones((m, n+1))) # 加第一列設為1,為計算截距 x = np.mat(xArr) xMat[:,1:n+1] = x[:,0:n]; yMat = np.mat(yArr).T xTx = xMat.T*xMat if np.linalg.det(xTx) == 0.0: print("This matrix is sigular, cannot do inverse") #行列式的值為0,無逆矩陣 return ws = xTx.I*(xMat.T*yMat) return ws # 預測 def predict(xArr, ws): m,n = np.shape(xArr) xMat = np.mat(np.ones((m, n+1))) # 加第一列設為1, 為計算截距 x = np.mat(xArr) xMat[:,1:n+1] = x[:,0:n]; return xMat*ws if __name__ == '__main__': x = [[1], [2], [3], [4]] y = [4.1, 5.9, 8.1, 10.1] ws = standRegres(x,y) print(ws) print(predict([[5]], ws)) # 畫圖 plt.scatter(x, y, s=20) yHat = predict(x, ws) plt.plot(x, yHat, linewidth=2.0, color='red') plt.show()
4. 邏輯迴歸
邏輯迴歸,也叫邏輯斯蒂迴歸,logistic regression。
有監督學習常分成:分類和迴歸,不要一聽xx迴歸,以為就是預測具體值了,這裡的“邏輯迴歸”其實是個分類的方法。之所以叫邏輯迴歸,是因為最常見用它處理二分類問題,即分類為0或1(邏輯值)。如圖所示,它是用一條直線,將例項分類。
與線性迴歸不同的只是這裡的Y是分類0或1,而不是具體數值。所以它叫廣義線性模型。
把具體資料對應成0,1的方法是sigmoid,sigmoid函式只能分兩類,而softmax能分多類,softmax是sigmoid的擴充套件。
5. Sigmoid函式
Sigmoid函式,就是S型函式,這就是一個數值和邏輯值間轉換的工具,如下圖示,它把X從負無窮到正無窮對映到Y的0-1之間。很多時候需要求極值,而0,1分類不是連續的,不可導,所以用一個平滑的函式擬合邏輯值,因為用了它,所以這叫邏輯迴歸。
Sigmoid技術文章定時推送
請關注公眾號:演算法學習分享