多项式回归无法过拟合?

问题描述 投票:0回答:1

我正在尝试将多项式回归过度拟合到正弦曲线。据我所知,当有

N
数据样本和
N-1
多项式次数时,曲线应该穿过所有数据点,但是,在我的示例中,这不会发生。

我的代码如下:

from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

N = 50
deg = 49

X = X = np.linspace(0, 2 * np.pi, N).reshape(-1, 1)
X = np.sort(X, axis=0)
y = np.sin(X) + np.random.randn(N, 1) * 0.2

poly_features = PolynomialFeatures(degree=deg, include_bias=False)

X_poly = poly_features.fit_transform(X)

reg = LinearRegression()
reg.fit(X_poly, y)

y_vals = reg.predict(X_poly)

plt.scatter(X, y)
plt.plot(X, y_vals, color='r')
plt.show()

你能解释一下我在这里的误解吗?

machine-learning regression linear-regression polynomials
1个回答
0
投票

我认为由于舍入误差,拟合效果很差。如果将样本数量降低到 10,将阶数降低到 9,就会得到完美拟合。

但是糟糕的合身质量确实让我感到惊讶。它来自

np.linalg.lstsq
,由
LinearRegression
在幕后使用。您可以使用以下代码看到各种实现的差异:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

N = 50
deg = 49

X = X = np.linspace(0, 2 * np.pi, N).reshape(-1, 1)
X = np.sort(X, axis=0)
y = np.sin(X) + np.random.randn(N, 1) * 0.2

poly_features = PolynomialFeatures(degree=deg, include_bias=True)
X_poly = poly_features.fit_transform(X)

beta_blue = np.linalg.solve(X_poly.transpose().dot(X_poly), X_poly.transpose().dot(y))
y_blue = X_poly.dot(beta_blue)

beta_green = np.linalg.lstsq(X_poly, y, rcond=0)[0]  # rcond=None, rcond=-1
y_green = X_poly.dot(beta_green)

beta_magenta = np.linalg.pinv(X_poly.transpose().dot(X_poly)).dot(X_poly.transpose().dot(y))
y_magenta = X_poly.dot(beta_magenta)

reg = LinearRegression()
reg.fit(X_poly, y)
y_vals = reg.predict(X_poly)

plt.scatter(X, y)
plt.plot(X, y_vals, color='r')
plt.plot(X, y_blue, color='b')
plt.plot(X, y_green, color='g')
plt.plot(X, y_magenta, color='m')
plt.show()

红色曲线并非从零开始,因为

LinearRegression
适合额外的截距。因此,与其他方法相比,
np.linalg.solve
似乎对不适条件的敏感度要低得多,至少在这种情况下是这样。如果您消除噪声(将 0.2 设置为 0.0)而其他方法仍然失败,它会提供完美的拟合。

即使在使用上面代码中的这一行关闭噪音后,也只有

np.linalg.solve
可以工作:

y = np.sin(X) + np.random.randn(N, 1) * 0.2

© www.soinside.com 2019 - 2024. All rights reserved.