我在http://rosettacode.org/wiki/Multiple_regression#Python上找到了这段代码,它在python中进行了多元线性回归。在以下代码中打印b,为您提供x1,...,xN的系数。但是,此代码适合通过原点的线(即结果模型不包括常量)。
我想做的只是完全相同的事情,除了我不想通过原点拟合线,我需要在我的结果模型中使用常量。
知道这是一个小修改吗?我已经搜索过并在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)
任何帮助将不胜感激。感谢。
答案 0 :(得分:5)
你只需要向X添加一行全部为1。
答案 1 :(得分:2)
或许更稳定的方法是使用最小二乘算法。这也可以在几行中以numpy完成。阅读documentation about numpy.linalg.lstsq。
在这里您可以找到一个示例实现:
http://glowingpython.blogspot.de/2012/03/linear-regression-with-numpy.html
答案 2 :(得分:1)
你所写的b = y * X.T * np.linalg.inv(X * X.T)
是正规方程的解,它给出了最小二乘拟合多线性模型。 swang的回答是正确的(和EMS的详细说明)---你需要在X中添加一行1。如果你想知道它为什么在理论上有效,请记住你发现b_i
这样1} p>
y_j = sum_i b_i x_{ij}.
通过添加一行1,您将为所有x_{(k+1)j} = 1
设置j
,这意味着您正在查找b_i,以便:
y_j = (sum_i b_i x_{ij}) + b_{k+1}
因为k+1
st x_ij
项始终等于1。因此,b_{k+1}
是您的拦截术语。