SVM(Python代码)

本文通过Sklearn库详细介绍了支持向量机(SVM)的基本原理和使用方法,包括线性核函数的SVC分类器,支持向量的查找,以及如何在可视化中展示划分超平面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# sklearn 库中导入 svm 模块
from sklearn import svm

# 定义三个点和标签
X = [[2, 0], [1, 1], [2,3]]
y = [0, 0, 1]
# 定义分类器,clf 意为 classifier,是分类器的传统命名
clf = svm.SVC(kernel = 'linear')  # .SVC()就是 SVM 的方程,参数 kernel 为线性核函数
# 训练分类器
clf.fit(X, y)  # 调用分类器的 fit 函数建立模型(即计算出划分超平面,且所有相关属性都保存在了分类器 cls 里)
# 打印分类器 clf 的一系列参数
print(clf)
# 支持向量
print(clf.support_vectors_)
# 属于支持向量的点的 index 
print(clf.support_)
# 在每一个类中有多少个点属于支持向量
print(clf.n_support_) 
# 预测一个新的点
print(clf.predict([[2,0]]))

print(__doc__)
# 导入相关的包
import numpy as np
import pylab as pl  # 绘图功能
from sklearn import svm

# 创建 40 个点
np.random.seed(0) # 让每次运行程序生成的随机样本点不变
# 生成训练实例并保证是线性可分的
# np._r表示将矩阵在行方向上进行相连
# random.randn(a,b)表示生成 a 行 b 列的矩阵,且随机数服从标准正态分布
# array(20,2) - [2,2] 相当于给每一行的两个数都减去 2
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
# 两个类别 每类有 20 个点,Y 为 40 行 1 列的列向量
Y = [0] * 20 + [1] * 20

# 建立 svm 模型
clf = svm.SVC(kernel='linear')
clf.fit(X, Y)

# 获得划分超平面
# 划分超平面原方程:w0x0 + w1x1 + b = 0
# 将其转化为点斜式方程,并把 x0 看作 x,x1 看作 y,b 看作 w2
# 点斜式:y = -(w0/w1)x - (w2/w1)
w = clf.coef_[0]  # w 是一个二维数据,coef 就是 w = [w0,w1]
a = -w[0] / w[1]  # 斜率
xx = np.linspace(-5, 5)  # 从 -5 到 5 产生一些连续的值(随机的)
# .intercept[0] 获得 bias,即 b 的值,b / w[1] 是截距
yy = a * xx - (clf.intercept_[0]) / w[1]  # 带入 x 的值,获得直线方程

# 画出和划分超平面平行且经过支持向量的两条线(斜率相同,截距不同)
b = clf.support_vectors_[0] # 取出第一个支持向量点
yy_down = a * xx + (b[1] - a * b[0]) 
b = clf.support_vectors_[-1] # 取出最后一个支持向量点
yy_up = a * xx + (b[1] - a * b[0])

# 查看相关的参数值
print("w: ", w)
print("a: ", a)
print("support_vectors_: ", clf.support_vectors_)
print("clf.coef_: ", clf.coef_)

# 在 scikit-learin 中,coef_ 保存了线性模型中划分超平面的参数向量。形式为(n_classes, n_features)。若 n_classes > 1,则为多分类问题,(1,n_features) 为二分类问题。

# 绘制划分超平面,边际平面和样本点
pl.plot(xx, yy, 'k-')
pl.plot(xx, yy_down, 'k--')
pl.plot(xx, yy_up, 'k--')
# 圈出支持向量
pl.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
           s=80, facecolors='none')
pl.scatter(X[:, 0], X[:, 1], c=Y, cmap=pl.cm.Paired)

pl.axis('tight')
pl.show()

