支援向量:與分離超平面距離最近的樣本點的例項
優點:泛化錯誤率低,計算開銷不大,結果易解釋
缺點:對引數調節和核函式選擇敏感,原始分類器不加修改僅適用於處理二分類問題
適合資料型別:數值型和標稱型資料
每次迴圈中選擇兩個alpha進行優化處理。一旦找到一對合適的alpha,那麼久增大其中乙個同時減小另乙個。這裡所謂的」合適」就是指兩個alpha必須要符合一定的條件,條件之一就是這兩個alpha必須要在間隔邊界之外,而其第二個條件則是這兩個alpha 還沒有進行過區間化處理或者不在邊界上
建立乙個alpha向量並將其初始化為0向量
當迭代次數小於最大迭代次數時(外迴圈)
對資料集中的每個資料向量(內迴圈)
如果該資料向量可以被優化
隨機選擇另外乙個資料向量
同時優化這兩個向量
如果兩個向量都不能被優化,退出內迴圈
如果所有向量都沒有被優化,增加迭代次數,繼續下一次迴圈
按照libsvm軟體包所要求的格式準備資料 label [index1]:[value1] [index2]:[value2],…
如2.3 1:5.6 2:3.2
label=2.3 有2維,第一維是5.6 第二維是 3。2
對資料進行簡單的縮放操作,即資料歸一化
首選rbf核函式
採用交叉驗證選擇最佳引數c和g
選擇引數後,對整個訓練資料集進行訓練,並獲取svm模型
利用獲取的模型進行測試
##libsvm使用說明
先將資料按照value1,value2,value3,…,label存放,然後粘到formatdatalibsvm.xls中,工具->巨集->執行,選擇formatdatatolibsvm巨集就可以得到滿足libsvm格式的資料
svm-scale.exe將資料進行縮放到適當範圍,使得訓練和測試速度加快
svm-train.exe 訓練data,生成model
核函式
-線性核
1.多項式核
2.rbf核(高斯核,徑向基核函式)
3.sigmoid核
4.precomputed.kernel 自定義核函式
options (選擇分類還是回歸,選擇前面相應的
0
-c-svc 多類1-n
-svc 多類
2-one
-class
-svm 單類3-e
-svr 回歸4-n
-svr 回歸
svm(smo)**展示,非libsvm:
# coding=utf-8
# __author__=eshter yuu
#無需言,做自己
import numpy as np
defloaddataset
(filename):
datamat = ; labelmat =
fr =open(filename)
for line in fr.readlines():
linearr = line.strip().split('\t')
return datamat, labelmat
##i是alpha的下標,m是所有alpha的數目
#找到乙個不同下標i的下標
defselectjrand
(i,m):
j =i
while(j==i):
j = int(np.random.uniform(0,m))
return j
#調整大於h或者小於l的alpha值
defclipalpha
(aj,h,l):
if aj > h:
aj = h
if l > aj:
aj =l
return aj
##簡化版的smo演算法
defsmo******
(datamat, classlabels, c, toler, maxiter):
datamatrix = np.mat(datamat); labelmat = np.mat(classlabels).transpose()
b =0;
m,n = np.shape(datamatrix)
print(m,n)
alphas = np.mat(np.zeros((m,1)))
iter = 0
while(iter < maxiter):
alphaparischanged =0
for i in range(m):#第二層內迴圈
fxi = float(np.multiply(alphas,labelmat).t* (datamatrix*datamatrix[i,:].t))+b
ei = fxi -float(labelmat[i])
if ((labelmat[i] * ei < - toler) and (alphas[i] < c))or ((labelmat[i] * ei> toler ) and (alphas[i] > 0)):
j = selectjrand(i,m)
fxj = float(np.multiply(alphas, labelmat).t * (datamatrix *datamatrix[j,:].t)) +b
ej =fxj -float(labelmat[j])
alphaiold = alphas[i].copy()
alphajold = alphas[j].copy()
if (labelmat[i] != labelmat[j]):
l = max(0, alphas[j] -alphas[i] )
h = min(c, c + alphas[j]-alphas[i])
else:
l = max(0, alphas[j] +alphas[i] -c)
h= min(c, alphas[j]+alphas[i])
if l ==h:
print('l==h')
continue
eta =2.0* datamatrix[i,:] * datamatrix[j,:].t - datamatrix[i,:] *datamatrix[i,:].t -datamatrix[j,:] *datamatrix[j,:].t
if eta >= 0:
print("eta >=0")
continue
alphas[j] -= labelmat[j]*(ei-ej)/eta
alphas[j] = clipalpha(alphas[j], h,l)
if (abs(alphas[j] -alphajold) < 0.00001):
print("j not muving enough")
continue
alphas[i] += labelmat[j] * labelmat[i]*(alphajold -alphas[j])
b1 = b- ei - labelmat[i] *(alphas[i] - alphaiold)* datamatrix[i,:] *datamatrix[i,:].t - \
labelmat[j] *(alphas[j] - alphajold)*datamatrix[i,:] *datamatrix[j,:].t
b2 = b-ej- labelmat[i]*(alphas[i] -alphaiold) * datamatrix[i,:]*datamatrix[j,:].t -\
labelmat[j] *(alphas[j] -alphajold)* datamatrix[j,:] *datamatrix[j,:].t
if (0
< alphas[i]) and(c > alphas[i]):b =b1
elif (0
< alphas[j]) and(c> alphas[j]):b= b2
else: b=(b1+b2)/2.0
alphaparischanged +=1
print("iter: %d i: %d, paris changed %d"%(iter, i, alphaparischanged))
if alphaparischanged ==0 : iter +=1
else: iter = 0
print("iteration number:%d"% iter)
return b,alphas
dataarr ,labelarr = loaddataset('testset.txt')
m,n = np.shape(np.mat(labelarr).transpose())
print(m,n)
b, alphas =smo******(dataarr,labelarr,0.6, 0.001, 40)
print('b=',b, '\n', 'alphas>0',alphas[alphas>0])
支援向量機專題 線性支援向量機
原文 當資料線性不可分時,使用硬間隔支援向量機很難得到理想的結果。但是如果資料近似線性可分,可以採用軟間隔支援向量機 線性支援向量機 進行分類。這通常適用於有少量異常樣本的分類,如果使用線性支援向量機,它會盡量使得所有訓練樣本都正確,如下圖所示。顯然這並不是最好的結果,軟間隔支援向量機可以權衡 間隔...
支援向量機
支援向量機 svm 一種專門研究有限樣本 的學習方法。是在統計學習理論基礎之上發展而來的。沒有以傳統的經驗風險最小化原則作為基礎,而是建立在結構風險最小化原理的基礎之上,發展成為一種新型的結構化學習方法。結構風險最小歸納原理 解決了有限樣本或小樣本的情況下獲得具有優異泛化能力的學習機器。包含了學習的...
支援向量機
支援向量機 supportvectormachines,svm 是一種二類分類模型.它的基本模型是定義在特徵空間上的間隔最大的線性分類器,間隔最大使它有別於感知機 支援向量機還包括核技巧,這使它成為實質上的非線性分類器.支援向量機的學習策略就是間隔最大化,可形式化為乙個求解凸二次規劃 convex ...