【AI】SVM分类器

Saturday, September 2, 2023
本文共666字
2分钟阅读时长
posts , AI
杂谈 , AI , SVM

⚠️本文是作者P3troL1er原创,首发于https://peterliuzhi.top/posts/aisvm%E5%88%86%E7%B1%BB%E5%99%A8/。商业转载请联系作者获得授权,非商业转载请注明出处!

If you live to be a hundred, I want to live to be a hundred minus one day, so I never have to live without you. — A. A. Milne

概念

支持向量机是一种二类分类模型,它的基本思想是在特征空间中寻找一个超平面,使得两类数据在该超平面两侧并距离超平面尽可能远。这个超平面被称为“决策平面”,它试图找到一个最优的决策边界,使得最近的数据点到这个边界的距离(即“间隔”)最大化。这些距离决策平面最近的数据点被称为“支持向量”。

更多可见:

总之,支持向量机的目的是找到能将两个类一刀切开的超平面,为此可以将数据点映射到高维使其可分。而核技巧是为了减缓从低维映射到高维的维度爆炸导致的计算困难。

关于超平面可以阅读:

代码实现

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, f1_score

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 查看数据集中的不同类别
unique_labels = np.unique(y)
# 随机选择两种类别
selected_labels = np.random.choice(unique_labels, 2, replace=False)
# 选取这两种类别的数据
X = X[np.isin(y, selected_labels)]
y = y[np.isin(y, selected_labels)]
X = X[:, :2]
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化SVC
clf = SVC(kernel='linear', C=1)  # 这里我们使用线性核,你也可以选择其他的,例如:'rbf', 'poly'等
# 训练模型
clf.fit(X_train, y_train)
# 预测
y_pred = clf.predict(X_test)
# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy * 100:.2f}%")
f1 = f1_score(y_test, y_pred, pos_label=max(y_test))
print(f"f1: {f1 * 100:.2f}%")
# 绘制散点图
plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)
# 绘制决策边界
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()

# 创建网格来评估模型
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)

# 绘制决策边界和边距
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])

# 绘制支持向量
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, facecolors='none', edgecolors='k')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('SVM Decision Boundary with Support Vectors')
plt.show()

文内图片