0

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

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

4

3 回答 3

5

您只需要在 X 中添加一行全为 1。

于 2012-09-23T19:26:21.630 回答
2

无论如何,也许更稳定的方法是使用最小二乘算法。这也可以在几行中在 numpy 中完成。阅读有关 numpy.linalg.lstsq 的文档

在这里您可以找到一个示例实现:

http://glowingpython.blogspot.de/2012/03/linear-regression-with-numpy.html

于 2012-09-23T19:11:57.897 回答
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} = 1all j,这意味着您正在找到 b_i 使得:

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

因为k+1stx_ij项总是等于 1。因此,b_{k+1}是您的截距项。

于 2012-09-24T02:42:39.763 回答