關於python使用One Class&nbs…

系本人原創,轉載請著名出處:http://blog.sina.com.cn/s/blog_76bf40cd0102v4a7.html
由於工作需要,前段時間使用一下One Class SVM。SVM算法一般是用來進行分類的,從One Class SVM的名字看出,One Class SVM並不是用來進行分類的,而是用來檢測新的數據是否屬於原始數據一類。由於本人不是一心一意搞機器學習的,所以對於One Class SVM的原理和具體數學推導不了結,所以在這裏只能介紹One Class SVM使用的問題。我自己所使用的庫是來自臺灣大學林智仁(Lin Chih-Jen)所設計和實現的庫LibSVM(地址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/),裏面包含很多種語言的版本,我使用的是python版本。
在python的README文檔中,主要用到了幾個函數:svm_read_problem、svm_train、svm_predict、svm_load_model、svm_save_model,這幾個函數主要是用來從文件中讀數據訓練和存儲模型。1、svm_read_problem是使用如下所示:y, x = svm_read_problem('data.txt')   data.txt是原始數據訓練集(參見注),返回的y和x是一個列表,裏面存儲一些數據用來進行下一步。當然這裏也可以不使用這種從文件讀的方式,具體使用見README文檔。2、svm_train函數的使用如下所示:m = svm_train(y, x, '-s 2 -n 0.01')  y和x分別是上一部得到的結果,-s 2 -n 0.01 其中的s標識SVM的類型,2就是表示One Class SVM,-n在2類SVM中標識兩個類的比例(?),但是在One Class SVM表示異常數據所佔的比例,我們在這裏設置其爲0.01,m就是就是得到的訓練模型。3、svm_predict函數的使用所如下所示:p_label, p_acc, p_val = svm_predict(y, x, m)  這裏的y和x是從測試數據集中使用的svm_read_problem函數得到的y和x,m就是剛剛訓練得到的模型。返回值爲三個數p_label、p_acc、p_val,p_label是一個元組標識對應測試集中每一行數據的結果,1表示屬於該集,-1標識不屬於該集;p_acc表示訓練精度,對於One Class SVM精度計算好像存在問題(當使用1作爲標籤,得到的精度是正確的,當使用-1作爲標籤就相反了。不知道這算不算一個bug。。);p_val我們就不管它了。4、svm_save_model函數就將svm_train得到的模型m存到外部的一個文件裏面,其使用如下:svm_save_model('heart_scale.model', m),'heart_scale.model'就是文件名。 5、svm_load_model函數的作用與svm_save_model相反,就是從外部文件中讀取模型,其使用如下所示:m = svm_load_model('heart_scale.model')。

關於One Class SVM國內還沒有講的比較好的博客,望大牛們多多爲廣大愛好者多作貢獻。

注:對於兩類SVM問題,其標籤一般有兩種,一般使用+1和-1,見:http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary/a2a    對於One Class SVM標籤一般只有一個,建議使用+1,格式中別的數據是怎麼得到的就要看怎麼進行歸一化。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章