Python 带numpy的多元线性回归

Python 带numpy的多元线性回归,python,numpy,math,linear-regression,Python,Numpy,Math,Linear Regression,我想用numpy计算多元线性回归。我需要将因变量(y)与几个自变量(x1、x2、x3等)进行回归 例如,使用此数据: print 'y x1 x2 x3 x4 x5 x6 x7' for t in texts: print "{:>7.1f}{:>10.2f}{:>9.2f}{:>9.2f}{:>10.2f}{:>7.2f}{:>7.2f}{:>9.2f}" /

我想用numpy计算多元线性回归。我需要将因变量(y)与几个自变量(x1、x2、x3等)进行回归

例如,使用此数据:

print 'y        x1      x2       x3       x4      x5     x6       x7'
for t in texts:
    print "{:>7.1f}{:>10.2f}{:>9.2f}{:>9.2f}{:>10.2f}{:>7.2f}{:>7.2f}{:>9.2f}" /
   .format(t.y,t.x1,t.x2,t.x3,t.x4,t.x5,t.x6,t.x7)
(以上的输出:)

我创建了这个函数,我认为它给出了系数A,从
Y=a1x1+a2x2+a3x3+a4x4+a5x5+a6x6++a7x7+c

def calculate_linear_regression_numpy(xx, yy):
    """ calculate multiple linear regression """
    import numpy as np
    from numpy import linalg

    A = np.column_stack((xx, np.ones(len(xx))))
    coeffs = linalg.lstsq(A, yy)[0]  # obtaining the parameters

    return coeffs
xx
是包含x的每一行的列表,
yy
是包含所有
y
的列表

A
是这样的:

00 = {ndarray} [   0.   296.   519.    2.    0.   24.    54.7    1. ]
01 = {ndarray} [   0.   296.   535.    2.    0.   24.    54.7    1. ]
02 = {ndarray} [   0.   387.   678.    2.    1.   24.    54.7    1. ]
03 = {ndarray} [   0.   296.   519.    2.    0.   54.9   18.97957206    1. ]
04 = {ndarray} [   0.   296.   535.    2.    0.   54.9   18.97957206    1. ]
05 = {ndarray} [   0.   387.   678.    2.    1.   54.9   18.97957206    1. ]
06 = {ndarray} [   0.   296.   519.    2.    0.   54.9   25.518085    1.   ]
07 = {ndarray} [   0.   296.   535.    2.    0.   54.9   25.518085    1.   ]
08 = {ndarray} [   0.   387.   678.    2.    1.   54.9   25.518085    1.   ]
09 = {ndarray} [   0.   296.   519.    2.    0.   55.    0.    1.]
10 = {ndarray} [   0.   296.   535.    2.    0.   55.    0.    1.]
11 = {ndarray} [   0.   387.   678.    2.    1.   55.    0.    1.]
12 = {ndarray} [   0.   296.   519.    2.    0.   55.2   0.    1. ]
13 = {ndarray} [   0.   296.   535.    2.    0.   55.2   0.    1. ]
14 = {ndarray} [   0.   387.   678.    2.    1.   55.2   0.    1. ]
15 = {ndarray} [   0.   296.   519.    2.    0.   55.3   0.    1. ]
16 = {ndarray} [   0.   296.   535.    2.    0.   55.3   0.    1. ]
17 = {ndarray} [   0.   387.   678.    2.    1.   55.3   0.    1. ]
[ 19.69873196  20.33871176  24.95249051  19.59198545
20.23196525  24.845744    19.41602911  20.05600891  24.66978766
20.09928377  20.73926357  25.35304232  20.09237109  20.73235089
25.34612964  20.08891474  20.72889454  25.34267329]
np.dot(A,coefs)
是这样的:

