【发布时间】:2018-04-30 08:38:02
【问题描述】:
我真的不明白我的(简单)代码有什么问题......
我只想测试一个多元线性回归(....!)。
import pandas as pd
import numpy as np
import scipy.stats as st
import sklearn
n = 1000
X1 = linspace(2, 8.5, n)
X2 = linspace(-4, 2.9, n)
X3 = linspace(-1, 16, n)
X = np.transpose( [X1, X2, X3] )
Y = 2*X1 + 3.2*X2 -1.2*X3 + 4 + st.norm.rvs(size = n, loc = 0, scale = 0.6)
X = pd.DataFrame( X , columns = ["X1", "X2", "X3"])
Y = pd.DataFrame(Y, columns = ["Y"])
#Create linear regression object:
my_reg = sklearn.linear_model.LinearRegression()
#Train:
my_reg.fit(X, Y)
print('Coefficients: \n', my_reg.coef_)
print('Constant: \n', my_reg.intercept_)
我得到了一些愚蠢的结果,比如系数是 [ 0.25127347 0.26673645 0.65717676] ...
我也尝试过OLS的方式,但我仍然得到无意义的coef(略有不同但仍然很愚蠢)
(它适用于单变量线性回归,例如 Y = 2*X + 5,我会得到 coef 并截距非常接近真实值)
【问题讨论】:
-
这里习惯性地包含所有必要的导入语句,以确保希望帮助您的每个人都可以轻松地做到这一点。请考虑相应地编辑您的帖子。
-
我认为主要问题是您的矩阵几乎是秩不足的。您的
X1和X2如此强烈共线,以至于数值结果变得不可靠。我的猜测是,如果您在这些列中添加噪音,您将获得“真实”系数。这里的关键词是多重共线性。
标签: python regression