在sklearn中的LinearRegression之前转置输入矩阵
Posted
技术标签:
【中文标题】在sklearn中的LinearRegression之前转置输入矩阵【英文标题】:Transpose input matrix before LinearRegression in sklearn 【发布时间】:2019-01-13 05:32:01 【问题描述】:这是我的python程序:
import numpy as np
from sklearn import linear_model
X=np.array([[1, 2, 4]]).T**2
y=np.array([1, 4, 16])
model=linear_model.LinearRegression()
model.fit(X,y)
print('Coefficients: \n', model.coef_)
结果我有:
Coefficients:
[1.]
这是我用 sklearn 测试的第一个程序。 我的问题是:为什么我必须在第三条指令中使用转置 .T**2 ? 没有
T**2
我有这些错误https://imgur.com/a/XWzJx0f 我用http://jupyter.org/try
【问题讨论】:
转置需要有一个形状为 (number_of_samples, number_of_x_dimensions) 的 X 矩阵。 @Learningisames 请问**2是什么意思? 我猜在这种特定情况下,您将y
拟合为x^2
的线性函数,而不是x
的线性函数。如果这令人困惑,我建议您查看机器学习中的特征工程。
【参考方案1】:
你必须匹配X,y
的相同维度(相同数量的训练样本)
如果不使用转置,则有 1 个训练样本 [1,2,4]
但有 3 个标签,不匹配
如果你使用转置,你可以有[1][2][4]
3 个样本,因此可以匹配 3 个标签
**2
无关紧要
【讨论】:
【参考方案2】:作为documentation says,您必须传递一个包含 n_samples (3) 和 n_features (1) 的矩阵。因此,[[1,2,3]] 形式的输入 X 需要垂直位置的内部向量。 **T 之后:
array([[ 1],
[ 4],
[16]])
这就是幕后发生的事情:https://machinelearningmastery.com/solve-linear-regression-using-linear-algebra/
【讨论】:
X=np.array([[1, 2, 4]]).T**2 print(X) --> 我有 [[ 1] [ 4] [16]] 我想要保持向量 X 不变? 线性关系,即 y=a*x+b 就是这样? 对不起,我忘了在Linear前面写“NON”。您的第二个问题与问题本身无关,也许您应该考虑打开一个不同的 Q。无论如何,您的数据描述的是一条曲线,然后线性模型将无法解释这种行为。 我已经改变了向量 Y imgur.com/a/dceoJ7O 所以我有 y=ax+b --> y=6*x+1 --> 程序只给我系数“a=6” !我怎样才能得到第二个参数(b = 1)?亲切的问候。 是intecept_,文档scikit-learn.org/stable/modules/generated/…也提供了【参考方案3】:(1,3)中矩阵X的初始形状。您需要以 (3,1) 的形式将矩阵作为文档 says 传递,并在 Alessandro 的回答中提到
**2 部分只是对矩阵 X 的每个元素进行平方。您可以在没有该部分的情况下运行它。那么系数会有所不同。目前,当您平方时,您的 X 和 y 值分别为 (1,1)、(4,4) 和 (16,16),因此系数(方程 y=mx+ c 的斜率,如果将它们绘制在graph) 为 1。如果不平方,系数会相应地不同
【讨论】:
以上是关于在sklearn中的LinearRegression之前转置输入矩阵的主要内容,如果未能解决你的问题,请参考以下文章
SkLearn 中的 TimeSeriesSplit 无法正常工作