算法模型---迴歸模型

本文參考線性迴歸之最小二乘法線性迴歸淺談html

線性迴歸模型與最小二乘法

一、基本概念

線性迴歸假設因變量與自變量之間存在線性關係,因變量可經過自變量線性疊加而獲得,即因變量和自變量之間可用以下方式表示。
python

y = w 0 + w 1 x 1 + w 2 x 2 + . . . + w n x n

式中 x 1 , . . . , x n 爲自變量, w 1 , . . . , w n 爲權重係數, w 0 爲偏置。
線性迴歸就是要解決如何利用樣本求取 w 1 , . . . , w n w 0 ,擬合出上述表達式,得到最佳直線的問題。最經常使用的就是最小二乘法。
最小二乘法:最佳擬合線下,將已知樣本的自變量代入擬合直線,獲得的觀測值與實際值之間的偏差平方和最小。web

二、一元線性迴歸

爲了好理解,先從簡單的狀況開始,即一元線性迴歸。算法

2.一、利用方程組來解係數

假設因變量和自變量可用以下函數表示:
y = a x + b 對於任意樣本點 ( x i , y i ) ,有偏差 e = a x i + b y i ,偏差平方和 1 n e 2 = 1 n ( a x i + b y i ) 2
那什麼樣的a和b會使得偏差平方和最小呢?
上面是求最值的問題,咱們會想到導數和偏導數,這裏在偏導數等於0的地方能取到極值,而且也是最值。
分別對a和b求偏導獲得以下表達式:
sql

(1) a = i = 1 n 2 x i ( a x i + b y i ) (2) b = i = 1 n 2 ( a x i + b y i )

經過對二元一次方程組
(3) i = 1 n 2 x i ( a x i + b y i ) = 0 (4) i = 1 n 2 ( a x i + b y i ) = 0

進行求解,能夠獲得以下解:
(5) a = n i = 1 n x i y i i = 1 n x i i = 1 n y i n i = 1 n x i 2 ( i = 1 n x i ) 2 (6) b = i = 1 n x i 2 y i i = 1 n x i i = 1 n x i y i n i = 1 n x i 2 ( i = 1 n x i ) 2

上面的數學過程用代碼表示以下:

import numpy as np
import matplotlib.pyplot as plt

def calcAB(x,y):
    n = len(x)
    sumX, sumY, sumXY, sumXX = 0, 0, 0, 0
    for i in range(0, n):
        sumX += x[i]
        sumY += y[i]
        sumXX += x[i] * x[i]
        sumXY += x[i] * y[i]
    a = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX)
    b = (sumXX * sumY - sumX * sumXY) / (n * sumXX - sumX * sumX)
    return a, b
xi = [1,2,3,4,5,6,7,8,9,10]
yi = [10,11.5,12,13,14.5,15.5,16.8,17.3,18,18.7]
a,b=calcAB(xi,yi)
print("y = %10.5fx + %10.5f" %(a,b))
x = np.linspace(0,10)
y = a * x + b
plt.plot(x,y)
plt.scatter(xi,yi)
plt.show()

數據散點和擬合的直線以下:
這裏寫圖片描述apache

2.二、利用矩陣的方法來求解係數

函數 y = a x + b
也能夠表示成以下的形式
y = w 0 + w 1 x = W T x = ( x W ) T 數組

式中 W = [ w 0 , w 1 ] T , x = [ 1 , x i ] T 網絡

對於n個樣本,此時損失函數(即偏差平方和)爲:
數據結構

L = i = 1 n ( y i W T x i ) 2

假如咱們將樣本表示成以下形式:
app

Y = [ y 1 , y 2 , . . . , y n ] T

X = [ 1 , x 1 1 , x 2 . . . 1 , x n ]


(7) Y X W = [ y 1 ( w 0 + w 1 x 1 ) y 2 ( w 0 + w 1 x 1 ) . . . y n ( w 0 + w 1 x n ) ] (8) ( Y X W ) T = [ y 1 ( w 0 + w 1 x 1 ) , y 2 ( w 0 + w 1 x 1 ) , . . . , y n ( w 0 + w 1 x n ) ] (9) ( Y X W ) T ( Y X W ) = i = 1 n ( y i W T X i ) 2 (10) = L

進一步,能夠將損失函數表示以下形式:
L = Y T Y w T Y Y X W + W T X T X W

L對W求導,可獲得
α L α w = 2 Y T X + 2 W T X T X

令導數爲0,則有
w T X T X = Y T X

從而
( w T X T X ) T = ( Y T X ) T

進而能夠求得
W = ( X T X ) 1 X T Y

上面的數學過程用代碼表示以下:

x = [1,2,3,4,5,6,7,8,9,10]
y = [10,11.5,12,13,14.5,15.5,16.8,17.3,18,18.7]
X = np.vstack([np.ones(len(x)),x]).T
Y = np.array(y).T
W=np.dot(np.matrix(np.dot(X.T,X))**-1,np.dot(X.T,Y))
yi=np.dot(X,W.T)#這裏公式裏是不須要轉置的,但因爲矩陣運算時W自動保存成一行多列的矩陣,因此多轉置一下,配合原公式的計算。
print(X)
print(Y)
print(W)
print(yi)#擬合出的預測點
plt.plot(x,y,'o',label='data',markersize=10)
plt.plot(x,yi,'r',label='line')
plt.show()

結果以下:

