本文參考線性迴歸之最小二乘法及線性迴歸淺談html
線性迴歸假設因變量與自變量之間存在線性關係,因變量可經過自變量線性疊加而獲得,即因變量和自變量之間可用以下方式表示。
python
式中
爲自變量,
爲權重係數,
爲偏置。
線性迴歸就是要解決如何利用樣本求取
和
,擬合出上述表達式,得到最佳直線的問題。最經常使用的就是最小二乘法。
最小二乘法:最佳擬合線下,將已知樣本的自變量代入擬合直線,獲得的觀測值與實際值之間的偏差平方和最小。web
爲了好理解,先從簡單的狀況開始,即一元線性迴歸。算法
假設因變量和自變量可用以下函數表示:
對於任意樣本點
,有偏差
,偏差平方和
那什麼樣的a和b會使得偏差平方和最小呢?
上面是求最值的問題,咱們會想到導數和偏導數,這裏在偏導數等於0的地方能取到極值,而且也是最值。
分別對a和b求偏導獲得以下表達式:
sql
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
函數
也能夠表示成以下的形式
數組
式中 網絡
對於n個樣本,此時損失函數(即偏差平方和)爲:
數據結構
假如咱們將樣本表示成以下形式:
app
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]]
將一元線性迴歸及迴歸係數的計算公式推廣到多元線性迴歸也是同樣。
損失函數可表示以下:
令導數爲0的方程組有足夠的已知條件求解,令導數爲0,則有
此時利用導數爲0方程組個數不夠,不可以所有解出參數,
可利用梯度降低法求近似最優解
#-*-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迴歸案例》
來源:https://www.cnblogs.com/sumai/p/5211558.html
來源:
這是對迴歸分析的提高,使得模型具備更好的抗干擾能力。
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):真實值與預測值差的平方和的平均值,計算公式以下
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)
很是重要,能夠將其當作一個MSE標準化版本,
是模型捕獲響應方差的分數。對於訓練集來講,
的取值範圍爲[0,1],對於測試集來講,
取值可能爲負。若是R^2越接近與1代表其模型的性能越好。
計算公式以下:
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
優勢
缺點
來源:apache官網中文翻譯
介紹sklearn中的廣義線性模型。
在整個模塊中,咱們指定coef_
表明向量
, intercept_
表明
。
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) ,假設
。
嶺迴歸經過對係數的大小施加懲罰來解決普通最小二乘的一些問題。 ridge coefficients ( 嶺係數 ) 最小化一個帶罰項(就是咱們所說的正則項)的殘差平方和,
>>> 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 及其變體是 compressed sensing ( 壓縮感測領域 ) 的基礎。在某些條件下,它能夠恢復精確的非零權重集(參見 Compressive sensing: tomography reconstruction with L1 prior (Lasso) ( 壓縮感測:使用 L1 先驗( Lasso )進行斷層掃描重建 ) )。
在數學上,它由一個使用
先驗做爲正則化項的線性模型組成。最小化的目標函數是:
>>> 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 來計算可能值的完整路徑上的係數。
注意
注意
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 次,因此找到 α 的最優值是一個計算上更便宜的替代方法。然而,這樣的標準須要對解決方案的自由度進行適當的估計,爲大樣本(漸近結果)導出,並假設模型是正確的,即數據其實是由該模型生成的。當問題條件差時,它們也傾向於打破(比樣本更多的特徵)。
MultiTaskLasso 是一個線性模型,它聯合估計多個迴歸問題的稀疏係數:y 是一個二維數組,shape(n_samples,n_tasks)。約束是所選的特徵對於全部的迴歸問題都是相同的,也稱爲 tasks ( 任務 )。
下圖比較了使用簡單 Lasso 或 MultiTaskLasso 得到的 W 中非零的位置。 Lasso 估計產生分散的非零,而 MultiTaskLasso 的非零是全列。
在數學上,它由一個線性模型組成,訓練有混合的
以前的正則化。目標函數最小化是:
ElasticNet 是一種線性迴歸模型,以 L1 和 L2 組合爲正則化項。這種組合容許學習一個稀疏模型,其中不多的權重是非零的,如 Lasso ,同時仍然保持 Ridge 的正則化屬性。咱們使用 l1_ratio
參數控制 L1 和 L2 的凸組合。
當有多個相互關聯的特徵時,Elastic-net 是有用的。 Lasso 有可能隨機選擇其中之一,而 elastic-net 則極可能選擇二者。
Lasso 和 Ridge 之間的一個實際的優點是容許 Elastic-Net 繼承 Ridge 在一些旋轉下的穩定性。
在這種狀況下,最小化的目標函數
alpha
(
)和
l1_ratio
。
MultiTaskElasticNet 是一個彈性網絡模型,能夠聯合估計多個迴歸問題的稀疏係數: Y 是 2D array,shape(n_samples, n_tasks)。constraint ( 約束 ) 是所選的特徵對於全部的迴歸問題都是相同的,也稱爲 tasks ( 任務 )。
目標函數最小化是:
MultiTaskElasticNet 類中的實現使用座標降低做爲擬合係數的算法。
MultiTaskElasticNetCV 類可用於經過交叉驗證來設置參數 alpha
(
) 和l1_ratio
(
)。
Least-angle regression ( 最小二乘迴歸 ) ( LARS ) 是由 Bradley Efron,Trevor Hastie,Iain Johnstone 和 Robert Tibshirani 開發的高維數據迴歸算法。
LARS 的優勢是:
LARS 方法的缺點包括:
LARS 模型可使用估計器 Lars 或其低級實現 lars_path 來使用。
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_ 中。第一列始終爲零。
OrthogonalMatchingPursuit ( 正交匹配追蹤 ) 和 orthogonal_mp 實現了 OMP 算法,用於近似線性模型的擬合,並對非零係數(即 L 0 僞範數)施加約束。
做爲 Least Angle Regression ( 最小角度迴歸 ) 的前向特徵選擇方法,正交匹配追蹤能夠用固定數量的非零元素逼近最優解矢量:
貝葉斯迴歸技術能夠用於在估計過程當中包括正則化參數:正則化參數不是硬的設置,而是調整到手頭的數據。
這能夠經過對模型的超參數引入 uninformative priors ( 不知情的先驗 ) 來完成。Ridge Regression 中使用的
正則化等價於在精度爲 的參數 w 以前,在高斯下找到最大 a-postiori 解。而不是手動設置 lambda ,能夠將其視爲從數據估計的隨機變量。
爲了得到一個徹底機率模型,輸出y被假定爲高斯分佈在
周圍:
貝葉斯迴歸的缺點包括:
BayesianRidge estimates ( 貝葉斯嶺方差估計 ) 如上所述的迴歸問題的機率模型。參數 w 的先驗由球面高斯給出:
>>> 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])
因爲貝葉斯框架發現的權重與普通最小二乘法發現的權重略有不一樣。然而,貝葉斯嶺迴歸對於不適當的問題更爲強大。
ARDRegression 與 Bayesian Ridge Regression ( 貝葉斯嶺迴歸 ) 很是類似,但能夠致使更稀疏的權重 w 。 ARDREgression 經過放棄高斯爲球面的假設,構成了與 w 以前不一樣的先驗。
相反,假定 w 上的分佈是軸平行的橢圓高斯分佈。
這意味着每一個權重
從高斯分佈繪製,以零爲中心,精度爲
:
Logistic regression ( 邏輯迴歸 ) ,儘管它的名字是迴歸,是一個用於分類的線性模型而不是用於迴歸。
Stochastic gradient descent ( 隨機梯度降低 ) 是一種簡單但很是有效的擬合線性模型的方法。當 samples ( 樣本 ) 數量(和 features ( 特徵 ) 數量)很是大時,這是特別有用的。 partial_fit 方法 only/out-of-core 學習。
SGDClassifier 和 SGDRegressor 類提供了使用不一樣(凸)損失函數和不一樣懲罰的分類和迴歸的線性模型的功能。例如,當 loss=「log」 時,SGDC 分類器適合邏輯迴歸模型,而 loss=」hinge」 則適合線性支持向量機( SVM )。
Perceptron ( 感知器 ) 是適用於大規模學習的另外一種簡單算法。默認:
最後一個特徵意味着 Perceptron ( 感知器 ) 比 hinge loss 比 SGD 稍快一點,而且所獲得的模型更加 sparser ( 稀疏 ) 。
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 )一塊兒使用。
Robust regression ( 魯棒性迴歸 ) 有興趣在存在 presence of corrupt data ( 腐敗數據 ) 的狀況下擬合迴歸模型:outliers ( 異常值 ) 或模型中的錯誤。
處理由異常值損壞的數據時,請記住不一樣的事項:
Outliers in X or in y?
Fraction of outliers versus amplitude of error ( 異常值與偏差幅度的分數 )
The number of outlying points matters, but also how much they are outliers. ( 離岸點的數量很重要,但也是離羣點多少 )
注意,通常來講,在高維度設置(大 n_features )中的 robust fitting ( 魯棒擬合 ) 是很是困難的。這裏的 robust models ( 健壯模型 ) 可能沒法在這些設置中使用。
RANSAC ( RANdom SAmple Consensus ) 適合來自完整數據集的來自隨機子集的模型。
RANSAC 是一種 non-deterministic ( 非肯定性 ) 算法,只產生具備必定機率的合理結果,這取決於迭代次數(參見 max_trials 參數)。它一般用於線性和非線性迴歸問題,在攝影測量計算機視覺領域尤爲受歡迎。
該算法將完整的輸入採樣數據分解爲可能受到噪聲的一組內聯集,以及異常值。由數據的錯誤測量或無效假設引發。而後,所獲得的模型僅來自肯定的內部估計。
Details of the algorithm ( 算法的細節 )
每次迭代執行如下步驟:
這些步驟最大次數( max_trials )執行,或直到知足特殊中止條件之一(參見 stop_n_inliers 和 stop_score )。最終模型使用先前肯定的最佳模型的全部 Inlier 樣本(一致集合)進行估計。
is_data_valid 和 is_model_valid 函數容許識別和拒絕隨機子樣本的退化組合。若是估計的模型不須要用於識別退化狀況,則應使用 is_data_valid ,由於它在擬合模型以前被調用,從而致使更好的計算性能。
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 根據:
HuberRegressor 與 Ridge 不一樣,由於它將線性損失應用於被分類爲異常值的樣本。若是該樣本的絕對偏差小於某一閾值,則樣本被歸類爲一個異常值。它不一樣於 TheilSenRegressor 和 RANSACRegressor ,由於它不會忽視異常值的影響,但對它們的重視程度較小。
機器學習中的一種常見模式是使用訓練數據非線性函數的線性模型。這種方法保持線性方法的 generally fast performance ( 通常快速性能 ) ,同時容許它們適應更普遍的數據。
例如,能夠經過從 constructing polynomial features ( 係數構造多項式特徵 ) 來擴展簡單的線性迴歸。在標準線性迴歸的狀況下,您可能有一個相似於二維數據的模型:
如下是使用不一樣程度的多項式特徵將這一想法應用於一維數據的示例:
該圖是使用 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 的特徵已經從
轉換爲
,如今能夠在任何線性模型中使用。
這種預處理可使用 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 的
所以是無用的;但
表示兩個布爾值的鏈接。這樣,咱們可使用線性分類器來解決 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
多項式曲線擬合與多元線性迴歸擬合不一樣點在於,多元線性迴歸自變量有多個,因變量是多個自變量的線性組合,其形式爲 ;而多項式擬合自變量仍是一個,只不過因變量能夠看做是自變量不一樣多項式的線性組合,其形式爲 。但利用矩陣計算時,若是滿秩,二者係數的表達方式是同樣的,
默認地認爲因變量是自變量的多項式的線性組全,即有以下形式
。最小二乘法多項式曲線擬合,根據給定的m個點,並不要求這條曲線精確地通過這些點,而是擬合曲線
上的數據點到原數據點的偏差平方和最小。即有
求最值問題,若是直接求解那麼必然在可能的極值點得到(此時沒有邊界限制)。
對(1)式求偏導,以下