2015-01-09 23 views
1

我想在OpenCV 2.4.9中使用SVM,並且遇到了實現功能縮放的問題。我跑在本教程功能的源代碼「介紹支持向量機」:opencv支持SVM無法使用縮放功能

http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

當我只是複製粘貼代碼並運行它,它工作得很好,這顯示:

image

然後我試圖通過使2個修改來歸一化特徵爲[0,1]:

  1. 在訓練SVM之前加入trainingDataMat /= 512.f;(因此規範化訓練數據)

  2. 修改預測步驟爲float response = SVM.predict(sampleMat/512.f);(因此規範化測試數據)。

這樣做了以後,它預測的所有值是同一類,生產這種形象:

image

我缺少什麼?是否有一些額外的步驟來實現我不知道的功能規範化?

+0

是否所有的列/功能都是從0到512? – carlosdc 2015-01-10 00:31:51

+0

告訴你什麼,不關心這個問題,OpenCV的支持向量機不是很好。 – 2015-01-10 11:24:13

+0

而且,這不是功能規範化(通常)。雖然,我不明白常數的簡單縮放應該如何對分類產生任何影響。你是否用數字檢查了預測反應? – 2015-01-10 11:27:47

回答

0

我發現了一個可以產生所需行爲的解決方法,但我必須承認我不確定爲什麼它可以工作。

正規化參數C在上述兩個試驗中都未指定,所以默認爲1.但是,如果我在縮放版本中添加了一行以將其指定爲512(即,縮放步驟),SVM運行良好!

我不明白的是,爲什麼正則化術語太小會導致訓練數據錯誤分類,因爲在這種情況下,訓練點是線性可分的。我的理解是線性分離訓練數據的錯誤分類通常是由於C太大而導致