X=
[[ 1. 1.] [ 1. 2.] [ 1. 3.] [ 1. 4.] [ 1. 5.] [ 1. 6.] [ 1. 7.] [ 1. 8.] [ 1. 9.] [ 1. 10.]]
Y=
[ 10.   11.5  12.   13.   14.5  15.5  16.8  17.3  18.   18.7]
W=
[[ 9.30666667 0.98606061]]
yi=
[[ 10.29272727] [ 11.27878788] [ 12.26484848] [ 13.25090909] [ 14.2369697 ] [ 15.2230303 ] [ 16.20909091] [ 17.19515152] [ 18.18121212] [ 19.16727273]]

這裏寫圖片描述

三、多元線性迴歸

將一元線性迴歸及迴歸係數的計算公式推廣到多元線性迴歸也是同樣。
損失函數可表示以下:

L = i = 1 m ( y i W T x i ) 2

對L求導有
L W = 2 i = 1 m ( y i W T x i ) ( 1 ) ( W T x i ) W = 2 i = 1 m ( W T x i y i ) ( W T x i ) W

不防令 W T x i y i = e i ,則上式可化簡爲
L W = 2 i = 1 m e i ( W T x i ) W = 2 i = 1 m e i ( w 0 + w 1 x i 1 + + w p x i p ) W

先計算 L W 各份量
L w 0 = 2 i = 1 m e i ( w 0 + w 1 x i 1 + + w p x i p ) w 0 = 2 i = 1 m e i 1 L w 1 = 2 i = 1 m e i ( w 0 + w 1 x i 1 + + w p x i p ) w 1 = 2 i = 1 m e i x i 1 = = L w p = 2 i = 1 m e i ( w 0 + w 1 x i 1 + + w p x i p ) w p = 2 i = 1 m e i x i p

L W 可寫成
1 2 L W = [ i = 1 m e i 1 i = 1 m e i x i 1 i = 1 m e i x i p ] = [ e 1 + e x + + e m e 1 x 11 + e 2 x 21 + + e m x m 1 e 1 x 1 p + e 2 x 2 p + + e m x m p ] = [ 1 + x 11 + x 12 + + x 1 p 1 + x 21 + x 22 + + x 2 p 1 + x m 1 + x m 2 + + x m p ] T [ e 1 e m ]


[ 1 , x 11 , x 12 , , x 1 p 1 , x 21 , x 22 , , x 2 p 1 , x m 1 , x m 2 , , x m p ] = X

[ e 1 e m ] = E


1 2 L W = X T E

3.一、當矩陣滿秩時(數據點的個數大於x的維度時)

令導數爲0的方程組有足夠的已知條件求解,令導數爲0,則有

X T E = 0


E = [ e 1 e m ] = [ w 0 + w 1 x 11 + + w p x 1 p y 1 w 0 + w 1 x m 1 + + w p x m p y m ] = [ w 0 + w 1 x 11 + + w p x 1 p w 0 + w 1 x m 1 + + w p x m p ] [ y 1 y m ] = X W Y

則有
X T ( X W Y ) = 0 X T X W X T Y = 0 X T X W = X T Y

從而有
W = ( X T X ) 1 X T Y

3.二、當矩陣不滿秩時

此時利用導數爲0方程組個數不夠,不可以所有解出參數,
可利用梯度降低法求近似最優解

W = W α L W = W 2 α X T E

而梯度降低步長初始化可隨機設置,於是上式不防寫成
W = W α L W = W α X T E

線性迴歸的並行化

pyspark.ml中的線性迴歸

#-*-coding:utf-8-*-

from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.ml.linalg import Vectors
from pyspark.ml.regression import LinearRegression

if __name__=="__main__":
    sc=SparkContext(appName="myApp")
    spark=SparkSession.builder.enableHiveSupport().getOrCreate()
    df = spark.createDataFrame([(1.0, 2.0, Vectors.dense(1.0)),(0.0, 2.0, Vectors.sparse(1, [], []))], ["label", "weight", "features"])
    lr = LinearRegression(maxIter=5, regParam=0.0, solver="normal", weightCol="weight")
    model = lr.fit(df)
    print(model.coefficients)
    print(model.intercept)
    test0 = spark.createDataFrame([(Vectors.dense(-1.0),)], ["features"])
    print(model.transform(test0).head().prediction)

spark中使用迴歸方法案例

參考《算法模型—迴歸模型—spark迴歸案例》

局部加權迴歸(LWR)

來源:https://www.cnblogs.com/sumai/p/5211558.html

RANSAC擬合高魯棒性迴歸

來源:
這是對迴歸分析的提高,使得模型具備更好的抗干擾能力。
RANSAC(Random Sample Consenus),它是根據一組包含異常數據的樣本數據集,計算出數據的數學模型參數,獲得有效樣本數據的算法。使用數據的一個子集(內點,Ran)來進行迴歸模型的擬合。

RANSAC算法的工做流程以下:
一、從數據集中隨機抽取樣本構建內點集合擬合模型。
二、使用剩餘的數據對上一步獲得的模型進行測試,並將落在預約公差範圍內的樣本點增長到內點集合中。
三、使用所有的內點集合數據再次進行模型的擬合。
四、使用內點集合來估計模型的偏差。
五、若是模型性能達到了用戶設定的特定閾值或者迭代的次數達到了預約的次數,則算法終止,不然重複從第一步開始。

from sklearn.linear_model import RANSACRegressor
'''
max_trials設置最大迭代次數爲100
min_samples隨機抽取內點的最小樣本數爲50
residual_metric計算擬合曲線與樣本點的距離的絕對值
residual_threshold設置預約公差,小於這個值才被加入到內點集合
'''
ransac = RANSACRegressor(LinearRegression(),max_trials=100,min_samples=50,
                        residual_metric=lambda x:np.sum(np.abs(x),axis=1),
                        residual_threshold=5.0,random_state=0)
