【问题标题】:Multiple linear regression with numpy使用 numpy 进行多元线性回归
【发布时间】:2016-04-19 13:24:08
【问题描述】:

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

例如,使用以下数据:

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)

(上面的输出:)

y      x1    x2    x3    x4 x5   x6  x7
20.64, 0.0,  296,  54.7, 0, 519, 2,  24.0 
25.12, 0.0,  387,  54.7, 1, 678, 2,  24.0 
19.22, 0.0,  535,  54.7, 0, 296, 2,  24.0 
18.99, 0.0,  519,  18.97, 0, 296, 2,   54.9 
18.89, 0.0,  296,  18.97, 0, 535, 2,   54.9 
25.51, 0.0,  678,  18.97, 1, 387, 2,   54.9 
20.19, 0.0,  296,  25.51,  0,  519,  2,   54.9 
20.75, 0.0,  535,  25.51,  0,  296,  2,   54.9 
24.13, 0.0,  387,  25.51,  1,  678,  2,   54.9 
19.24, 0.0,  519,  0,  0,  296,  2,   55.0 
20.90, 0.0,  296,  0,  0,  535,  2,   55.0 
25.30, 0.0,  678,  0,  1,  387,  2,   55.0 
20.78, 0.0,  296,  0,  0,  519,  2,   55.2 
23.01, 0.0,  535,  0,  0,  296,  2,   55.2 
25.20, 0.0,  387,  0,  1,  678,  2,   55.2 
19.12, 0.0,  519,  0,  0,  296,  2,   55.3 
20.03, 0.0,  296,  0,  0,  535,  2,   55.3 
25.22, 0.0,  678,  0,  1,  387,  2,   55.3

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

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. ]

np.dot(A,coeffs) 是这样的:

[ 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]

在函数返回时,coeffs 包含这 8 个值。

[0.0, -0.0010535377771944548, 0.039998737474281849, 0.62111016637058492, -1.0101687709958682, -0.034563440146209781, -0.026910757873959575, 0.31055508318529385]

我不知道coeffs[0] 或coeffs[7] 是否是上面定义的等式Y 中的c。

我用这个系数计算新的 Ŷ 乘以新的 ẍ 的系数,如下所示:

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

我计算正确吗?当我收到带有负数的Ŷ 时该怎么办? c(a[0] 或 a[7])是哪个术语?

【问题讨论】:

  • c 术语将是 a[7],因为您将这些列放在最后,但是您的系数没有意义,您可以通过 print np.dot(A,coeffs) 进行检查,它应该给出你yy,还是很相似的。当我尝试时,我得到了系数[ -0.49104607 0.83271938 0.0860167 0.1326091 6.85681762 22.98163883 -41.08437805 -19.08085066]
  • 当我得到 Ŷ 阴性时该怎么办?这是什么意思?
  • 抱歉,为什么您的 A 与您的 x 值不匹配?
  • 看第00行的x2和x3值,分别是1.10224946e+09和4.40557880e+07,在你呈现的第一组数据中没有出现在任何地方。第一个数据有18行,A有19行
  • 如果您以正确的顺序输入 x 的值,那么它只是意味着这就是您的回归计算的值。负 Y 的含义取决于您在计算什么。但在方程式层面,否定答案是完全有效的

标签: python numpy math linear-regression


【解决方案1】:

这些列保持您指定它们的顺序,否则您将无法使用系数!

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

所以,打印出A,它应该是X1....X7 [Column of Ones]的形式。

无论哪个列号包含您的列号,都是偏移系数的系数向量中的等效项。

仅从参数的大小来看,coeff[7] 看起来就是偏移量,因为它要大几个数量级,考虑到您提供的 X 和 Y 值,这看起来不符合乘法系数的逻辑。

【讨论】:

  • 并将先前预测值Ŷ 与实际值Y 之间的差异添加到新的Ŷ 以最小化新预测中存在的误差是否有意义?跨度>
  • 你能添加你的 A 矩阵的样子吗?此外,添加残差并没有真正意义。根据定义,该模型对第一步数据的总体误差最小。你应该做的是绘制你的残差。如果它们看起来随机,您将不会变得更好。如果看起来有一些结构,您需要查看不同的模型形式(例如非线性回归)。
猜你喜欢
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2018-08-11
  • 2013-07-14
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
相关资源
最近更新 更多