麦子学院机器学习基础(4)-(支持向量机(SVM))(python)
一 支持向量机
机器学习的一般框架
训练集->提取特征向量->结合一点的算法->得到结果
1.超平面的概念 寻找出分两类的超平面,使边际最大
1)将边际设置为最大是为了减少犯错的机会
2)超平面到两侧最近点的距离是相等的
线性可区分和线性不可区分:上面是可区分 下面是不可区分
2.定义与公式建立
知乎解释SVM链接:https://www.zhihu.com/question/21094489
二 python代码实现
线性可分的情况下的代码实现
''' 通过调用sklearn svm工具包来实现1 ''' from sklearn import svm x = [[2,0],[1,1],[2,3]] #三个点 (2,0) (1,1) (2,3) y = [0,0,1] #分类的标记 clf = svm.SVC( kernel='linear') #建立一个分类器 核函数使用线性的 clf.fit(x,y)#建立模型 print(clf) print(clf.support_vectors_) #找到支持向量 print(clf.support_) #找到支持向量的点的坐标 print(clf.n_support_) #找到支持向量的数目 # print(clf.predict())
''' 通过调用sklearn svm工具包来实现2 ''' import numpy as np import pylab as pl 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] ] Y = [0]*20 + [1]*20 # print(Y) clf = svm.SVC(kernel = 'linear') clf.fit(X,Y) w = clf.coef_[0] a = -w[0]/w[1] xx = np.linspace(-5,5) yy = a*xx - (clf.intercept_[0])/w[1] b = clf.support_vectors_[0] yy_down = a*xx + (b[1]-a*b[0]) b = clf.support_vectors_[-1] yy_up = a*xx + (b[1]-a*b[0]) pl.plot(xx,yy,'k-') pl.show();
线性不可分的情况下
将低维的线性不可分转为高维的线性可分情况,采用kernel trick方法实现
常用核函数: