轉自:http://blog.csdn.net/jeryjeryjery/article/details/72649320
這兩天用Python來實現手寫數字識別,剛開始用原始數據進行訓練,結果預測結果都是同一個類別,全部是對應數字1。正確率也只有10%左右,下面是代碼及運行結果截圖:
預測結果都是數字1。
數據歸一化是指將特征值從一個大范圍映射到[0,1]或者[-1,1],如果原始值都是正數,則建議選擇映射到[0,1];如果原始值有正數又有負數,則建議映射到[-1,1];具體情況需要具體分析。映射到[0,1]的實現是:
這樣就能實現從原來的范圍映射到[0,1]之間。
libsvm中提供了數據歸一化工具,就是svm-scale這個工具。如果你的數據文件已經滿足了svm的格式要求,即l 這種格式,那么在window平台下,你可以直接調用libsvm\windows\svm-scale.exe文件來進行歸一化操作。具體步驟是在cmd命令行中進入到svm-scale.exe所在文件夾,然后運行svm-scale來實現歸一化。svm-scale的語法截圖如下:
其中-l 指定下界,-u指定上界,-s指定保存scale參數文件路徑,-r源文件路徑
下面以數據源train.txt為例,將其歸一化到[0,1],並存入到train-to-one.txt中,語句截圖如下:
因為手寫數字圖片是由一系列的像素點組成的,像素值從0到255,所以可以讓每一個像素值除以255,從而實現映射。可以調用svm-scale來實現,也可以直接編寫java代碼來實現,然后再以歸一化之后的數據進行訓練模型並預測,其代碼和截圖如下:
可以看出,准確率和速率明顯提高了,不會出現僅僅只有一類的問題。但是其中的原理,本人現在還不知道,等我理解了再解釋吧!