?
SVM是新近出現的強大的數據挖掘工具,它在文本分類、手寫文字識別、圖像分類、生物序列分析等實際應用中表現出非常好的性能。SVM屬于監督學習算法,樣本以屬性向量的形式提供,所以輸入空間是Rn的子集。
圖1
如圖1所示,SVM的目標是找到兩個間距盡可能大的邊界平面來把樣本本點分開,以”最小化泛化誤差“,即對新的樣本點進行分類預測時,出錯的幾率最小。落在邊界平面上的點稱為支持向量。Vapnik證明如果可以找到一個較小的支持向量集,就可以保證得到很好的泛化能力----也就是說支持向量的個數越少越好。
數據點通常在輸入空間是線性不可分的,我們把它映射到更高維的特征空間,使其線性可分----這里的映射函數我們稱之為核函數。特征空間的超平面對應輸入空間的一個非線性的分離曲面,因此稱為非線性分離器。
線性SVM分類器的輸出是u=w*x-b。w是分類平面的法矢,x是輸入向量,b是常量,u代表分類。即SVM的目的就是計算出w和b。最大化margin(兩個分類平面之間的距離)等價于求下面的二次優化問題:
?
對于非線性分類器就要把x映射到特征空間,同時考慮誤差ε的存在(即有些樣本點會越過分類邊界),上述優化問題變為:
?
從輸入空間是映射到特征空間的函數稱為核函數,LibSVM中使用的默認核函數是RBF(徑向基函數radial basis function),即
?
這樣一來就有兩個參數需要用戶指定:c和gamma。
?
我們先安裝python的機器學習庫
http://sourceforge.net/projects/mlpy/
該學習庫有以下3個核函數
1、‘linear’ (uT*v)
2、‘poly’ ((gamma*uT*v +coef0)^degree)
3、‘rbf’ (exp(-gamma*|u-v|^2)), ‘sigmoid’ (tanh(gamma*uT*v + coef0))
其中degree為 [int (for ‘poly’ kernel_type)] degree in kernel
下載并安裝后,調用 其中的SVM模塊對下面的數據進行訓練,這次訓練我們使用線性核做為SVM的核函數
?
x = [[1,8],[3,20],[1,15],[3,35],[5,35],[4,40],[7,80],[6,49]]
y=[1,1,0,0,1,0,0,1]
showpoint=['ro','bo']
tshowpoint=['r*','b*']
x=np.array(x)
y=np.array(y)
svm = mlpy.LibSvm()
svm.learn(x, y)
本博客所有內容是原創,如果轉載請注明來源
http://blog.csdn.net/myhaspl/
然后生成隨機的未知樣本測試數據驗證生成的SVM模型 ,星號表示未知樣本
?
?
#未知樣本分類
tlp_x1=np.random.rand(50)*(xmax-xmin)+xmin
tlp_x2=np.random.rand(50)*(ymax-ymin)+xmin
tlp_x=np.array(zip(tlp_x1,tlp_x2))
for ii in xrange(0,len(tlp_x)):ty=svm.pred(tlp_x[ii])if ty>0:plt.plot(tlp_x1[ii],tlp_x2[ii], tshowpoint[int(ty)])else:plt.plot(tlp_x1[ii],tlp_x2[ii], tshowpoint[int(ty)])
>>> runfile(r'K:\book_prog\mplsvm1.py', wdir=r'K:\book_prog')
http://blog.csdn.net/myhaspl
myhaspl@qq.com
loading ?...
>>>?
?
?