2012-09-23 63 views
0

我在http://rosettacode.org/wiki/Multiple_regression#Python上找到了這段代碼,它在python中進行了多重線性迴歸。在下面的代碼中打印b給出了x1,...,xN的係數。但是,此代碼適合通過原點的直線(即生成的模型不包含常數)。python中的多線性迴歸沒有擬合原點?

所有我想要做的是完全相同的事情,除了我不想通過原點擬合線,我需要在我的最終模型中的常量。

任何想法,如果這是做一個小修改?我已經搜索並找到了大量有關Python中多個迴歸的文檔,除非它們冗長,並且對於我所需要的過於複雜。此代碼完美無缺,除非我只需要一個適合通過攔截而非原點的模型。

import numpy as np 
from numpy.random import random 

n=100 
k=10 
y = np.mat(random((1,n))) 
X = np.mat(random((k,n))) 

b = y * X.T * np.linalg.inv(X*X.T) 
print(b) 

任何幫助,將不勝感激。謝謝。

回答

5

你只需要添加一行到X這是所有1

+0

你能否詳細說明一下? –

+2

把你的觀察矩陣(右邊的變量,其中第一列用於第一個變量,第二列用於第二個等),並且在所有列的前面加上一列,例如'numpy.ones(N)', N'是迴歸中的觀測值數量。那麼全1列的係數將是截距項。 – ely

+0

謝謝,這工作完美。 –

1

你寫了什麼,b = y * X.T * np.linalg.inv(X * X.T),是解決方案到正態方程,它給出了多線性模型的最小二乘擬合。動了的反應是正確的(和EMS的闡述)---你需要添加1的一排X.如果你想要的,爲什麼它的工作原理理論上的一些想法,請記住,你發現b_i這樣

y_j = sum_i b_i x_{ij}. 

通過添加1層的一排,你是爲所有j設置x_{(k+1)j} = 1,這意味着你發現b_i使得:

y_j = (sum_i b_i x_{ij}) + b_{k+1} 

因爲k+1 ST x_ij項總是等於一個。因此,b_{k+1}是您的攔截術語。