一、定义
多项式核函数: 将数据映射到高维空间,从而实现 低维线性不可分 到 高维线性可分
二、核心代码介绍
1、关于 PolynomialFeatures(degree=3) : 三次多项式核函数
2、关于 svm_clf.decision_function : 推理
三、代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.preprocessing import PolynomialFeatures
from sklearn.svm import SVC
def generate_non_linear_data():
# 生成线性不可分的二维数据
X, y = make_moons(n_samples=100, noise=0.15, random_state=42)
return X, y
def plot_original_data(X, y):
# 绘制原始数据(处理前)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
plt.title("Original Data (Not Linearly Separable)")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
def train_svm_with_polynomial_kernel(X, y,degree=3):
# 创建多项式核函数对象(将数据映射到更高维度)
poly_kernel = PolynomialFeatures(degree=degree)
X_poly = poly_kernel.fit_transform(X)
# 使用支持向量机分类器(SVC)进行训练
svm_clf = SVC(kernel="linear")
svm_clf.fit(X_poly, y)
return svm_clf,poly_kernel
def plot_transformed_data(svm_clf,poly_kernel, X, y):
# 创建一个网格来覆盖数据的特征空间
xx, yy = np.meshgrid(np.linspace(X[:, 0].min(), X[:, 0].max(), 200),
np.linspace(X[:, 1].min(), X[:, 1].max(), 200))
# 对网格中的每个点进行预测,确定其所属类别
Z = svm_clf.decision_function(poly_kernel.transform(np.c_[xx.ravel(), yy.ravel()]))
Z = Z.reshape(xx.shape)
# 绘制处理后的数据(处理后)
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
plt.title("Transformed Data (Linearly Separable)")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
def main():
# 生成非线性数据
X, y = generate_non_linear_data()
# 绘制原始数据
plt.figure(figsize=(25, 5))
plt.subplot(1, 4, 1)
plot_original_data(X, y)
# 训练 SVM 模型并绘制决策边界
svm_clf,poly_kernel = train_svm_with_polynomial_kernel(X, y,3)
plt.subplot(1, 4, 2)
plot_transformed_data(svm_clf, poly_kernel,X, y)
svm_clf,poly_kernel = train_svm_with_polynomial_kernel(X, y,4)
plt.subplot(1, 4, 3)
plot_transformed_data(svm_clf, poly_kernel,X, y)
svm_clf,poly_kernel = train_svm_with_polynomial_kernel(X, y,5)
plt.subplot(1, 4, 4)
plot_transformed_data(svm_clf, poly_kernel,X, y)
plt.tight_layout()
plt.show()
if __name__ == "__main__":
main()
结果展示:
四、分析
三次多项式核函数:将数据映射到三次多项式特征空间,形式是 (x * x' + c)^3
四次多项式核函数:将数据映射到四次多项式特征空间,形式为 (x * x' + c)^4
总结:
增加多项式的次数可以 增加模型的拟合能力,但也会增加计算复杂性和过拟合的风险