支持向量机从原理到算法的实现

思想:寻找能够成功分开两类样本并且具有最大分类间隔的最优超平面。

支持向量机从原理到算法的实现

1.原理解析

空间中任何一个平面的方程都可以表示为wx+b =0,如上图,设最优超平面方程H为wx+b=0,支持向量x-到H的距离为支持向量机从原理到算法的实现,要使分类间隔最大,即该距离最大,而该距离只与|w|有关,分子为一个常数,为了简单优美,设分子常数为-1,则H1平面方程为wx+b = -1,同理H2平面方程为wx+b = 1。

则H1H2间的距离为(支持向量机从原理到算法的实现  -  支持向量机从原理到算法的实现) .支持向量机从原理到算法的实现 = 支持向量机从原理到算法的实现

间隔最大等价于支持向量机从原理到算法的实现最小化,故目标函数为J(w)= 支持向量机从原理到算法的实现

支持向量机从原理到算法的实现

这个编辑器很难用,不想打公式了,直接上草稿 :

支持向量机从原理到算法的实现

支持向量机从原理到算法的实现

 支持向量机从原理到算法的实现

支持向量机从原理到算法的实现

支持向量机从原理到算法的实现

 支持向量机从原理到算法的实现

2.实例

  1. #1、读入数据
  2. import numpy as np
  3. dataList = []
  4. labelList = []
  5. def loadData(fileName):
  6. f = open(fileName)
  7. for line in f.readlines():
  8. lineStr = line.split('\t')
  9. dataList.append([float(lineArr[0]),float(lineArr[1])])
  10. labelList.append(float(lineArr[2]))
  11. return dataList,labelList
  12. dataList,labelList = loadData('testSet.txt')
  1. #2、训练支持向量机
  2. from sklearn import svm
  3. #基于libsvm工具箱,SVC非线性支持向量分类,可通过核定义其核函数,如‘linear’为线性,‘rbf’为径向基核函数
  4. clf = svm.SVC(kernel='linear')
  5. clf.fit(dataList,labelList)#训练

 

  1. #3、预测
  2. clf.predict([[7.5,-1.5]])#预测类别
  3. clf.decision_function([[7.5,-1.5]])#该SVC方法decision_function为每个样本提供每个类别的分数相当于回归
  4. #支持向量
  5. clf.support_vectors_#获得支持向量
  6. clf.support_#获得支持向量索引
  7. clf.n_support_#获得支持向量属于不同类别的个数

 

  1. #4、绘制决策边界和支持向量
  2. labelArr = np.array(labelList)
  3. x_min, x_max = dataArr[:, 0].min() - 1, dataArr[:, 0].max() + 1
  4. y_min, y_max = dataArr[:, 1].min() - 1, dataArr[:, 1].max() + 1
  5. xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),np.arange(y_min, y_max, 0.02))#meshgrid在空间上取点
  6. Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])#ravel平铺,相当于np.hstack(xx)
  7. row = len(np.arange(y_min,y_max,0.02))
  8. col = len(np.arange(x_min,x_max,0.02))
  9. Z = Z.reshape([row,col])
  10. #plt.cm中cm全称表示colormap,paired表示两个两个相近色彩输出,比如浅蓝、深蓝;浅红、深红;浅绿,深绿这种
  11. plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
  12. plt.scatter(dataArr[:, 0], dataArr[:, 1], c=labelList)#画出数据点
  13. plt.scatter(dataArr[clf.support_,0],dataArr[clf.support_,1],c = 'red',s = 100,marker='o')#画出支持向量

支持向量机从原理到算法的实现

				<script>
					(function(){
						function setArticleH(btnReadmore,posi){
							var winH = $(window).height();
							var articleBox = $("div.article_content");
							var artH = articleBox.height();
							if(artH > winH*posi){
								articleBox.css({
									'height':winH*posi+'px',
									'overflow':'hidden'
								})
								btnReadmore.click(function(){
									articleBox.removeAttr("style");
									$(this).parent().remove();
								})
							}else{
								btnReadmore.parent().remove();
							}
						}
						var btnReadmore = $("#btn-readmore");
						if(btnReadmore.length>0){
							if(currentUserName){
								setArticleH(btnReadmore,3);
							}else{
								setArticleH(btnReadmore,1.2);
							}
						}
					})()
				</script>
				</article>