ransac.fit(X,Y)
inlier_mask = ransac.inlier_mask_
outlier_mask = np.logical_not(inlier_mask)
line_X = np.arange(3,10,1)
line_y_ransac = ransac.predict(line_X[:,np.newaxis])
plt.scatter(X[inlier_mask],Y[inlier_mask],c="blue",marker="o",label="內點")
plt.scatter(X[outlier_mask],Y[outlier_mask],c="lightgreen",marker="s",label="異常值")
plt.plot(line_X,line_y_ransac,color="red")
plt.xlabel("房間數")
plt.ylabel("房價")
plt.legend(loc="upper left")
plt.show()

線性迴歸模型性能的評估

一、殘差圖
經過繪製殘差圖可以直觀的發現真實值與預測值之間的差別或垂直距離,經過真實值與預測值之間的差別來對迴歸模型進行評估。殘差圖能夠做爲圖形分析方法,能夠對迴歸模型進行評估、獲取模型的異常值,同時還能夠檢查模型是不是線性的,以及偏差是否隨機分佈。

最好的模型預測結果的殘差爲0,在實際應用中,這種狀況是不可能發生的。可是,對於一個好的模型,咱們指望偏差是隨機分佈的,同時殘差也是在y=0水平線附近波動。經過殘差圖也能夠發現異常值,偏離y=0比較遠的點。
二、均方偏差(MSE)
均方偏差(Mean Squared Error,MSE):真實值與預測值差的平方和的平均值,計算公式以下

M S E = 1 n i = 1 n ( y i y ^ i ) 2

from sklearn.metrics import mean_squared_error
print("train MSE:%.3f"%mean_squared_error(train_y,train_y_pred))
#train MSE:46.037
print("test MSE:%.3f"%mean_squared_error(test_y,test_y_pred))
#test MSE:35.919

除了均方偏差以外,還能夠經過絕對值偏差來衡量模型的性能。
三、決定係數R^2
在某些狀況下決定係數(coefficient of determination) R 2 很是重要,能夠將其當作一個MSE標準化版本, R 2 是模型捕獲響應方差的分數。對於訓練集來講, R 2 的取值範圍爲[0,1],對於測試集來講, R 2 取值可能爲負。若是R^2越接近與1代表其模型的性能越好。 R 2 計算公式以下:

R 2 = 1 1 n i = 1 n ( y i y ^ i ) 2 1 n i = 1 n ( y i μ i ) 2 = 1 M S E v a r ( y )

from sklearn.metrics import r2_score
print("train r2:%.3f"%r2_score(train_y,train_y_pred))
#train r2:0.473
print("test r2:%.3f"%r2_score(test_y,test_y_pred))
#test r2:0.485

線性迴歸優缺點

優勢

  • 能夠快速建模,特別適用於所要建模的關係不是特別複雜而且數據量不大。
  • 線性迴歸簡單且易於理解,有利於商業決策。

缺點

  • 對於非線性數據進行多項式迴歸設計可能比較困難,由於必須具備特徵變量之間關係和數據結構的一些信息。
  • 因爲上述緣由,當涉及到數據複雜度較高時,這些模型的性能不如其餘模型。

Generalized Linear Models ( 廣義線性模型 )

來源:apache官網中文翻譯
介紹sklearn中的廣義線性模型。
在整個模塊中,咱們指定coef_表明向量 w = ( w 1 , , w p ) , intercept_表明 w 0

Ordinary Least Squares ( 普通最小二乘法 )

LinearRegression類的成員函數 fit 以數組X和y爲輸入,並將線性模型的係數 w 存儲在其成員變量coef_中:

>>> from sklearn import linear_model
>>> reg = linear_model.LinearRegression()
>>> reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
>>> reg.coef_
array([ 0.5,  0.5])

然而,最小二乘的係數估計依賴於模型特徵項的獨立性。當特徵項相關而且設計矩陣X 的列近似的線性相關時,設計矩陣便接近於一個奇異矩陣,所以最小二乘估計對觀測點中的隨機偏差變得高度敏感,產生大的方差。例如,當沒有試驗設計的收集數據時,可能會出現這種多重共線性(multicollinearity )的狀況。
Ordinary Least Squares Complexity ( 普通最小二乘法複雜度 )
該方法經過對X進行 singular value decomposition ( 奇異值分解 ) 來計算最小二乘法的解。若是 X 是大小爲(n, p) 的矩陣,則該方法的複雜度爲o(np^2) ,假設 n p

Ridge Regression ( 嶺迴歸 )

嶺迴歸經過對係數的大小施加懲罰來解決普通最小二乘的一些問題。 ridge coefficients ( 嶺係數 ) 最小化一個帶罰項(就是咱們所說的正則項)的殘差平方和,

m i n w | | w T X y | | 2 2 + α | | w | | 2 2

這裏, α 0 是控制迴歸係數的複雜度參數: 值越大,迴歸係數越均勻,越存在過擬合的可能;值越大,迴歸係數越簡單,就量更多的係數接近0,泛化能力更強,所以係數變得對共線性變得更加魯棒,但擬合可能沒那麼好。

與其餘線性模型同樣,Ridge 類成員函數 fit 以數組X和y爲輸入,並將線性模型的係數 w 存儲在其成員變量coef_ 中:

