分类算法-支持向量机(SVM)

来源:互联网 发布:驱动中国双十一数据 编辑:程序博客网 时间:2024/05/21 09:04

支持向量机(Support Vector Machine,SVM)是Corinna Cortes和Vapnik等于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。

在机器学习中,支持向量机(SVM,还支持矢量网络)是与相关的学习算法有关的监督学习模型,可以分析数据,识别模式,用于分类和回归分析。

在机器学习中,支持向量机(SVM,还支持矢量网络)是与相关的学习算法有关的监督学习模型,可以分析数据,识别模式,用于分类和回归分析。给定一组训练样本,每个标记为属于两类,一个SVM训练算法建立了一个模型,分配新的实例为一类或其他类,使其成为非概率二元线性分类。一个SVM模型的例子,如在空间中的点,映射,使得所述不同的类别的例子是由一个明显的差距是尽可能宽划分的表示。新的实施例则映射到相同的空间中,并预测基于它们落在所述间隙侧上属于一个类别。

除了进行线性分类,支持向量机可以使用所谓的核技巧,它们的输入隐含映射成高维特征空间中有效地进行非线性分类。

这里写图片描述

图C的容忍度比较大,效果较好
这里写图片描述
越胖越好
这里写图片描述
我们要求一个点到一个超平面的距离
wTx’=-b,wTx”=-b
法向量w垂直于超平面就一定垂直于超平面上的线,于是w垂直于x”-x’
有wT(x”-x’)=0
向量x-x’映射到w单位方向上即x到平面距离
distance(x,b,w)=|wT/||w| * |(x-x’)|=1/||w||*|wTx+b|

数据集(x1,y1)(x2,y2)到(xn,yn)
Y为样本的类别,
当x为正例的时候Y=+1
当x为负例的时候Y=-1
y(x)=wT*φ(x)+b

