为什么在这种情况下需要使用 ravel() ?

Why do I need to use ravel() in this case?

我真的很困惑为什么我需要在将数据拟合到 SGDRegressor 之前使用 ravel()。

这是代码:

from sklearn.linear_model import SGDRegressor
sgd_reg = SGDRegressor(max_iter = 1000, tol = 1e-3, penalty = None, eta0= 0.1)
sgd_reg.fit(X, y.ravel())

这些是 X 和 y 的形状:

>>> X.shape
(100, 1)

>>> y.shape
(100, 1)

>>> y.ravel().shape
(100,)

y 视为一个二维矩阵,尽管它只有一列。但是 fit 方法期望 y 是一个平面数组。这就是为什么您必须使用 ravel 将二维数组转换为一维数组的原因。

在机器学习论文和教科书中很常见,将y写成矩阵,因为这样可以简化矩阵相乘时的符号。但是你也可以把它写成一个简单的一维向量。你可以说它没有区别,因为在这两种情况下它实际上只有一个维度,但在数学上和 Python 实现中,矩阵和向量是两个不同的对象。