日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

回归分析之线性回归(N元线性回归)

發布時間:2025/3/15 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回归分析之线性回归(N元线性回归) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

標簽(空格分隔): 回歸分析 二元線性回歸 多元線性回歸




打開微信掃一掃,關注微信公眾號【數據與算法聯盟】

轉載請注明出處:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer


在上一篇文章中我們介紹了 回歸分析之理論篇,在其中我們有聊到線性回歸和非線性回歸,包括廣義線性回歸,這一篇文章我們來聊下回歸分析中的線性回歸。

一元線性回歸

預測房價:

輸入編號平方米價格
11506450
22007450
32508450
43009450
535011450
640015450
760018450

針對上邊這種一元數據來講,我們可以構建的一元線性回歸函數為

H(x)=k?x+b
其中H(x)為平方米價格表,k是一元回歸系數,b為常數。最小二乘法的公式:
k=n1(xi?xˉ)(yi?yˉ)n1(xi?xˉ)2
自己使用python代碼實現為: def leastsq(x,y):"""x,y分別是要擬合的數據的自變量列表和因變量列表"""meanX = sum(x) * 1.0 / len(x) # 求x的平均值meanY = sum(y) * 1.0 / len(y) # 求y的平均值xSum = 0.0ySum = 0.0for i in range(len(x)):xSum += (x[i] - meanX) * (y[i] - meanY)ySum += (x[i] - meanX) ** 2k = ySum/xSumb = ySum - k * meanXreturn k,b

使用python的scipy包進行計算:

leastsq(func, x0, args=(), Dfun=None, full_output=0, col_deriv=0, ftol=1.49012e-08, xtol=1.49012e-08, gtol=0.0, maxfev=0, epsfcn=None, factor=100, diag=None)from scipy.optimize import leastsq import numpy as npdef fun(p, x):"""定義想要擬合的函數"""k,b = p # 從參數p獲得擬合的參數return k*x + bdef err(p, x, y):return fun(p,x) - y#定義起始的參數 即從 y = 1*x+1 開始,其實這個值可以隨便設,只不過會影響到找到最優解的時間 p0 = [1,1]#將list類型轉換為 numpy.ndarray 類型,最初我直接使用 #list 類型,結果 leastsq函數報錯,后來在別的blog上看到了,原來要將類型轉 #換為numpy的類型x1 = np.array([150,200,250,300,350,400,600]) y1 = np.array([6450,7450,8450,9450,11450,15450,18450])xishu = leastsq(err, p0, args=(x1,y1))print xishu[0]

當然python的leastsq函數不僅僅局限于一元一次的應用,也可以應用到一元二次,二元二次,多元多次等,具體可以看下這篇博客:http://www.cnblogs.com/NanShan2016/p/5493429.html

多元線性回歸

總之:我們可以用python leastsq函數解決幾乎所有的線性回歸的問題了,比如說

y=a?x2+b?x+c
y=a?x21+b?x1+c?x2+d
y=a?x31+b?x21+c?x1+d
在使用時只需把參數列表和 fun 函數中的return 換一下,拿以下函數舉例
y=a?x21+b?x1+c?x2+d

對應的python 代碼是:

from scipy.optimize import leastsq import numpy as npdef fun(p, x1, x2):"""定義想要擬合的函數"""a,b,c,d = p # 從參數p獲得擬合的參數return a * (x1**2) + b * x1 + c * x2 + ddef err(p, x1, x2, y):return fun(p,x1,x2) - y#定義起始的參數 即從 y = 1*x+1 開始,其實這個值可以隨便設,只不過會影響到找到最優解的時間 p0 = [1,1,1,1]#將list類型轉換為 numpy.ndarray 類型,最初我直接使用 #list 類型,結果 leastsq函數報錯,后來在別的blog上看到了,原來要將類型轉 #換為numpy的類型x1 = np.array([150,200,250,300,350,400,600]) # 面積 x2 = np.array([4,2,7,9,12,14,15]) # 樓層 y1 = np.array([6450,7450,8450,9450,11450,15450,18450]) # 價格/平方米xishu = leastsq(err, p0, args=(x1,x2,y1))print xishu[0]

sklearn中的線性回歸應用

普通最小二乘回歸

這里我們使用的是sklearn中的linear_model來模擬

y=a?x1+b?x2+c In [1]: from sklearn.linear_model import LinearRegressionIn [2]: linreg = LinearRegression()In [3]: linreg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])In [4]: linreg.coef_ Out[4]: array([ 0.5, 0.5])In [5]: linreg.intercept_ Out[5]: 1.1102230246251565e-16In [6]: linreg.predict([4,4]) Out[6]: array([ 4.])In [7]: zip(["x1","x2"], linreg.coef_) Out[7]: [('x1', 0.5), ('x2', 0.49999999999999989)]

所以可得

y=0.5?x1+0.5?x2+1.11e?16

linreg.coef_ 為系數 a,b

linreg.intercept_ 為截距 c

缺點:因為系數矩陣x與它的轉置矩陣相乘得到的矩陣不能求逆,導致最小二乘法得到的回歸系數不穩定,方差很大。

多項式回歸:基函數擴展線性模型

機器學習中一種常見的模式是使用線性模型訓練數據的非線性函數。這種方法保持了一般快速的線性方法的性能,同時允許它們適應更廣泛的數據范圍。