>>> from sklearn import linear_model
>>> reg = linear_model.Ridge (alpha = .5)
>>> reg.fit ([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,
      normalize=False, random_state=None, solver='auto', tol=0.001)
>>> reg.coef_
array([ 0.34545455,  0.34545455])
>>> reg.intercept_
0.13636...

Ridge Complexity ( 嶺複雜性 )
這種方法與 Ordinary Least Squares ( 普通最小二乘方法 ) 的複雜度相同。
Setting the regularization parameter: generalized Cross-Validation ( 設置正則化參數:廣義交叉驗證 )

>>> from sklearn import linear_model
>>> reg = linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0])
>>> reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])      
RidgeCV(alphas=[0.1, 1.0, 10.0], cv=None, fit_intercept=True, scoring=None,
    normalize=False)
>>> reg.alpha_                                     
0.1

Lasso

Lasso 是估計稀疏係數的線性模型。它在一些狀況下是有用的,由於它傾向於使用具備較少迴歸係數的解決方案,有效地減小給定解決方案所依賴的變量的數量。爲此,Lasso 及其變體是 compressed sensing ( 壓縮感測領域 ) 的基礎。在某些條件下,它能夠恢復精確的非零權重集(參見 Compressive sensing: tomography reconstruction with L1 prior (Lasso) ( 壓縮感測:使用 L1 先驗( Lasso )進行斷層掃描重建 ) )。

在數學上,它由一個使用 L 1 先驗做爲正則化項的線性模型組成。最小化的目標函數是:

m i n s 1 2 n s a m p l e | | w T x y | | 2 2 + α | | w | | 1

所以,lasso estimate 解決了加上罰項 α | | w | | 1 的最小二乘法的最小化,其中, α 是常數, | | w | | 1 是迴歸係數的 L 1 範數,即迴歸係數各元素的絕對值之和。
Lasso 類中的實現使用座標降低做爲算法來擬合係數。查看 Least Angle Regression ( 最小角度迴歸 ) 用於另外一個實現:

>>> from sklearn import linear_model
>>> reg = linear_model.Lasso(alpha = 0.1)
>>> reg.fit([[0, 0], [1, 1]], [0, 1])
Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)
>>> reg.predict([[1, 1]])
array([ 0.8])

對於較低級別的任務也頗有用的是函數 lasso_path 來計算可能值的完整路徑上的係數。

注意

  • Feature selection with Lasso ( 功能套索和彈性網 )
    因爲 Lasso 迴歸生成稀疏模型,所以能夠用於實現特徵選擇,如 L1-based feature selection ( 基於 L1 的特徵選擇 ) 中所詳述的。

注意

  • Randomized sparsity ( 隨機稀釋 )
    對於特徵選擇或稀疏恢復,使用 Randomized sparse models ( 隨機稀疏模型 ) 可能頗有趣。

Setting regularization parameter ( 設置正則化參數 )
alpha 參數控制 degree of sparsity of the coefficients estimated ( 估計的係數的稀疏度 ) 。
Using cross-validation ( 使用交叉驗證 )

scikit-learn 經過交叉驗證來公開設置 Lasso alpha 參數的對象:LassoCV 和 LassoLarsCV 。 LassoLarsCV 是基於下面解釋的 Least Angle Regression ( 最小角度迴歸 ) 算法。
對於具備許多共線迴歸的高維數據集, LassoCV 最多見。然而, LassoLarsCV 具備探索更相關的 alpha 參數值的優勢,而且若是樣本數量與觀察次數相比很是小,則一般比 LassoCV 快。



Information-criteria based model selection ( 基於信息標準的模型選擇 )
估計器 LassoLarsIC 建議使用 Akaike 信息準則(AIC)和貝葉斯信息準則(BIC)。當使用 k-fold 交叉驗證時,正則化路徑只計算一次而不是 k + 1 次,因此找到 α 的最優值是一個計算上更便宜的替代方法。然而,這樣的標準須要對解決方案的自由度進行適當的估計,爲大樣本(漸近結果)導出,並假設模型是正確的,即數據其實是由該模型生成的。當問題條件差時,它們也傾向於打破(比樣本更多的特徵)。

Multi-task Lasso ( 多任務套索 )

MultiTaskLasso 是一個線性模型,它聯合估計多個迴歸問題的稀疏係數:y 是一個二維數組,shape(n_samples,n_tasks)。約束是所選的特徵對於全部的迴歸問題都是相同的,也稱爲 tasks ( 任務 )。
下圖比較了使用簡單 Lasso 或 MultiTaskLasso 得到的 W 中非零的位置。 Lasso 估計產生分散的非零,而 MultiTaskLasso 的非零是全列。


在數學上,它由一個線性模型組成,訓練有混合的 L 1 , L 2 以前的正則化。目標函數最小化是:

m i n s 1 2 n s a m p l e | | w T x y | | F r o 2 + α | | w | | 21

其中 Fro表示 Frobenius 規範:
| | A | | F r o = i j a i j 2

L 1 , L 2 混合形式以下:
| | A | | 21 = i j a i j 2

MultiTaskLasso 類中的實現使用座標降低做爲擬合係數的算法。

Elastic Net ( 彈性網 )

ElasticNet 是一種線性迴歸模型,以 L1 和 L2 組合爲正則化項。這種組合容許學習一個稀疏模型,其中不多的權重是非零的,如 Lasso ,同時仍然保持 Ridge 的正則化屬性。咱們使用 l1_ratio 參數控制 L1 和 L2 的凸組合。
當有多個相互關聯的特徵時,Elastic-net 是有用的。 Lasso 有可能隨機選擇其中之一,而 elastic-net 則極可能選擇二者。

Lasso 和 Ridge 之間的一個實際的優點是容許 Elastic-Net 繼承 Ridge 在一些旋轉下的穩定性。
在這種狀況下,最小化的目標函數

m i n s 1 2 n s a m p l e | | w T x y | | 2 2 + α ρ | | w | | 1 + α ( 1 ρ ) 2 | | w | | 2 2


