您的位置:

Python SVM学习笔记

一、SVM简介

支持向量机(Support Vector Machine, 简称SVM)是一种二分类模型,它的基本模型定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机。SVM通过间隔最大化的训练方法得到参数,从而优化整个线性分类器的泛化能力。

SVM将原始特征空间映射到一个高维特征空间,从而找到一个最优的超平面(一组更好的决策函数)区分不同类别的样本点。具体而言,SVM通过在高维空间中找到最能区分两类数据的超平面,并将该超平面作为分类的决策函数。

二、SVM分类的数学原理

SVM分类的升维是通过核函数实现的。客户端将内核函数指定为参数,该参数可以是预定义的内核名称,如“linear”(线性内核)、“poly”(多项式内核)或“rbf”(径向基内核),也可以定义用户定义的内核。这样,SVM可以在更高的维度中发现到更好的决策面,然而也会导致产生许多参数,如定义内核的参数、SVM算法自身的参数。


# python实现SVM
# 导入必要模块
import sklearn
from sklearn import svm
from sklearn import datasets

# 导入数据
iris = datasets.load_iris()
X = iris.data[:, :2]  # 只使用前两个feature,方便绘制图像
y = iris.target

# 训练SVM分类器
C = 1.0  # SVM正则化参数
svc = svm.SVC(kernel='linear', C=C).fit(X, y)

# 绘制分类器的决策边界
import numpy as np
import matplotlib.pyplot as plt

# 首先画出样本点
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, edgecolors='k')
# 得到x_min, x_max, y_min, y_max用于绘图
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
# 生成网格点集
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max, 0.1))
# 用训练好的svm分类器做预测
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 将分类结果绘制出来
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.2)
# 绘制出支持向量
sv = svc.support_vectors_
plt.scatter(sv[:, 0], sv[:, 1], color='k', marker='x', linewidths='1', s=200)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.show()

三、SVM常用API

1. svm.SVC

使用支撑向量分类器(SVC)的方法进行分类。具有广义线性核和支持向量分类。


import numpy as np
from sklearn import svm
X = np.array([[0, 0], [1, 1], [1, 0], [0, 1]])
y = np.array([0, 0, 1, 1])
clf = svm.SVC()
clf.fit(X, y)

2. svm.NuSVC

使用Nu支持向量分类器(NuSVC)的方法进行分类。NuSVC是SVM算法的扩展,能处理不完全线性可分数据。适用于小样本的非线性分类任务。


import numpy as np
from sklearn import svm
X = np.array([[0, 0], [1, 1], [1, 0], [0, 1]])
y = np.array([0, 0, 2, 3])
clf = svm.NuSVC()
clf.fit(X, y)

3. svm.LinearSVC

使用支撑向量机(SVM)的线性分类问题的线性SVM。 可用于高维甚至低维空间中的大量样本。


import numpy as np
from sklearn.svm import LinearSVC
X = np.array([[0, 0], [1, 1], [1, 0]])
y = np.array([0, 1, 1])
clf = LinearSVC()
clf.fit(X, y)

4. svm.SVR

支持向量回归(SVR),用于拟合一个非线性的函数。可以进行任意维度空间中的分类,包括输入空间的非显式的特征空间。


import numpy as np
from sklearn.svm import SVR
n_samples, n_features = 10, 5
np.random.seed(0)
y = np.random.randn(n_samples)
X = np.random.randn(n_samples, n_features)
clf = SVR(C=1.0, epsilon=0.2)
clf.fit(X, y)

5. svm.NuSVR

Nu支持向量回归(NuSVR)是支持向量回归(SVR)的另一个实现。这是使用函数间隔而不是纯粹间隔进行数据划分的支持向量回归器。


import numpy as np
from sklearn.svm import NuSVR
n_samples, n_features = 10, 5
np.random.seed(0)
y = np.random.randn(n_samples)
X = np.random.randn(n_samples, n_features)
clf = NuSVR(C=1.0, nu=0.1, kernel='linear')
clf.fit(X, y)

四、SVM算法优缺点

1. 算法优点:

(1)可以解决高维问题,适用于维度较高的数据;

(2)可以解决非线性问题;

(3)泛化能力比较强。

2. 算法缺点:

(1)对于核函数的高维映射解释力不强;

(2)训练时间长;

(3)对于非线性问题,有时很难找到一个合适的核函数。

五、总结

本文对Python SVM算法进行了详细的介绍。SVM是一种有效的分类算法,在解决高维和非线性问题方面具有良好的效果。Python为我们提供了丰富的SVM库和API,能够方便地应用和调用SVM算法。