y={1 如果w.z+b>0 -1如果w.z+b<0
保证预测值和真实值的乘积是正数
这里写图片描述

接下来我们要找所有样本中离切平面最近的点使它离切平面的距离最远
这里写图片描述

通过放缩乘1化简式子
下一步需要把求极大值转换成求极小值
这里写图片描述

很简单,只要把求它的极大值转换成求它倒数的极小值就好了
在这里需要变换一下,因为求w的模不方便,所以变成求w的平方,而为了之后计算方便在前面再加个1/2,对式子是没有影响的
约束条件是:yi(wT·φ(xi)+b)>=1
表示必须在把点分的开的情况下才能求
约束条件变成拉格朗日乘子法的标准约束
1-yi(wT·φ(xi)+b)<=0
变换之后:
g(x)=1-yi(wT·φ(xi)+b)
要求解的问题就变成了f(x)+αg(x)的min

这里写图片描述

转换成对偶问题求解
最大值中最小的肯定比最小值中最大的要大
先求最小值,也就是求偏导

这里写图片描述

这里写图片描述

这里写图片描述

例子:
这里写图片描述

这里写图片描述

求最小值,直接求导
这里写图片描述

这里写图片描述

问题延伸:
这里写图片描述

当有个别不合群点的时候就放弃掉,因为绝大多数还是很听话的

这里写图片描述

这里写图片描述

同上,步骤省略了……

支持向量机中核函数的应用:
这里写图片描述

这里写图片描述

这里写图片描述

应用SMO算法求解支持向量机
这里写图片描述

这里写图片描述
其中(xi,yi)表示训练样本数据,xi为样本特征,yi∈{-1,1}为样本标签,C为惩罚系数由自己设定。上述问题是要求解N个参数(α1,α2,α3,……,αN),其他参数均为已知,有多种算法可以对上述问题求解,但是算法复杂度均很大。但1988年,由Platt提出的序列最小最优化算法(SMO)可以高效的求解上述SVM问题,它把原始求解N个参数二次规划问题分解成很多个
子二次规划问题分别求解,每个子问题只需要求解2个参数,方法类似于坐标上升,节省时间成本和降低了内存需求。每次启发式选择两个变量进行优化,不断循环,直到达到函数最优值。

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

Python实现:

import matplotlib.pyplot as pltimport numpy as npfrom matplotlib.colors import ListedColormapdef plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):    # setup marker generator and color map    markers = ('s', 'x', 'o', '^', 'v')    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')    cmap = ListedColormap(colors[:len(np.unique(y))])    # plot the decision surface    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)    Z = Z.reshape(xx1.shape)    plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)    plt.xlim(xx1.min(), xx1.max())    plt.ylim(xx2.min(), xx2.max())    # plot class samples    for idx, cl in enumerate(np.unique(y)):        plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],alpha=0.8, c=cmap(idx),marker=markers[idx], label=cl)    # highlight test samples    if test_idx:        X_test, y_test = X[test_idx, :], y[test_idx]        plt.scatter(X_test[:, 0], X_test[:, 1], c='', alpha=1.0, linewidth=1, marker='o', s=55, label='test set')
from sklearn import datasetsimport numpy as npfrom sklearn.cross_validation import train_test_splitiris = datasets.load_iris() # 由于Iris是很有名的数据集,scikit-learn已经原生自带了。X = iris.data[:, [1, 2]]y = iris.target # 标签已经转换成0,1,2了X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # 为了看模型在没有见过数据集上的表现,随机拿出数据集中30%的部分做测试# 为了追求机器学习和最优化算法的最佳性能,我们将特征缩放from sklearn.preprocessing import StandardScalersc = StandardScaler()sc.fit(X_train) # 估算每个特征的平均值和标准差sc.mean_ # 查看特征的平均值,由于Iris我们只用了两个特征,所以结果是array([ 3.82857143,  1.22666667])sc.scale_ # 查看特征的标准差,这个结果是array([ 1.79595918,  0.77769705])X_train_std = sc.transform(X_train)# 注意:这里我们要用同样的参数来标准化测试集,使得测试集和训练集之间有可比性X_test_std = sc.transform(X_test)X_combined_std = np.vstack((X_train_std, X_test_std))y_combined = np.hstack((y_train, y_test))# 导入SVCfrom sklearn.svm import SVCsvm1 = SVC(kernel='linear', C=0.1, random_state=0) # 用线性核svm1.fit(X_train_std, y_train)svm2 = SVC(kernel='linear', C=10, random_state=0) # 用线性核svm2.fit(X_train_std, y_train)fig = plt.figure(figsize=(10,6))ax1 = fig.add_subplot(1,2,1)#ax2 = fig.add_subplot(1,2,2)plot_decision_regions(X_combined_std, y_combined, classifier=svm1)plt.xlabel('petal length [standardized]')plt.ylabel('petal width [standardized]')plt.title('C = 0.1')ax2 = fig.add_subplot(1,2,2)plot_decision_regions(X_combined_std, y_combined, classifier=svm2)plt.xlabel('petal length [standardized]')plt.ylabel('petal width [standardized]')plt.title('C = 10')plt.show()

这里写图片描述

svm1 = SVC(kernel='rbf', random_state=0, gamma=0.1, C=1.0) # 令gamma参数中的x分别等于0.110svm1.fit(X_train_std, y_train) svm2 = SVC(kernel='rbf', random_state=0, gamma=10, C=1.0) svm2.fit(X_train_std, y_train) fig = plt.figure(figsize=(10,6))ax1 = fig.add_subplot(1,2,1)plot_decision_regions(X_combined_std, y_combined, classifier=svm1)plt.xlabel('petal length [standardized]')plt.ylabel('petal width [standardized]')plt.title('gamma = 0.1')ax2 = fig.add_subplot(1,2,2)plot_decision_regions(X_combined_std, y_combined, classifier=svm2)plt.xlabel('petal length [standardized]')plt.ylabel('petal width [standardized]')plt.title('gamma = 10')plt.show()

这里写图片描述