支持向量机(SVM)理解以及在sklearn库中的简单应用
1. 什么是支持向量機
- 英文Support Vector Machines,簡寫SVM . 主要是基于支持向量來命名的,什么是支持向量后面會講到…….最簡單的SVM是用來二分類的,在深度學習崛起之前被譽為最好的現成分類器,”現成”指的是數據處理好,SVM可以直接拿來使用 …
2. 名詞解釋
2.1線性(不)可分 , 超平面
上圖 線性可分(綠色熒光筆直線),即一條直線完美分類,雖然有不同的分割法,這條分割線就叫做”分割超平面”,二維中直線就是一個超平面,擴展到n維中n-1維也就是超平面
左面這張圖很明顯,所謂線性不可分,則是一條直線不能完美分類
左面這張圖也是線性不可分 但是 有一個圓形區域很好的進行了分類
這時候就可以映射到高維,見下例
面 到 體 :
線 到 面 :
這個例子就比較好理解了,主要是怎么映射? 見下內容….
2.2 支持向量
支持向量在SVM中很重要,名字就看得出來, 在上例中紅線為分割超平面,紅色的*點就是支持向量點,即離分割超平面最近的點。
3. SVM理解
在二分類問題中,SVM需要的就是尋得一個分割超平面,使margin最大化,見下圖,margin就是切割超平面離最近點的距離
最近的點就是支持向量點,這里的超平面可以定義為 w^X+b=0
假設2維特征向量X=(x1,x2) , 把b想象虛擬的w0 ,
那么超平面方程就變成了 : w0+w1x1+w2x2=0
右上方點滿足 : w0+w1x1+w2x2>0
同理,左下點滿足 : w0+w1x1+w2x2<0
經過對weight參數的調整,使得
H1:w0+w1x1+w2x2>=1 for y = +1
H2:w0+w1x1+w2x2<=1 for y = - 1 (用y的+1代表一類,-1代表另一類)
綜上兩式
yi(w0+w1x1+w2x2)>=1,?i
那么如果線行不可分呢,那就需要映射到高維,例如X=(x1,x2,x3) 那么映射到6維Z函數就可以是 θ1(x)=x1,θ2(x)=x2,θ3(x)=x3θ4(x)=x21,θ5(x)=x1x2,θ6(x)=x1x3,取而代之的方程變為Y=w1z1+w2z2+...+w6z6 那么怎么映射呢,(回答:用到的是內積)內積很耗時,所以使用核函數來計算這個內積,使得高維化時間變短,主要的核函數有
- linear : 線性核函數(linear kernel)
- poly : 多項式核函數(ploynomial kernel)
- rbf : 徑向機核函數(radical basis function)
- sigmoid : 神經元的非線性作用函數核函數(Sigmoid tanh)
具體介紹還是看看文檔吧…..
然后根據核函數就可以進行分類或者回歸了…..
4. SVM優缺點
優點
- 支持向量決定時間復雜,而不是取決于數據集的大小
- 結果易于理解
缺點
- 對于參數以及核函數有依賴,原始算法不加修改只用于二分類
- 算法實現比較困難 (依賴sklearn庫的話就算了,打臉)
5. sklearn庫簡單應用實例
# coding:utf-8from sklearn import svm from numpy import * import pylab as pl# 加載數據集 def loadData(fileName):dataMat = []labelMat = []with open(fileName) as txtFile:for line in txtFile.readlines():dataMat.append(map(float, line.split())[0:-1])labelMat.append(map(float, line.split())[-1])return dataMat, labelMat# if __name__ == '__main__':x, y = loadData("train.txt")X, Y = loadData("test.txt")#'使用線性方法分類'clf = svm.SVR(kernel='linear') clf.fit(x, y)res = clf.predict(X)print "kernel is linear", corrcoef(Y, res, rowvar=0)[0, 1]#'使用徑向機方法分類'clf = svm.SVR(kernel='rbf') clf.fit(x, y)res = clf.predict(X)print "kernel is rbf", corrcoef(Y, res, rowvar=0)[0, 1]#'使用線性最小二乘法進行分類'x = mat(x)X = mat(X)y = mat(y).TY = mat(Y).Ttemp = x.T * xws = temp.I * (x.T * y)yPre = X * wsprint "linear", corrcoef(yPre, Y, rowvar=0)[0, 1]''' SVR 支持向量回歸 '''# w^T * x + bias# weight is .coef_# bias is .intercept_random.seed(0)x = r_[random.randn(20, 2) - [2, 2], random.randn(20, 2) + [2, 2]]y = [0] * 20 + [1] * 20clf = svm.SVC(kernel='linear')clf.fit(x, y)w = clf.coef_[0]# print "coef",clf.coef_a = -w[0] / w[1]xx = arange(-4, 4)yy = a * xx - (clf.intercept_[0]) / w[1] # intercept_ bias# print "bias",clf.intercept_b = clf.support_vectors_[0]yy1 = a * xx + (b[1] - a * b[0])b = clf.support_vectors_[-1]yy2 = a * xx + (b[1] - a * b[0])pl.plot(xx, yy, 'k-', color='red')pl.plot(xx, yy1, 'k--', color='green')pl.plot(xx, yy2, 'k--', color='green')pl.plot(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], '*', color='red')# print clf.support_vectors_pl.scatter(x[:, 0], x[:, 1], marker='.', s=60)pl.show()6. 圖像結果 以及 分析
# kernel is linear 0.989824485227 # kernel is rbf 0.990336373871 # linear 0.989824485227 '對比發現,簡單調用中rbf函數分類效果最好,內核函數linear就是利用了最小二乘法'
紅色為支持向量,紅線為切割超平面,綠色虛線為邊際超平面,用來’阻擋’兩類的超平面
附 數據集
點擊這里
- 什么是支持向量機
- 名詞解釋
- 1線性不可分 超平面
- 2 支持向量
- SVM理解
- SVM優缺點
- sklearn庫簡單應用實例
- 圖像結果 以及 分析
- 附 數據集
總結
以上是生活随笔為你收集整理的支持向量机(SVM)理解以及在sklearn库中的简单应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R语言编写用户自定义函数:R语言编写用户
- 下一篇: 在阿里云主机上部署Mysql数据库详细教