支持向量回归(Support Vector Regression, SVR)是一种基于支持向量机(Support Vector Machine, SVM)的回归分析方法。它通过使用不同的核函数,如线性核、多项式核和径向基函数(RBF)核,来处理线性和非线性问题。本文将介绍如何使用Python的scikit-learn库来实现这些SVR模型,并展示一个一维数据回归的示例。
首先,需要生成一些样本数据来训练SVR模型。在这个例子中,将创建一个简单的一维数据集,其中目标值是输入值的正弦函数,并且在一些数据点上添加了一些噪声。
import numpy as np
# 生成输入数据
X = np.sort(5 * np.random.rand(40, 1), axis=0)
# 计算目标值
y = np.sin(X).ravel()
# 为部分数据点添加噪声
y[::5] += 3 * (0.5 - np.random.rand(8))
接下来,将使用三种不同的核函数来拟合SVR模型。这些模型包括使用RBF核的SVR、使用线性核的SVR和使用多项式核的SVR。将为每个模型设置不同的参数,以便观察它们在回归任务中的表现。
from sklearn.svm import SVR
# 使用RBF核的SVR
svr_rbf = SVR(kernel="rbf", C=100, gamma=0.1, epsilon=0.1)
# 使用线性核的SVR
svr_lin = SVR(kernel="linear", C=100, gamma="auto")
# 使用多项式核的SVR
svr_poly = SVR(kernel="poly", C=100, gamma="auto", degree=3, epsilon=0.1, coef0=1)
在拟合了SVR模型之后,可以绘制出模型的预测结果,并与原始数据进行比较。将为每种核函数绘制一个子图,并在图中显示支持向量和其它训练数据。
import matplotlib.pyplot as plt
# 设置图表的参数
lw = 2
svrs = [svr_rbf, svr_lin, svr_poly]
kernel_label = ["RBF", "Linear", "Polynomial"]
model_color = ["m", "c", "g"]
# 创建子图
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15, 10), sharey=True)
# 绘制每个模型的预测结果
for ix, svr in enumerate(svrs):
axes[ix].plot(X, svr.fit(X, y).predict(X), color=model_color[ix], lw=lw, label="{} model".format(kernel_label[ix]))
axes[ix].scatter(X[svr.support_], y[svr.support_], facecolor="none", edgecolor=model_color[ix], s=50, label="{} support vectors".format(kernel_label[ix]))
axes[ix].scatter(X[np.setdiff1d(np.arange(len(X)), svr.support_)], y[np.setdiff1d(np.arange(len(X)), svr.support_)], facecolor="none", edgecolor="k", s=50, label="other training data")
axes[ix].legend(loc="upper center", bbox_to_anchor=(0.5, 1.1), ncol=1, fancybox=True, shadow=True)
# 设置图表的标题和标签
fig.text(0.5, 0.04, "data", ha="center", va="center")
fig.text(0.06, 0.5, "target", ha="center", va="center", rotation="vertical")
fig.suptitle("Support Vector Regression", fontsize=14)
# 显示图表
plt.show()
通过上述代码,可以看到不同核函数的SVR模型在一维数据回归任务中的表现。RBF核的SVR模型通常能够更好地处理非线性问题,而线性核和多项式核的SVR模型则更适合处理线性问题。通过比较这些模型的预测结果,可以更好地理解它们在不同情况下的适用性。
整个脚本的运行时间大约为0.439秒。可以通过以下链接下载Jupyter笔记本、Python源代码或压缩包: