今天和師兄交流了一番,終於對SVM有了初步的理解,雖然覺得自己還是很小白,但是有收穫、有進步就好。
SVM處理流程(待修正):
1. 收集數據,相關性分析(p卡方檢驗),特徵選擇(主成份分析PCA)。PCA提取特徵向量,用這些來分類,SVM是分類器,輸入的就是特徵向量。
2. 歸一化數據。就是根據實際要求,將數據的取值範圍轉化爲統一的區間如[a,b],a,b爲整數。
3. 利用抽樣技術將數據集分爲訓練集和測試集。抽樣技術有分層抽樣,簡單抽樣(等概率抽樣)。一般訓練集>測試集,就是要保證足夠的訓練樣例。
4. 將數據轉化爲軟件(接口)所支持的格式。就libsvm(c++,java)來說,我們可以使用FormatDataLibsvm.xls將數據轉化爲libsvm所要求的格式。
5. 選擇核函數,可以優先考慮rbf。核函數是把低維數據映射到高維空間,讓線性不可分的問題變成線性可分。
6. (訓練)對訓練集利用交叉驗證法選擇最好的參數C和r(西格瑪) (rbf核函數中的參數gama)。
可以通過網格法尋找出最優的參數,注意一次交叉驗證得到一個參數對所對應的模型精度,網格法(訓練的一個過程)目的就是找到使得模型精度達到對高的參數對(這裏的參數對可能不止兩個,有可能也有其他的),可以使用一些啓發式的搜索來降低複雜度,雖然這個方法笨了點,但是它能得到很穩定的搜索結果。需要提到的這裏在對訓練集進行分割的時候涉及到抽樣,一個較好的方法就是分層抽樣。從這步可以看出其實 Cross-Validation是一種評估算法的方法。
a. 訓練的目的得到參數和支持向量(存儲在xml文件中),得到參數就能得到支持向量,帶進算式計算SVM分類的準確度,以準確度最高的一組參數作爲最終的結果,沒有絕對線性可分的,都有一個誤差,參數就是把那個誤差降到最低。
b. 這裏的準確性是指將訓練集的每個樣本的向量與支持向量做運算,將運算結果與標記值比較,判斷是否屬於這個類,統計這個類的正確的樣本數,最高的那一組參數準確性最高。
c. 最終訓練得到分類器。SVM只能分兩類,所以這裏的分類器是兩個類組成一個分類器,如果有K類,就有k(k-1)/2個分類器。
7. 用6中得到的參數對在整個訓練集合上進行訓練,從而得出模型(即分類器)。
8. 利用測試集測試模型,得到精度。這個精度可以認爲是模型最終的精度。當然有人會擔心3步中抽樣會有一定的誤差,導致8得到的精度不一定是最好的,因此可以重複3-8得到多個模型的精度,然後選擇最好的一個精度最爲模型的精度(或者求所有精度的均值做爲模型精度)。(需要多次選擇訓練集和測試集,然後每一次得到一個精度的模型,選擇最好的一個精度作爲模型,也就是我們項目裏面要多次訓練的原因)
9. 識別分類。兩個類超平面的形成,意味着目標函數的形成,然後代入待識別樣本,識別時對應的組代入對應的參數,得出結果進行投票,判定屬於那個類。