SVM算法的学习策略就是间隔最大化,是求解凸二次规划的最优化算法,也等价于正则化的合页损失函数的最小化问题。
SVM适合中小规模的数据,预测时不能给出具体的概率结果
支持向量机包含三种模型:1、线性可分支持向量机;
2、线性支持向量机;
3、非线性支持向量机;
SVM算法的优缺点:
优点:泛化错误率低,计算开销不大,结果易理解;
缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二分类问题
SVM算法的python实现:
(这里直接用的sklearn中的API,参考视频中的代码)
1 #coding=utf-8 2 3 import numpy as np 4 import pylab as pl 5 from sklearn import svm 6 from matplotlib.colors import ListedColormap 7 8 svc = svm.SVC(kernel=‘linear‘) # 线性核 9 # svc = svm.SVC(kernel=‘poly‘) # 多项式核 10 # svc = svm.SVC(kernel=‘rbf‘) # 高斯核(RBF) 11 12 # 鸢尾花数据集是sklearn自带的。 13 from sklearn import datasets 14 iris = datasets.load_iris() 15 # 只提取前面两列数据作为特征 16 X = iris.data[:, :2] 17 y = iris.target 18 19 # 因为鸢尾花是3分类问题,我们要对样本和预测结果均用三种颜色区分开。 20 cmap_light = ListedColormap([‘#FFAAAA‘, ‘#AAFFAA‘, ‘#AAAAFF‘]) 21 cmap_bold = ListedColormap([‘#FF0000‘, ‘#00FF00‘, ‘#0000FF‘]) 22 23 # 基于分类器对预测结果与原始标签进行可视化 24 def plot_estimator(estimator, X, y): 25 estimator.fit(X, y) # 基于这些数据训练出一个支持向量分离器SVC 26 # 确定网格最大最小值作为边界 27 x_min, x_max = X[:, 0].min() - .1, X[:, 0].max() + .1 28 y_min, y_max = X[:, 1].min() - .1, X[:, 1].max() + .1 29 # 产生网格节点 30 xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), 31 np.linspace(y_min, y_max, 100)) 32 # 基于分离器,对网格节点做预测 33 # 多分类的工作方式就是"one versus one" :在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM 34 # 当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别 35 Z = estimator.predict(np.c_[xx.ravel(), yy.ravel()]) 36 37 # 对预测结果上色 38 Z = Z.reshape(xx.shape) 39 pl.figure() 40 pl.pcolormesh(xx, yy, Z, cmap=cmap_light) 41 # 同时对原始训练样本上色 42 pl.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold) 43 pl.axis(‘tight‘) 44 pl.axis(‘off‘) 45 pl.tight_layout() 46 pl.show() 47 48 # 测试SVM算法 49 plot_estimator(svc, X, y)