为什么在这种情况下需要使用 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 实现中,矩阵和向量是两个不同的对象。
我真的很困惑为什么我需要在将数据拟合到 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 实现中,矩阵和向量是两个不同的对象。