python中的多元线性回归没有拟合原点?

时间:2012-09-23 18:35:03

标签: python numpy regression

我在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)

任何帮助将不胜感激。感谢。

3 个答案:

答案 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这样

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}是您的拦截术语。