目录
导言
在机器学习领域中,支持向量机(Support Vector Machine,简称SVM)是一种广泛应用于分类、回归和异常检测等问题的强大算法。它通过在数据集中找到一个最优超平面来进行分类或回归,同时尽可能地将不同类别的样本分隔开。这一算法的独特性质和高效性能使得它成为机器学习中最受欢迎的算法之一。
SVM的核心思想是使用一个超平面(即一条线)来将不同类别的样本分隔开。而最优超平面则是在所有可能的超平面中,能够最大化两个不同类别间距离的那个超平面。这个间距被称为“边界”(margin)。当然,实际情况中数据往往是非线性的,这时候我们可以通过核函数来将其映射到高维空间中,从而得到更好的分类结果。
SVM在实际应用中有着广泛的应用,例如图像识别、生物信息学、金融预测和文本分类等。在图像识别中,SVM能够对图像进行特征提取和分类,识别出图像中的不同物体;在生物信息学中,SVM能够帮助研究人员分析基因数据、预测蛋白质结构等;在金融预测中,SVM能够对股票价格进行预测,提供决策支持;在文本分类中,SVM能够将文本分为不同的类别,例如垃圾邮件和正常邮件。
最大间隔与分类
最大间隔是指将不同类别样本分隔开的超平面与各个类别最接近的样本之间的距离。SVM的目标是找到一个最优超平面,使得这个间隔最大化。通过选择具有最大间隔的超平面,可以提高分类器的鲁棒性和泛化能力,减少误分类的可能性。最大间隔分类是SVM的一个重要特性。当数据线性可分时,SVM能够找到一个唯一的最大间隔超平面,完全将不同类别的样本分开。而当数据不是线性可分时,SVM使用核函数将数据映射到高维空间,从而在高维空间中找到一个超平面,实现更好的分类效果。
因此,如果映射到图中就是:
在样本空间中寻找一个超平面,将两类样本分隔开
在不同维度下,支持向量机的形式:
最大间隔化的推导过程:
根据图中的推导过程,发现优化后的值为:
对偶问题
等式约束
给定一个目标函数 f : Rn→R,希望找到xRn ,在满足约束条件g(x)=0的前提 下,使得f(x)有最小值。该约束优化问题记为:
可建立拉格朗日函数:
其中 λ 称为拉格朗日乘数。因此,可将原本的约束优化问题转换成等价的 无约束优化问题:
分别对待求解参数求偏导,可得:一般联立方程组可以得到相应的解。
最大间隔问题的拉格朗日乘法
第一步:引入拉格朗日乘子ai≥ 0得到拉格朗日函数
第二步:令L(w,b,α) 对w和b的偏导为零
核函数
有这样的一个问题,不存在一个超平面,能把两类样本正确地分割开,这时就引入了升维的概念。
图例:
核支持向量机
·
软间隔与正则化
实际应用中,很难选择合适的核函数,使样本在特征空间中线性可 分; 此外,线性可分的结果也很难断定是否是由过拟合造成的.所以引入“软间隔”的概念, 允许SVM在一些样本上不满足约束.
这样子不至于过拟合,存在合理的误差,有助于模型的深度应用。
基本思路:最大化间隔的同时, 让不满足约束的样本应尽可能少.
其中C>0为惩罚参数;L0/1是”0/1损失函数”
替代损失
LOSS
支持向量机的回归
模型demo
import numpy as np
import pylab as plt
from sklearn import svm
#随机生成两组数据
np.random.seed(0)#使每次产生随机数不变
X = np.r_[np.random.randn(20,2)-[2,2],np.random.randn(20,2)+[2,2]]
#np.r_是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等,np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等
Y = [0] * 20+[1] * 20
#拟合模型
clf = svm.SVC(kernel='linear')
clf.fit(X,Y)
# 获得分隔超平面
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-5,5)#产生-5到5的线性连续值,间隔为1
yy = a * xx - (clf.intercept_[0]) / w[1] #(clf.intercept_[0])/w[1]指的是直线的截距
#clf.intercept_[0]指的是w3,即为公式a1*x1+a2*x2+w3中的w3。
#得出支持向量的方程
b = clf.support_vectors_[0]
yy_down = a * xx + (b[1] - a * b[0])#(b[1]-a*b[0])就是计算截距
b = clf.support_vectors_[-1]
yy_up = a * xx +(b[1] - a * b[0])
print("w:",w) #打印出权重系数
print("a:",a) #打印出斜率
print("suport_vectors_:",clf.support_vectors_)#打印出支持向量
print("clf.coef_:",clf.coef_) #打印出权重系数
#绘制图形
plt.figure()
plt.plot(xx,yy,'k-')
plt.plot(xx,yy_down,'k--') #绘制下边界
plt.plot(xx,yy_up,'k--') #绘制上边界
plt.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,0],s = 30,facecolors='none')
plt.scatter(X[:,0],X[:,1],c=Y,cmap=plt.cm.Spectral)
plt.axis('tight')
plt.show()
运行结果: