在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:文本分类交叉验证中的向量化

SkLearn 中的 TimeSeriesSplit 无法正常工作

GridsearchCV sklearn 中的错误

为啥在 python 中获取 sklearn 中的***谓词的结果不同?

带有sklearn的python中的轮廓系数