一、理论知识
1. 什么是支持向量机(SVM)
线性支持向量机(Linear Support Vector Machine,简称线性SVM)是一种常见的机器学习算法,主要用于二分类和多分类问题。其目标是找到一个最优的超平面,将不同类别的样本分隔开,并最大化两个类别之间的间隔。
2. 什么是支持向量
在支持向量机(SVM)算法中,支持向量是指被划分为不同类别的样本中,离分类超平面最近的一些点。这些点对分类超平面的位置和方向起着关键的支持作用。
二、代码实现
1. 导入基本库
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
2. 选取鸢尾花的两个特征
iris = datasets.load_iris()
X = iris.data
y = iris.target
X = X[y < 2, :2] # 选择类别0和1,并取前两个特征
y = y[y < 2] # 选择类别0和1
# 绘制类别0和1的点
plt.scatter(X[y == 0, 0], X[y == 0, 1], color='red')
plt.scatter(X[y == 1, 0], X[y == 1, 1], color='blue')
plt.show()
3. 训练SVM模型
# 标准化
standardScaler = StandardScaler()
standardScaler.fit(X) # 计算训练数据的均值和方差
X_standard = standardScaler.transform(X) # 使用均值和方差对X进行标准化
svc = LinearSVC(C=1e9) # 创建线性SVM分类器
svc.fit(X_standard, y) # 训练SVM模型
使用StandardScaler对特征进行标准化处理,使得特征具有零均值和单位方差。这有助于提高模型的性能和收敛速度。
def plot_decision_boundary(model, axis):
x0, x1 = np.meshgrid(
np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) * 100)).reshape(-1, 1),
np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) * 100)).reshape(-1, 1)
)
X_new = np.c_[x0.ravel(), x1.ravel()]
y_predict = model.predict(X_new)
zz = y_predict.reshape(x0.shape)
from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#EF9A9A', '#FFF59D', '#90CAF9'])
plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
# 绘制决策边界
plot_decision_boundary(svc, axis=[-3, 3, -3, 3])
# 绘制原始数据
plt.scatter(X_standard[y == 0, 0], X_standard[y == 0, 1], color='red')
plt.scatter(X_standard[y == 1, 0], X_standard[y == 1, 1], color='blue')
plt.show()
5. 调整参数C
svc2 = LinearSVC(C=0.05)
svc2.fit(X_standard, y)
plot_decision_boundary(svc2, axis=[-3, 3, -3, 3])
# 绘制原始数据
plt.scatter(X_standard[y == 0, 0], X_standard[y == 0, 1], color='red')
plt.scatter(X_standard[y == 1, 0], X_standard[y == 1, 1], color='blue')
plt.show()
在支持向量机中,参数C用于调整正则化的强度。正则化有助于控制模型复杂度,防止过拟合。较小的C值会导致更强的正则化,使模型选择更简单的分类器;而较大的C值会降低正则化强度,使模型选择更复杂的分类器。
三、总结
支持向量机(SVM)是一种强大的机器学习算法,尤其适用于具有明显类别间隔的数据集。核函数的选择依赖于数据的线性可分性,线性核适用于线性问题,而非线性核适用于复杂的数据结构。通过调整参数C,可以在模型复杂度和错误惩罚之间找到平衡。使用可视化工具(如matplotlib),可以更好地理解模型的决策过程和性能。在实际应用中,需要平衡模型的复杂度和泛化能力,以避免过拟合或欠拟合。