00 = {ndarray} [   0.   296.   519.    2.    0.   24.    54.7    1. ]
01 = {ndarray} [   0.   296.   535.    2.    0.   24.    54.7    1. ]
02 = {ndarray} [   0.   387.   678.    2.    1.   24.    54.7    1. ]
03 = {ndarray} [   0.   296.   519.    2.    0.   54.9   18.97957206    1. ]
04 = {ndarray} [   0.   296.   535.    2.    0.   54.9   18.97957206    1. ]
05 = {ndarray} [   0.   387.   678.    2.    1.   54.9   18.97957206    1. ]
06 = {ndarray} [   0.   296.   519.    2.    0.   54.9   25.518085    1.   ]
07 = {ndarray} [   0.   296.   535.    2.    0.   54.9   25.518085    1.   ]
08 = {ndarray} [   0.   387.   678.    2.    1.   54.9   25.518085    1.   ]
09 = {ndarray} [   0.   296.   519.    2.    0.   55.    0.    1.]
10 = {ndarray} [   0.   296.   535.    2.    0.   55.    0.    1.]
11 = {ndarray} [   0.   387.   678.    2.    1.   55.    0.    1.]
12 = {ndarray} [   0.   296.   519.    2.    0.   55.2   0.    1. ]
13 = {ndarray} [   0.   296.   535.    2.    0.   55.2   0.    1. ]
14 = {ndarray} [   0.   387.   678.    2.    1.   55.2   0.    1. ]
15 = {ndarray} [   0.   296.   519.    2.    0.   55.3   0.    1. ]
16 = {ndarray} [   0.   296.   535.    2.    0.   55.3   0.    1. ]
17 = {ndarray} [   0.   387.   678.    2.    1.   55.3   0.    1. ]
[ 19.69873196  20.33871176  24.95249051  19.59198545
20.23196525  24.845744    19.41602911  20.05600891  24.66978766
20.09928377  20.73926357  25.35304232  20.09237109  20.73235089
25.34612964  20.08891474  20.72889454  25.34267329]
函数返回时,
系数包含这8个值

[0.0, -0.0010535377771944548, 0.039998737474281849, 0.62111016637058492, -1.0101687709958682, -0.034563440146209781, -0.026910757873959575, 0.31055508318529385]
我不知道
coefs[0]
coefs[7]
是否是上面定义的等式Y中的
c

我取这个系数,用新的乘以系数ẍ's、 像这样:

Ŷ=a1ẍ1 + a2ẍ2 + a3ẍ3 + a4ẍ4 + a5ẍ5 + a6ẍ6 + +a7ẍ7 + c

我算对了吗?当我得到一个带有负数的
Ŷ
时,我该怎么办?哪个术语是
c
a[0]
a[7]
)?

列保持您指定的顺序,否则您将无法使用系数

记住,根据最小二乘问题的矩阵形式,Y的估计值由点C给出,其中C是系数向量/矩阵

所以,打印出A,它应该是X1…X7[一列]的形式

无论列号中包含哪一个,都是系数向量中偏移系数的等效条目


仅根据参数的大小,coeff[7]看起来是偏移量,因为它比你提供的X和Y值大几个数量级,这看起来不像是一个乘法系数。

c
项应该是
a[7]
,因为你把“一”列放在末尾,但是你的系数没有意义,你可以通过打印np.dot(A,coefs)来检查,它应该给你yy,或者非常类似的值。当我尝试时,我得到了系数
[-0.49104607 0.83271938 0.0860167 0.1326091 6.85681762 22.98163883-41.08437805-19.0808055066]
当我得到一个Ŷ负值时该怎么办?这是什么意思?抱歉,为什么A与x值不匹配?请看第00行的x2和x3值,它们分别为1.10224946e+09和4.40557880e+07,在您提供的第一组数据中没有出现。此外,第一个数据中有18行,在
A
中有19行,如果您以正确的顺序输入x的值,则这意味着这就是您的回归计算的值。负Y的意思取决于你在计算什么。但在方程层面上,否定答案是完全有效的,将先前预测值
Ŷ
和实际值
Y
之间的差值添加到新的
Ŷ
中,以最小化新预测中存在的误差是有意义的。你能添加你的a矩阵吗。此外,添加残差也没有真正意义。根据定义,该模型在第一步的数据中拟合的总体误差最小。你应该做的是绘制你的残差。如果它们看起来是随机的,你不会变得更好。如果模型似乎具有某种结构,则需要查看不同的模型形式(例如非线性回归)。