回归分析之线性回归(N元线性回归)
標簽(空格分隔): 回歸分析 二元線性回歸 多元線性回歸
打開微信掃一掃,關注微信公眾號【數據與算法聯盟】
轉載請注明出處:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer
在上一篇文章中我們介紹了 回歸分析之理論篇,在其中我們有聊到線性回歸和非線性回歸,包括廣義線性回歸,這一篇文章我們來聊下回歸分析中的線性回歸。
一元線性回歸
預測房價:
| 1 | 150 | 6450 |
| 2 | 200 | 7450 |
| 3 | 250 | 8450 |
| 4 | 300 | 9450 |
| 5 | 350 | 11450 |
| 6 | 400 | 15450 |
| 7 | 600 | 18450 |
針對上邊這種一元數據來講,我們可以構建的一元線性回歸函數為
其中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?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?16linreg.coef_ 為系數 a,b
linreg.intercept_ 為截距 c
缺點:因為系數矩陣x與它的轉置矩陣相乘得到的矩陣不能求逆,導致最小二乘法得到的回歸系數不穩定,方差很大。
多項式回歸:基函數擴展線性模型
機器學習中一種常見的模式是使用線性模型訓練數據的非線性函數。這種方法保持了一般快速的線性方法的性能,同時允許它們適應更廣泛的數據范圍。
例如,可以通過構造系數的多項式特征來擴展一個簡單的線性回歸。在標準線性回歸的情況下,你可能有一個類似于二維數據的模型:
如果我們想把拋物面擬合成數據而不是平面,我們可以結合二階多項式的特征,使模型看起來像這樣:
我們發現,這仍然是一個線性模型,想象著創建一個新變量:
可以把線性回歸模型寫成下邊這種形式:
我們看到,所得的多項式回歸與我們上面所考慮的線性模型相同(即模型在W中是線性的),可以用同樣的方法來求解。通過考慮在用這些基函數建立的高維空間中的線性擬合,該模型具有靈活性,可以適應更廣泛的數據范圍。
使用如下代碼,將二維數據進行二元轉換,轉換規則為:
驗證:
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)
2: 均方誤差(Mean Squared Error, MSE)
3: 均方根誤差(Root Mean Squared Error, RMSE)
總結
線性回歸在現實中還是可以解決很多問題的,但是并不是萬能的,后續我會繼續整理邏輯回歸,嶺回歸等相關回歸的知識,如果你感覺有用,歡迎分享!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的回归分析之线性回归(N元线性回归)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ERP软件的追加开发环节存在特殊价值
- 下一篇: 静态路由心法口诀:路由表少什么网络加什么