ElasticNetCV 類可用於經過交叉驗證來設置參數 alpha( α )和 l1_ratio ( ρ )

Multi-task Elastic Net ( 多任務彈性網 )

MultiTaskElasticNet 是一個彈性網絡模型,能夠聯合估計多個迴歸問題的稀疏係數: Y 是 2D array,shape(n_samples, n_tasks)。constraint ( 約束 ) 是所選的特徵對於全部的迴歸問題都是相同的,也稱爲 tasks ( 任務 )。
目標函數最小化是:

m i n s 1 2 n s a m p l e | | w T x y | | F r o 2 + α ρ | | w | | 21 + α ( 1 ρ ) 2 | | w | | F r o 2

MultiTaskElasticNet 類中的實現使用座標降低做爲擬合係數的算法。
MultiTaskElasticNetCV 類可用於經過交叉驗證來設置參數 alpha( α ) 和l1_ratio( ρ )。

Least Angle Regression ( 最小角度迴歸 )

Least-angle regression ( 最小二乘迴歸 ) ( LARS ) 是由 Bradley Efron,Trevor Hastie,Iain Johnstone 和 Robert Tibshirani 開發的高維數據迴歸算法。
LARS 的優勢是:

  • p >> n 的狀況下(即,當維數顯著大於點數時)的數值效率較高
  • 它在計算上與正向選擇同樣快,而且具備與普通最小二乘法相同的複雜度。
  • 它產生一個完整的分段線性解決路徑,這在交叉驗證或相似的調試模型嘗試中頗有用。
  • 若是兩個變量與響應幾乎相等,那麼它們的係數應該以大體相同的速率增長。所以,算法的行爲就像直覺所指望的那樣,而且也更穩定。
  • 它很容易被修改成其餘估計器產生解決方案,如 Lasso 。

LARS 方法的缺點包括:

  • 由於 LARS 是基於對殘差進行迭代從新設計的,因此它彷佛對噪聲的影響特別敏感。 Weisberg 在 Efron 等人的討論部分詳細討論了這個問題。 (2004) Annals of Statistics article 。

LARS 模型可使用估計器 Lars 或其低級實現 lars_path 來使用。

LARS Lasso

LassoLars 是使用 LARS 算法實現的 lasso model ( 套索模型 ) ,與基於 coordinate_descent 的實現不一樣,這產生了精確的解,其做爲其係數範數的函數是分段線性的。

>>> from sklearn import linear_model
>>> reg = linear_model.LassoLars(alpha=.1)
>>> reg.fit([[0, 0], [1, 1]], [0, 1]) 
LassoLars(alpha=0.1, copy_X=True, eps=..., fit_intercept=True,
     fit_path=True, max_iter=500, normalize=True, positive=False,
     precompute='auto', verbose=False)
>>> reg.coef_   
array([ 0.717157...,  0.        ])

Lars 算法提供了沿着正則化參數的係數的完整路徑,幾乎是免費的,所以一個常見的操做包括使用函數 lars_path 檢索路徑。
Mathematical formulation ( 數學表達 )

該算法相似於 forward stepwise regression ( 前向逐步迴歸 ) ,而不是在每一個步驟中包含變量,估計參數在等於每一個與殘差相關的方向上增長。
代替給出向量結果,LARS 解決方案由表示參數向量的 L1 norm ( 範數 ) 的每一個值的解的曲線組成。完整係數路徑存儲在具備 size(n_features, max_features + 1) 的數組 coef_path_ 中。第一列始終爲零。

Orthogonal Matching Pursuit (OMP) ( 正交匹配追蹤(OMP) )

OrthogonalMatchingPursuit ( 正交匹配追蹤 ) 和 orthogonal_mp 實現了 OMP 算法,用於近似線性模型的擬合,並對非零係數(即 L 0 僞範數)施加約束。
做爲 Least Angle Regression ( 最小角度迴歸 ) 的前向特徵選擇方法,正交匹配追蹤能夠用固定數量的非零元素逼近最優解矢量:

a r g   m i n | | y X γ | | 2 2   s u b j e c t   t o   | | γ | | 0 n n o n e z e r o c o e f s

或者,正交匹配追蹤能夠針對特定錯誤而不是特定數量的非零係數。這能夠表示爲:
a r g   m i n | | γ | | 0   s u b j e c t   t o   | | y X γ | | 2 2 t o l

OMP 基於一個貪心算法,每一個步驟都包含與當前殘差最相關的原子。它相似於更簡單的匹配追求( MP )方法,可是在每次迭代中更好,使用在先前選擇的詞典元素的空間上的正交投影從新計算殘差。
OMP 基於一個貪心算法,每一個步驟都包含與當前殘差最相關的原子。它相似於更簡單的匹配追求( MP )方法,可是在每次迭代中更好,使用在先前選擇的詞典元素的空間上的正交投影從新計算殘差。

Bayesian Regression ( 貝葉斯迴歸 )

貝葉斯迴歸技術能夠用於在估計過程當中包括正則化參數:正則化參數不是硬的設置,而是調整到手頭的數據。
這能夠經過對模型的超參數引入 uninformative priors ( 不知情的先驗 ) 來完成。Ridge Regression 中使用的 L 2 正則化等價於在精度爲 的參數 w 以前,在高斯下找到最大 a-postiori 解。而不是手動設置 lambda ,能夠將其視爲從數據估計的隨機變量。
爲了得到一個徹底機率模型,輸出y被假定爲高斯分佈在 X w 周圍:

p ( y | X , w , α ) = N ( y | X w , α )

