ValueError: shapes (20,1) and (2,1) not aligned: 1 (dim 1) != 2 (dim 0)

ValueError: shapes (20,1) and (2,1) not aligned: 1 (dim 1) != 2 (dim 0)

我对机器学习有点陌生,我正在尝试通过 sklearn 在不使用 linear_model.LinearRegression() 的情况下进行线性回归。我想我的编码接近尾声并准备绘制直线,但我收到错误 "ValueError: shapes (20,1) and (2,1) not aligned: 1 (dim 1) != 2 (dim 0)"。我打印了我的 20 x 1 矩阵来确认,它们都没有任何额外的维度或任何东西,所以我不确定为什么它在错误消息中给我 (2,1) 或者为什么维度不匹配。有人对如何 "align" 这些矩阵有任何建议吗?我正在使用 Python 3.5.1.

编辑: 我已经查看了 Whosebug 中的许多其他 ValueError 主题,但我无法真正理解这些建议。如果可以的话,外行人的条款将不胜感激。

Per Georgy 我将代码缩小到仅导致错误消息所需的代码行。 alphaiterstheta 单独显示,以显示需要传递到函数中的所有变量。

编辑2:好吧,尝试2来减少示例代码。感谢您在这方面与我合作。我在这行代码周围放置了一个 try-except 语句:

theta = theta -(alpha/len(X)) * np.sum((X @ theta.T - y) * X, axis=0)

所述行位于使用 i 作为变量的 for 循环中。所述行给我以下错误:

Traceback (most recent call last):
  File "C:\Users\YungL\Desktop\linearRegression.py", line 30, in <module>
    slope_and_intercept, cost = gradDescent(X_test, Y_test, theta, alpha, iters)
  File "C:\Users\YungL\Desktop\linearRegression.py", line 26, in gradDescent
    theta = theta -(alpha/len(X)) * np.sum((X @ theta.T - y) * X, axis=0)
ValueError: shapes (20,1) and (2,1) not aligned: 1 (dim 1) != 2 (dim 0)

抛出异常时打印 X[i]y[i]theta 分别给我这个:

[[ 0.07786339]    [[233.]    [[1. 1.]]

第 1 列为 X,第 2 列为 y,第 3 列为 theta。参考矩阵,这些是每个矩阵中的第一个值。尽管对于 theta,这是唯一的值。

这里是异常时Xy的完整矩阵:

[[ 0.07786339]    [[233.]
 [-0.03961813]    [ 91.]
 [ 0.01103904]    [111.]
 [-0.04069594]    [152.]
 [-0.03422907]    [120.]
 [ 0.00564998]    [ 67.]
 [ 0.08864151]    [310.]
 [-0.03315126]    [ 94.]
 [-0.05686312]    [183.]
 [-0.03099563]    [ 66.]
 [ 0.05522933]    [173.]
 [-0.06009656]    [ 72.]
 [ 0.00133873]    [ 49.]
 [-0.02345095]    [ 64.]
 [-0.07410811]    [ 48.]
 [ 0.01966154]    [178.]
 [-0.01590626]    [104.]
 [-0.01590626]    [132.]
 [ 0.03906215]    [220.]
 [-0.0730303 ]]   [ 57.]]

对于矩阵乘法(@ 运算符所做的),您需要匹配相关矩阵的内部维数。也就是说,您可以将 20 x 1 矩阵乘以 1 x 2 矩阵,但不能乘以 2 x 1 矩阵。这不是numpy具体的事情,它只是矩阵运算的一个基本事实。

您遇到的问题是代码中的 X @ theta.T 导致维度不匹配。我不知道这些变量代表什么(并且您已经编辑了问题以找出它们的来源),但是鉴于错误,您可能需要 X @ theta 。这将执行 20 x 1 和 1 x 2 乘法,而不是数学上不起作用的 2 x 1 乘法。