机器学习之支持向量机(SVM) (一)

来源:互联网 发布:淘宝联盟社区在哪里 编辑:程序博客网 时间:2024/05/16 15:09

写这篇博客其实我倍感压力,因为我把对偶式推出来后就不知道怎么做了,而且发现好像在应用这块,都没有用到对偶式,也许是应用的例子太简单或者是svm的包封装的太完善。总之,我倍感压力。
注:本文写的是线性可分的情况

一、理论

这里写图片描述

这里写图片描述

其中,对偶式推导如下:
这里写图片描述

后面我也不知道怎么做了,所以结合应用来感受一下吧。当然,这个例子比较浅,纯粹感受一下。

二、实践

假设我们有如下两类样本:
这里写图片描述
有以下待测试样本:
这里写图片描述
需要通过svm对其进行分类。

所以我们开始构建SVM:

# -*- coding: utf-8 -*-from sklearn import svmimport numpy as npimport pylab as plnp.random.seed(0)a = np.random.randn(20,2) - [2,2] #产生一个20行2列的随机数,且满足标准正态分布(0,1),均值为0,标准差为1. 然后将均值改为-2,标准差不变b = np.random.randn(20,2) + [2,2] #与上面类似X = np.r_[a,b] #按行来组合两个矩阵Y = [0] * 20 + [1] * 20 #标签#print a#print X,X.shape#print Yclassifier = svm.SVC(kernel = 'linear')classifier.fit(X,Y)print '支持向量:',classifier.support_vectors_#得到支持向量在X中的indexprint '支持向量在样本中的位置:',classifier.support_#得到支持向量的数量print '支持向量的个数:',classifier.n_support_w = classifier.coef_[0] #coefficient:系数k = -w[0] / w[1] #斜率   w0x + w1y + b = 0,则 y = -(w0/w1)x - (b/w1)b = classifier.intercept_[0]x = np.linspace(-5,5)y = k * x - b / w[1]  #最大边缘超平面(在这里是线)#计算左右两个边界上的线的方程point = classifier.support_vectors_[0] #左边的一个点l = point[1] - k * point[0] #截距y_left = k * x + lpoint = classifier.support_vectors_[-1]l = point[1] - k * point[0] #截距y_right = k * x + lpl.plot(x,y,'k-') #第三个参数:实线pl.plot(x,y_left,'k--') #第三个参数:虚线pl.plot(x,y_right,'k--') #第三个参数:虚线pl.scatter(classifier.support_vectors_[:,0],classifier.support_vectors_[:,1],s=80,facecolors = 'yellow')pl.scatter(X[:,0],X[:,1],c = Y, cmap = pl.cm.Paired)pl.axis('tight')pl.show()

构建完的结果如下:
这里写图片描述
黄色的是支持向量。
然后开始测试:(随机样本换了,不影响)

from random import *for i in range(10):    a = [uniform(-5,5),uniform(-5,5)]    #print a    print '分类结果:',classifier.predict(a)    pl.scatter(a[0],a[1],s = 180,facecolors = 'black')

结果如下:
这里写图片描述

好了,线性可分总结到这里吧,以后如果需要深入研究SVM再说吧。唉,压力山大。