Alpha 再次被視爲從數據估計的隨機變量。
貝葉斯迴歸的優勢是:

  • 它適應了 data at hand ( 手頭的數據 ) 。
  • 它能夠用於在估計過程當中包括正則化參數。

貝葉斯迴歸的缺點包括:

  • 模型的推論多是耗時的。

Bayesian Ridge Regression ( 貝葉斯嶺迴歸 )

BayesianRidge estimates ( 貝葉斯嶺方差估計 ) 如上所述的迴歸問題的機率模型。參數 w 的先驗由球面高斯給出:

p ( w | λ ) = N ( w | 0 , λ 1 I )

選擇 α λ 的先驗是 gamma distributions ( 伽馬分佈 ) ,即 conjugate prior for the precision of the Gaussian ( 高斯精度以前的共軛 ) 。
所獲得的模型稱爲 Bayesian Ridge Regression ( 貝葉斯嶺迴歸 ) ,與 classical Ridge ( 古典嶺 ) 類似。參數 w α λ 在模型擬合期間聯合估計。剩餘的超參數是 α λ 以後的伽瑪先驗的參數。這些一般被選爲 non-informative ( 非資料性 ) 的。經過最大化邊際對數似然估計參數。
默認狀況下,

貝葉斯迴歸用於迴歸:

>>> from sklearn import linear_model
>>> X = [[0., 0.], [1., 1.], [2., 2.], [3., 3.]]
>>> Y = [0., 1., 2., 3.]
>>> reg = linear_model.BayesianRidge()
>>> reg.fit(X, Y)
BayesianRidge(alpha_1=1e-06, alpha_2=1e-06, compute_score=False, copy_X=True,
       fit_intercept=True, lambda_1=1e-06, lambda_2=1e-06, n_iter=300,
       normalize=False, tol=0.001, verbose=False)

安裝後,該模型可用於預測新值:

>>> reg.predict ([[1, 0.]])
array([ 0.50000013])

模型的權重 w 能夠訪問:

>>> reg.coef_
array([ 0.49999993, 0.49999993])

因爲貝葉斯框架發現的權重與普通最小二乘法發現的權重略有不一樣。然而,貝葉斯嶺迴歸對於不適當的問題更爲強大。

Automatic Relevance Determination - ARD ( 自動相關性測定 - ARD )

ARDRegression 與 Bayesian Ridge Regression ( 貝葉斯嶺迴歸 ) 很是類似,但能夠致使更稀疏的權重 w 。 ARDREgression 經過放棄高斯爲球面的假設,構成了與 w 以前不一樣的先驗。
相反,假定 w 上的分佈是軸平行的橢圓高斯分佈。
這意味着每一個權重 w i 從高斯分佈繪製,以零爲中心,精度爲 λ i

p ( w | λ ) = N ( w | 0 , A 1 )

d i a g ( A ) = λ = { λ 1 , , λ p }
與貝葉斯嶺迴歸相反,每一個 w i 的座標都有本身的標準誤差 λ i 。 先前的全部 λ i 被選擇爲由超參數 λ 1 λ 2 給出的相同的伽馬分佈。

ARD 在文獻中也被稱爲稀疏貝葉斯學習與 Relevance Vector Machine

Logistic regression ( 邏輯迴歸 )

Logistic regression ( 邏輯迴歸 ) ,儘管它的名字是迴歸,是一個用於分類的線性模型而不是用於迴歸。

Stochastic Gradient Descent - SGD ( 隨機梯度降低 )

Stochastic gradient descent ( 隨機梯度降低 ) 是一種簡單但很是有效的擬合線性模型的方法。當 samples ( 樣本 ) 數量(和 features ( 特徵 ) 數量)很是大時,這是特別有用的。 partial_fit 方法 only/out-of-core 學習。
SGDClassifier 和 SGDRegressor 類提供了使用不一樣(凸)損失函數和不一樣懲罰的分類和迴歸的線性模型的功能。例如,當 loss=「log」 時,SGDC 分類器適合邏輯迴歸模型,而 loss=」hinge」 則適合線性支持向量機( SVM )。

Perceptron ( 感知 )

Perceptron ( 感知器 ) 是適用於大規模學習的另外一種簡單算法。默認:

  • 它不須要 learning rate ( 學習率 ) 。
  • 它不是 regularized (penalized) ( 正規化(懲罰) ) 。
  • 它 updates its model only on mistakes ( 僅在錯誤時更新其模型 ) 。

最後一個特徵意味着 Perceptron ( 感知器 ) 比 hinge loss 比 SGD 稍快一點,而且所獲得的模型更加 sparser ( 稀疏 ) 。

Passive Aggressive Algorithms ( 被動侵略性算法 )

passive-aggressive algorithms ( 被動侵略算法 ) 是用於 large-scale learning ( 大規模學習 ) 的一系列算法。它們與 Perceptron ( 感知器 ) 相似,由於它們不須要 learning rate ( 學習率 ) 。然而,與 Perceptron ( 感知器 ) 相反,它們包括正則化參數 C 。
對於分類,PassiveAggressiveClassifier 能夠與 loss =’hinge’ ( PA-I )或 loss =「squared_hinge」 ( PA-II )一塊兒使用。對於迴歸,PassiveAggressiveRegressor 能夠與 loss =’epsilon_insensitive’ ( PA-I )或 loss =’squared_epsilon_insensitive’ ( PA-II )一塊兒使用。

Robustness regression: outliers and modeling errors ( 魯棒性迴歸:異常值和建模偏差 )

Robust regression ( 魯棒性迴歸 ) 有興趣在存在 presence of corrupt data ( 腐敗數據 ) 的狀況下擬合迴歸模型:outliers ( 異常值 ) 或模型中的錯誤。