例如,可以通過構造系數的多項式特征來擴展一個簡單的線性回歸。在標準線性回歸的情況下,你可能有一個類似于二維數據的模型:

y(w,x)=w0+w1x1+w2x2

如果我們想把拋物面擬合成數據而不是平面,我們可以結合二階多項式的特征,使模型看起來像這樣:

y(w,x)=w0+w1x1+w2x2+w3x1x2+w4x21+w5x22

我們發現,這仍然是一個線性模型,想象著創建一個新變量:

z=[x1,x2,x1x2,x21,x22]

可以把線性回歸模型寫成下邊這種形式:

y(w,x)=w0+w1z1+w2z2+w3z3+w4z4+w5z5
我們看到,所得的多項式回歸與我們上面所考慮的線性模型相同(即模型在W中是線性的),可以用同樣的方法來求解。通過考慮在用這些基函數建立的高維空間中的線性擬合,該模型具有靈活性,可以適應更廣泛的數據范圍。

使用如下代碼,將二維數據進行二元轉換,轉換規則為:

[x1,x2]=>[1,x1,x2,x21,x1x2,x22] In [15]: from sklearn.preprocessing import PolynomialFeaturesIn [16]: import numpy as npIn [17]: X = np.arange(6).reshape(3,2)In [18]: X Out[18]: array([[0, 1],[2, 3],[4, 5]])In [19]: poly = PolynomialFeatures(degree=2)In [20]: poly.fit_transform(X) Out[20]: array([[ 1., 0., 1., 0., 0., 1.],[ 1., 2., 3., 4., 6., 9.],[ 1., 4., 5., 16., 20., 25.]])

驗證:

In [38]: from sklearn.preprocessing import PolynomialFeaturesIn [39]: from sklearn.linear_model import LinearRegressionIn [40]: from sklearn.pipeline import PipelineIn [41]: import numpy as npIn [42]: In [42]: model = Pipeline( [ ("poly",PolynomialFeatures(degree=3)),("linear",LinearRegression(fit_intercept=False)) ] )In [43]: model Out[43]: Pipeline(steps=[('poly', PolynomialFeatures(degree=3, include_bias=True, interaction_only=False)), ('linear', LinearRegression(copy_X=True, fit_intercept=False, n_jobs=1, normalize=False))])In [44]: x = np.arange(5)In [45]: y = 3 - 2 * x + x ** 2 - x ** 3In [46]: y Out[46]: array([ 3, 1, -5, -21, -53])In [47]: model = model.fit(x[:,np.newaxis],y)In [48]: model.named_steps['linear'].coef_ Out[48]: array([ 3., -2., 1., -1.])

我們可以看出最后求出的參數和一元三次方程是一致的。

這里如果把degree改為2,y的方程也換一下,結果也是一致的

In [51]: from sklearn.linear_model import LinearRegressionIn [52]: from sklearn.preprocessing import PolynomialFeaturesIn [53]: from sklearn.pipeline import PipelineIn [54]: import numpy as npIn [55]: model = Pipeline( [ ("poly",PolynomialFeatures(degree=2)),("linear",LinearRegression(fit_intercept=False)) ] )In [56]: x = np.arange(5)In [57]: y = 3 + 2 * x + x ** 2In [58]: model = model.fit(x[:, np.newaxis], y)In [59]: model.named_steps['linear'].coef_ Out[59]: array([ 3., 2., 1.])

線性回歸的評測

在上一篇文章中我們聊到了回歸模型的評測方法,解下來我們詳細聊聊如何來評價一個回歸模型的好壞。

這里我們定義預測值和真實值分別為:

true = [10, 5, 3, 2] pred = [9, 5, 5, 3]

1: 平均絕對誤差(Mean Absolute Error, MAE)

1N(1n|yi?yˉ|)

2: 均方誤差(Mean Squared Error, MSE)

1N1n(yi?yˉ)2

3: 均方根誤差(Root Mean Squared Error, RMSE)

1N1n(yi?yˉ)2? In [80]: from sklearn import metricsIn [81]: import numpy as npIn [82]: true = [10, 5, 3, 2]In [83]: pred = [9, 5, 5, 3]In [84]: print("MAE: ", metrics.mean_absolute_error(true,pred)) ('MAE: ', 1.0)In [85]: print("MAE By Hand: ", (1+0+2+1)/4.) ('MAE By Hand: ', 1.0)In [86]: print("MSE: ", metrics.mean_squared_error(true,pred)) ('MSE: ', 1.5)In [87]: print("MSE By Hand: ", (1 ** 2 + 0 ** 2 + 2 ** 2 + 1 ** 2 ) / 4.) ('MSE By Hand: ', 1.5)In [88]: print("RMSE: ", np.sqrt(metrics.mean_squared_error(true,pred))) ('RMSE: ', 1.2247448713915889)In [89]: print("RMSE By Hand: ", np.sqrt((1 ** 2 + 0 ** 2 + 2 ** 2 + 1 ** 2 ) / 4.)) ('RMSE By Hand: ', 1.2247448713915889)

總結

線性回歸在現實中還是可以解決很多問題的,但是并不是萬能的,后續我會繼續整理邏輯回歸,嶺回歸等相關回歸的知識,如果你感覺有用,歡迎分享!

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的回归分析之线性回归(N元线性回归)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。