如何用Python生成指定数据以输入SVM模型
嵌套高斯+抛物线类数据生成与SVM实现方案
1. 数据生成代码
先搞定两类数据的生成,嵌套高斯用两个不同均值/方差的正态分布,抛物线类加噪声模拟真实场景:
import numpy as np import matplotlib.pyplot as plt from sklearn.svm import SVC from sklearn.preprocessing import StandardScaler # 生成嵌套高斯数据(两类) np.random.seed(42) # 内圈高斯 inner_gauss = np.random.normal(loc=[0, 0], scale=0.5, size=(200, 2)) inner_labels = np.zeros(200) # 标签0 # 外圈高斯 outer_gauss = np.random.normal(loc=[0, 0], scale=2, size=(200, 2)) outer_labels = np.ones(200) # 标签1 # 生成抛物线类数据(红色类,标签2) x_parab = np.random.uniform(low=-2.5, high=2.5, size=200) y_parab = x_parab ** 2 + np.random.normal(loc=0, scale=0.3, size=200) parab_data = np.column_stack((x_parab, y_parab)) parab_labels = np.full(200, 2) # 标签2
2. 数据合并与预处理
合并时要确保数据维度一致,标签长度和样本数匹配,同时标准化数据(SVM对特征尺度敏感):
# 合并所有数据和标签 X = np.vstack((inner_gauss, outer_gauss, parab_data)) y = np.hstack((inner_labels, outer_labels, parab_labels)) # 标准化特征(SVM必备步骤) scaler = StandardScaler() X_scaled = scaler.fit_transform(X)
3. SVM训练与可视化
用RBF核处理非线性分类问题,训练后可视化决策边界:
# 初始化SVM分类器 svm_clf = SVC(kernel='rbf', C=10, gamma=0.5, random_state=42) svm_clf.fit(X_scaled, y) # 可视化数据和决策边界 plt.figure(figsize=(10, 8)) # 绘制原始数据 plt.scatter(inner_gauss[:, 0], inner_gauss[:, 1], c='blue', label='Inner Gauss') plt.scatter(outer_gauss[:, 0], outer_gauss[:, 1], c='green', label='Outer Gauss') plt.scatter(parab_data[:, 0], parab_data[:, 1], c='red', label='Parabola') # 生成网格点绘制决策边界 xx, yy = np.meshgrid(np.linspace(-3, 3, 300), np.linspace(-1, 7, 300)) Z = svm_clf.predict(scaler.transform(np.column_stack((xx.ravel(), yy.ravel())))) Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, alpha=0.3, cmap='coolwarm') plt.legend() plt.xlabel('X1') plt.ylabel('X2') plt.title('Nested Gauss + Parabola Data with SVM Decision Boundary') plt.show()
常见问题排查
- 维度不匹配:合并前检查每个数据集的形状,确保都是(n,2)的二维数组,避免用一维数组直接合并。
- 标签长度不一致:确认每个类的样本数和标签数组长度一致,
np.hstack会自动检查长度,不匹配会报错。 - 分类效果差:调整SVM的
C(正则化强度)和gamma(RBF核带宽)参数,C越大容错越低,gamma越大局部拟合越强。 - 特征未标准化:SVM基于距离计算,特征尺度差异大会导致模型偏向尺度大的特征,必须先标准化。
内容的提问来源于stack exchange,提问作者Hrant Baloyan
相关产品推荐
相关产品推荐

