使用libsvm实现归一化
使用libsvm實現歸一化
我在使用svm進行分類的過程中接觸了非常好用的庫libsvm,但是一開始我是在matlab下使用的,libsvm中有matlab下使用的函數,如下:
libsvmwrite.mexw64 libsvmread.mexw64 svmtrain.mexw64 svmpredict.mexw64問題
但是在使用過程中我遇到一個問題,那就是數據的歸一化,在matlab下libsvm中并沒有實現數據歸一化的函數,在網上查詢的過程中,發現大家對于訓練集與測試集的數據是否應該放在一起還是分開歸一化有非常大的困惑。。。
思考
后來我發現libsvm中有在windows下命令行實現數據歸一化、訓練及預測的的可執行程序,如下:
svm-scale.exe svm-train.exe svm-predict.exe那么這里的svm-scale.exe究竟是怎么實現歸一化的呢?針對這個問題我進行了學習。
學習
首先學習svm-scale.exe的使用方法,如下:
功能
縮放輸入數據,原始數據范圍可能過大或過小,該過程可將數據重新縮放到適當范圍使訓練與預測速度更快。
使用方法:
svm-scale.exe [-l lower] [-u upper] [-y y_lower y_upper] [-s save_name] [-r store_name] filename
參數說明
-l lower:縮放下限,默認-1; -u upper:下限,默認1; [-y y_lower y_upper] 是否對目標值(類標)同時進行縮放及縮放的上下限。 [-s save_name]縮放規則文件存放地址 ; [-r store_name]讀取縮放規則文件; filename:要進行縮放的數據文件。在這里需要注意-s 與-r參數不能同時使用!
使用舉例
F:\ASS\svm\libsvm-3.21\windows>svm-scale -l -1 -u 1 -s F:\ASS\svm\data\range1 F:\ASS\svm\data\svmguide1 >F:\ASS\svm\data\svmguide1.scale以上程序對訓練集進行縮放。規則文件存為range1,縮放后訓練文件為svmguide1.scale。
svm-scale.exe的參數
使用svm-scale.exe,參數至少得有一個,即filename,也就是你需要歸一化的數據文件,其他的參數都是可選的參數,只有一個參數的時候,默認是將數據歸一化到[-1,1]的范圍。那么究竟svm-scale是怎么實現數據的歸一化的呢?規則很簡單,如下:
這里y是縮放前的數據,y’是縮放后的數據,lower與upper是縮放后數據的范圍,min與max是縮放前數據的范圍。
關于參數縮放規則文件的困惑
- 這里的縮放規則文件具體存放了什么內容?
- 訓練集與測試集在歸一化的時候是不是應該調用同樣的縮放規則文件?
- 縮放規則文件是怎么生成的?
我在網上也沒有找到一些詳細的解釋,所以自己設計了以下實驗,嘗試解決以上的困惑。
實驗
收集數據
為了實驗的方便,我自己設計了簡單的訓練集與測試集,里面的數據都是隨機的,可能對于SVM分類來說,這些數據是不可分類的,但是現在我們的關注點在歸一化上,不涉及到后續的數據分類,能說明歸一化的問題即可。我的數據集如下:
訓練集數據:
測試集數據:
在libsvm中,數據的格式是上面的形式,以訓練集為例,訓練集中有6個樣本,即6行數據,每個樣本有自己的標簽與特征向量,第一列是每個樣本的標簽,后續的四列構成了每個樣本的四維的特征向量。比如訓練中的第一個樣本,其標簽是0,(1.1 2.1 3.1 4.1)構成其思維的特征。
歸一化
取訓練集實現歸一化,在windows中的cmd中輸入如下命令:
得到的歸一化后的文件如下:
得到的縮放規則文件:
分析縮放規則文件,發現第一行是輸入的縮放變量名,第二行的縮放之后數據的范圍,從第三行開始是特征向量中每一維原始數據的最小/最大值。可見縮放規則文件的生成是依賴要縮放的原始數據。
一般來說,我們是需要訓練集與測試集利用相同的縮放規則來進行縮放的,如下:
觀察測試集歸一化的結果,發現樣本2的歸一化后的數據出現1.9475,超過設定的[-1,1]的范圍,這是因為在歸一化測試集的時候,我們用的是訓練集生成的縮放規則文件range,在range中,各樣本特征第四維的最小/最大值默認是0.6377/8.6008,利用這個范圍去歸一化測試集中樣本2的第四維向量的過程是:
從上面這個例子中就可以認識到,當將測試集與訓練集中的數據分開歸一化的時候,就會出現數據出界的問題,但是我覺得即使出界了,也不影響后續的SVM分類,但是為了防止出現這種情況,我認為可以將訓練集與測試集放在一起進行歸一化,或者不使用訓練集的縮放規則去歸一化測試集數據,當然-l與-u兩個參數還是要一致的。
以上都是我在學習過程中的一點感悟,與個人的理解,如果有不對的地方,請不吝賜教。
總結
以上是生活随笔為你收集整理的使用libsvm实现归一化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate3连接mysql8报错
- 下一篇: 用渐变色画圆_详细步骤!用ps画个中秋圆