问题描述
我真的很困惑为什么在将数据拟合到 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
将 2d 转换为 1d 数组。
在机器学习论文和教科书中,将 y
写成矩阵是很常见的,因为它可以在矩阵相乘时简化表示法。但是你也可以把它写成一个简单的一维向量。你可以说它没有区别,因为在这两种情况下它实际上只有一个维度,但在数学上和 Python 实现中,矩阵和向量是两个不同的对象。