<think>好的,我现在需要帮助用户解决关于如何用Python编写支持向量机(SVM代码的问题。用户提到了示例和实现,所以我应该提供一个清晰的步骤和代码示例。首先,我应该回顾一下SVM的基本原理和实现步骤,确保自己理解正确。 用户提供的引用中有几个相关的资料,比如引用[1]、[2]、[3]、[4]。这些引用提到了使用Python实现SVM的示例、数据生成、核函数设置等。我需要整合这些信息,确保代码正确并符合最佳实践。 首先,SVMPython中通常使用scikit-learn库中的SVC类实现。引用[4]中提到了如何设置不同的核函数,比如线性、多项式、RBF等。所以,我应该包括导入库、数据准备、模型训练和评估的步骤。 接下来,数据生成部分。引用[3]中有生成环形数据的代码,使用np.meshgrid和np.arange生成网格点,然后根据x² + y² < 0.8来分类。这可能是一个二分类问题,适合SVM处理。不过用户可能需要一个更通用的示例,比如使用scikit-learn内置的数据集,比如鸢尾花数据集或者make_classification生成的数据。但考虑到用户引用中的例子,可能更倾向于生成合成数据。 然后,模型训练部分需要包括数据分割(train_test_split)、模型初始化(如SVC(kernel='rbf'))、训练(fit方法)和预测(predict)。评估指标如准确率、混淆矩阵等也需要提及。 另外,可视化部分对于理解模型效果很重要。引用[1]和[2]提到绘制结果,所以可能需要使用matplotlib绘制决策边界和支持向量。这可以通过meshgrid创建网格点,模型预测每个点的类别,然后绘制等高线图。 需要注意的是,代码的每一步都要有注释,解释其作用,方便用户理解。同时,要确保代码的语法正确,比如正确导入库,正确处理数据格式等。 用户可能的问题包括如何选择核函数、调整超参数(如C、gamma)、处理多分类问题等。但根据当前问题,主要需要实现一个基础的SVM分类器示例,因此应聚焦于基本实现步骤。 现在,检查是否有遗漏的部分。例如,数据标准化是否必要?SVM对特征缩放敏感,所以可能需要加入StandardScaler进行标准化处理。但用户提供的引用中没有提到这点,但为了模型性能,应该包括进去。 最后,总结步骤,确保逻辑清晰,代码可运行,并附上相关解释。此外,生成相关问题,帮助用户进一步学习,比如参数调优、核函数选择等。</think>### Python实现支持向量机(SVM)代码详解 #### 1. 基础实现步骤 1. **导入库与数据生成** 使用`numpy`生成环形分布数据集,模拟二分类任务: ```python import numpy as np from sklearn.model_selection import train_test_split # 生成环形数据 h = 0.1 x_min, x_max = -1, 1 y_min, y_max = -1, 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) X = np.column_stack((xx.ravel(), yy.ravel())) y = (X[:, 0]**2 + X[:, 1]**2 < 0.8).astype(int) # 环形分类边界 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) ``` 2. **模型训练与预测** 通过`sklearn.svm.SVC`实现,选择RBF核函数: ```python from sklearn.svm import SVC from sklearn.preprocessing import StandardScaler # 数据标准化 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 训练SVM模型 svm = SVC(kernel='rbf', C=1.0, gamma='scale') svm.fit(X_train_scaled, y_train) accuracy = svm.score(X_test_scaled, y_test) print(f"测试集准确率: {accuracy:.2f}") ``` 3. **可视化决策边界** 使用`matplotlib`展示分类效果: ```python import matplotlib.pyplot as plt # 生成网格点 Z = svm.decision_function(scaler.transform(X)) Z = Z.reshape(xx.shape) # 绘制决策边界和支持向量 plt.contourf(xx, yy, Z > 0, alpha=0.4) plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolors='k') plt.scatter(svm.support_vectors_[:, 0], svm.support_vectors_[:, 1], facecolors='none', edgecolors='r', label='支持向量') plt.title('SVM决策边界可视化') plt.legend() plt.show() ``` #### 2. 核心参数说明 - **`kernel`**: 核函数类型(`linear`/`poly`/`rbf`/`sigmoid`)[^4] - **`C`**: 正则化参数,控制分类器复杂度(值越大对误分类惩罚越强) - **`gamma`**: RBF核的带宽参数,影响数据映射到高维空间的分布 #### 3. 进阶应用示例 实现自定义核函数(引用[4]): ```python from sklearn.metrics.pairwise import pairwise_kernels def custom_kernel(X, Y): return np.dot(X, Y.T) + 1 # 线性核的变体 svm_custom = SVC(kernel=custom_kernel) svm_custom.fit(X_train_scaled, y_train) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值