您的位置:首页 > 其它

支持向量机 (SVM) 以及 sklearn 实现

2017-11-27 23:06 281 查看

支持向量机

支持向量机是一种非常强大的分类算法,它可以实现分两类,也可以实现分成多类,支持向量机与核函数的配合成功解决了逻辑回归表现出的不足之处,是数据挖掘的十大算法之一。

对于分成两类的支持向量机

在线性回归或者逻辑回归中,我们都是希望找到一个超级平面把两类不同的样本点分隔开,但是分割的线的位置我们无法确定,因为有可能存在好多这样的平面符合题意。我们最希望找到的还是“最中间”的那一个超平面。

设超平面的方程为 f(x) = wx + b;

其中 w 是平面的法向量,

又点到平面的距离公式我们可以得到点到直线的距离为 r = |wx + b| / ||w|| 假设超平面可以正确分类。wx + b >= 0 正类 wx + b < 0 反类在支持向量机中 我们为了让边界划分的更明显一点我们让 wx + b >=1 正类 wx + b <= -1 反类。

下面介绍一下支持向量的概念,支持向量就是正负样本点中距离超平面最近的两个点构成的,我们的目的也是使得这两个距离相等且使他们距离超平面的距离最大,这就是支持向量机的基本思想

用数学的方式表达就是

我们假设正样本点为 1 负样本点标记为 -1 支持向量机就是使得 2 / ||w|| (两个的距离之和) 最大同时满足

y * (wx + b) >=1 这样两个条件。最小化这个可以调包,也可以自己用拉格朗日插值法和偏导数算。

上面所说的支持向量机只能用于线性边界的分类,对于非线性边界的分类我们需要用支持向量机配合核函数一起使用。核函数是一种描述相似程度的函数,一般我们使用高斯核函数或者线性核函数(这取决于你的数据和特征的多少)这个函数必须满足 核函数构成的函数s (x1,x2)必须是 满足对称性的就是 s(x1,x2)组成的矩阵必须是半正定矩阵,因为在一些数值优化中必须要用到这个性质。

说一下核函数的原理,对于普通的支持向量机而言,它只能区分线性边界,有一个定理说的是对于有限维的特征值而言,一定可以找到一个有限高维平面使得这些点线性可分,使用核函数的过程实际上就是找这个高维平面的过程,但是我们在实际中不一定能找到正好的,核函数也就成了一种猜测但是往往效果很好。

对于高斯函数里的两个参数 C 和 a 这两个参数影响的是方差和偏差,C越大方差越大 (越可能过拟合) a 越大越可能欠拟合(a、C)相反(这里也可以称之为软边界问题)。

对于分成多类的问题,与逻辑回归一样,我们可以使用 one vs all 的方法,训练 n 个支持向量机,然后对于一个新输入的特征 x 而言,我们可以让它与这n个训练好的支持向量机作用选择一个最大的输出即可。(我猜意义应该是概率最大,但是我不是很确定)

实现代码 :

from sklearn import datasets
from sklearn import svm

iris = datasets.load_iris ()
digits = datasets.load_digits ()

clf = svm.SVC(gamma=0.001, C=100.)
print (clf.fit (digits.data[:-1], digits.target[:-1]))
print (clf.predict(digits.data[-1:]) )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习