Different scenario and useful concepts ( 不一樣的場景和有用的概念 )

處理由異常值損壞的數據時,請記住不一樣的事項:
Outliers in X or in y?


Outliers in the y direction


Outliers in the X direction

Fraction of outliers versus amplitude of error ( 異常值與偏差幅度的分數 )
The number of outlying points matters, but also how much they are outliers. ( 離岸點的數量很重要,但也是離羣點多少 )


Small outliers


Large outliers

robust fitting 的一個重要概念就是 breakdown point ( 分解點 ) :能夠離開的數據的分數,以適合開始丟失內部數據。

注意,通常來講,在高維度設置(大 n_features )中的 robust fitting ( 魯棒擬合 ) 是很是困難的。這裏的 robust models ( 健壯模型 ) 可能沒法在這些設置中使用。

RANSAC: RANdom SAmple Consensus

RANSAC ( RANdom SAmple Consensus ) 適合來自完整數據集的來自隨機子集的模型。
RANSAC 是一種 non-deterministic ( 非肯定性 ) 算法,只產生具備必定機率的合理結果,這取決於迭代次數(參見 max_trials 參數)。它一般用於線性和非線性迴歸問題,在攝影測量計算機視覺領域尤爲受歡迎。
該算法將完整的輸入採樣數據分解爲可能受到噪聲的一組內聯集,以及異常值。由數據的錯誤測量或無效假設引發。而後,所獲得的模型僅來自肯定的內部估計。

Details of the algorithm ( 算法的細節 )
每次迭代執行如下步驟:

  • 從原始數據中選擇 min_samples random samples ( 隨機樣本 ) ,並檢查數據集是否有效(請參閱 is_data_valid)。
  • 將模型擬合爲 random subset ( 隨機子集 ) ( base_estimator.fit ),並檢查估計模型是否有效(請參閱 is_model_valid )。
  • 經過計算 estimated model ( 估計模型 ) 的殘差(base_estimator.predict(X) - y))將全部數據做爲內部值或異常值進行分類 - all 絕對殘差小於 residual_threshold ( 殘差閾值 ) 的數據樣本均被視爲內部值。
  • 若是 Inlier 樣本數量最大,則將擬合模型保存爲最佳模型。若是當前估計的模型具備相同數量的內部值,則只有當其具備較好的分數時才被認爲是最佳模型。

這些步驟最大次數( max_trials )執行,或直到知足特殊中止條件之一(參見 stop_n_inliers 和 stop_score )。最終模型使用先前肯定的最佳模型的全部 Inlier 樣本(一致集合)進行估計。

is_data_valid 和 is_model_valid 函數容許識別和拒絕隨機子樣本的退化組合。若是估計的模型不須要用於識別退化狀況,則應使用 is_data_valid ,由於它在擬合模型以前被調用,從而致使更好的計算性能。

Theil-Sen estimator: generalized-median-based estimator ( Theil-Sen 估計:廣義中位數估計 )

TheilSenRegressor 估計器使用 generalization of the median in multiple dimensions ( 多維度中值的泛化 ) 。所以,多變量離羣值是很是 robust ( 魯棒 ) 的。可是請注意,估計器的魯棒性隨着問題的維數而迅速下降。它失去了其魯棒性,而且在高維度上變得不如普通的最小二乘法。
Theoretical considerations ( 理論考慮 )
TheilSenRegressor 在漸近效率方面與普通最小二乘法( OLS )至關,做爲無偏估計。與 OLS 相反,Theil-Sen 是一種非參數方法,這意味着它不會對數據的基本分佈作出假設。因爲 Theil-Sen 是一個基於中位數的估計器,它對於破壞的數據而言更爲強大。在單變量設置中,Theil-Sen 在簡單線性迴歸的狀況下的崩潰點約爲 29.3% ,這意味着它能夠容忍高達 29.3% 的任意損壞的數據。

在 scikit-learn 中 TheilSenRegressor 的實現遵循多變量線性迴歸模型 的推廣,使用空間中值,這是中位數到多維度的推廣]。
在時間和空間複雜性方面, Theil-Sen scales 根據:

( n s a m p l e s n s u b s a m p l e s )

這使得對於大量樣品和特徵的問題進行完全的應用是不可行的。所以,能夠經過僅考慮全部可能組合的隨機子集來選擇子羣體的大小來限制時間和空間複雜性。

Huber Regression ( 胡伯迴歸 )

HuberRegressor 與 Ridge 不一樣,由於它將線性損失應用於被分類爲異常值的樣本。若是該樣本的絕對偏差小於某一閾值,則樣本被歸類爲一個異常值。它不一樣於 TheilSenRegressor 和 RANSACRegressor ,由於它不會忽視異常值的影響,但對它們的重視程度較小。

Polynomial regression: extending linear models with basis functions ( 多項式迴歸:用基函數擴展線性模型 )

機器學習中的一種常見模式是使用訓練數據非線性函數的線性模型。這種方法保持線性方法的 generally fast performance ( 通常快速性能 ) ,同時容許它們適應更普遍的數據。
例如,能夠經過從 constructing polynomial features ( 係數構造多項式特徵 ) 來擴展簡單的線性迴歸。在標準線性迴歸的狀況下,您可能有一個相似於二維數據的模型:

y ^ ( w , x ) = w 0 + w 1 x 1 + w 2 x 2

若是咱們想要將數學擬合爲拋物面而不是平面,咱們能夠將 second-order polynomials ( 二階多項式 ) 的特徵組合起來,使得模型以下所示:
y ^ ( w , x ) = w 0 + w 1 x 1 + w 2 x 2 + w 3 x 1 x 2 + w 4 x 1 2 + w 5 x 2 2

(有時使人驚訝)的觀察是,這仍然是一個線性模型:要看到這一點,想象一下建立一個新的變量
z = [ x 1 , x 2 , x 1 x 2 , x 1 2 , x 2 2 ]

經過對數據的從新標註,能夠寫出咱們的問題
y ^ ( w , x ) = w 0 + w 1 z 1 + w 2 z 2 + w 3 z 3 + w 4 z 4 + w 5 z 5

咱們看到所獲得的多項式迴歸與上面咱們考慮過的線性模型相同(即模型在 w 中是線性的),而且能夠經過相同的技術來解決。經過考慮使用這些基本功能構建的更高維度空間內的線性擬合,該模型具備適應更普遍範圍的數據的靈活性。

如下是使用不一樣程度的多項式特徵將這一想法應用於一維數據的示例:

該圖是使用 PolynomialFeatures 預處理器建立的。該預處理器將輸入數據矩陣轉換爲給定度的新數據矩陣。它可使用以下:

>>> from sklearn.preprocessing import PolynomialFeatures
>>> import numpy as np
>>> X = np.arange(6).reshape(3, 2)
>>> X
array([[0, 1], [2, 3], [4, 5]])
>>> poly = PolynomialFeatures(degree=2)
>>> poly.fit_transform(X)
array([[ 1., 0., 1., 0., 0., 1.], [ 1., 2., 3., 4., 6., 9.], [ 1., 4., 5., 16., 20., 25.]])

X 的特徵已經從 [ x 1 , x 2 ] 轉換爲 [ 1 , x 1 , x 2 , x 1 2 , x 1 x 2 , x 2 2 ] ,如今能夠在任何線性模型中使用。
這種預處理可使用 Pipeline 進行簡化。能夠建立表示簡單多項式迴歸的單個對象,並使用以下:

>>> from sklearn.preprocessing import PolynomialFeatures
>>> from sklearn.linear_model import LinearRegression
>>> from sklearn.pipeline import Pipeline
>>> import numpy as np
>>> model = Pipeline([('poly', PolynomialFeatures(degree=3)),
...                   ('linear', LinearRegression(fit_intercept=False))])
>>> # fit to an order-3 polynomial data
>>> x = np.arange(5)
>>> y = 3 - 2 * x + x ** 2 - x ** 3
>>> model = model.fit(x[:, np.newaxis], y)
>>> model.named_steps['linear'].coef_
array([ 3., -2.,  1., -1.])

訓練多項式特徵的線性模型可以準確地恢復輸入多項式係數。
在某些狀況下,沒有必要包含任何單個功能的更高的功能,而只包含全部交互功能,這些功能能夠在多達 d 個不一樣的功能中進行疊加。這些能夠經過設置 interaction_only = True 從 PolynomialFeatures 得到。
例如,當處理布爾特徵時,全部 n 的 x i n = x i 所以是無用的;但 x i x j 表示兩個布爾值的鏈接。這樣,咱們可使用線性分類器來解決 XOR 問題:

>>> from sklearn.linear_model import Perceptron
>>> from sklearn.preprocessing import PolynomialFeatures
>>> import numpy as np
>>> X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
>>> y = X[:, 0] ^ X[:, 1]
>>> y
array([0, 1, 1, 0])
>>> X = PolynomialFeatures(interaction_only=True).fit_transform(X).astype(int)
>>> X
array([[1, 0, 0, 0], [1, 0, 1, 0], [1, 1, 0, 0], [1, 1, 1, 1]])
>>> clf = Perceptron(fit_intercept=False, n_iter=10, shuffle=False).fit(X, y)

And the classifier 「predictions」 are perfect: ( 分類器「預測」是完美的 ) :

>>> clf.predict(X)
array([0, 1, 1, 0]) >>> clf.score(X, y) 1.0

最小二乘法多項式曲線擬合

多項式曲線擬合與多元線性迴歸擬合不一樣點在於,多元線性迴歸自變量有多個,因變量是多個自變量的線性組合,其形式爲 y = w 0 + w 1 x 1 + + w n x n ;而多項式擬合自變量仍是一個,只不過因變量能夠看做是自變量不一樣多項式的線性組合,其形式爲 y = w 0 + w 1 x + w 2 x 2 + + w k x k 。但利用矩陣計算時,若是滿秩,二者係數的表達方式是同樣的, w = ( X T X ) 1 X T Y

概念

默認地認爲因變量是自變量的多項式的線性組全,即有以下形式 y = w 0 + w 1 x + w 2 x 2 + + w k x k 。最小二乘法多項式曲線擬合,根據給定的m個點,並不要求這條曲線精確地通過這些點,而是擬合曲線 y = ϕ ( x ) 上的數據點到原數據點的偏差平方和最小。即有

m i n ϕ i = 1 m δ i 2 = m i n ϕ i = 1 m ( ϕ ( x i ) y i ) 2 = m i n ϕ i = 1 m ( w 0 + w 1 x i + w 2 x i 2 + + w k x i k y i ) 2 ( 1 )

迴歸係數求解

求最值問題,若是直接求解那麼必然在可能的極值點得到(此時沒有邊界限制)。
對(1)式求偏導,以下

i = 1 m 2 ( w 0 + w 1 x i + w 2 x i 2 + + w k x i k y i ) ( w 0 + w 1 x i + w 2 x i 2 + + w k x i k ) w = 0

爲便於理解,咱們每次都只對w的一個維度求偏導,則有
相關文章
相關標籤/搜索