2014年11月15日 星期六

[Algorithm] 如何使用 libsvm,以XOR為例

libsvm是由台大資工林智仁老師實驗室所開發的強大軟體。但初學者的我,即使看了支持向量機器(Support Vector Machine) | 逍遙文工作室笨蛋也可以用libsvm。還是搞不懂這東西到底怎麼用。(我連笨蛋都不如Orz....)

  弄了半天,總算有了小小的了解。記錄一下也分享跟我一樣是新手村的朋友。以我個人而言,搞不懂網路上這些文章到底在幹嘛,主要以下幾個原因:
  •  SVM原理不懂 
  •  沒有機器學習的Sense 
  •  範例太複雜
  •  英文有看沒有懂

因此,我使用類神經網路的第一個問題(XOR)來測試SVM。在這之前,先簡單解釋分類演算法不外乎以下幾個步驟:
  • 步驟一:資料收集 
  • 步驟二:資料前處理 (將格式轉換成符合訓練模型的格式)
  • 步驟三:訓練模型
  • 步驟四:測試模型
  • 步驟五:確認模型是否符合需求,若沒有則回步驟三從新訓練

了解這些步驟後,我們就開始試看看啦。如何下載安裝已有很多資料,這裡就不多說了,不清楚的朋友們可參考 [LibSVM] Support Vector Machine (SVM) 實驗。而我選擇認windows command的方式來操作libsvm,我認為這是最簡單也最方便的方法。( windows path = .\libsvm-3.19\windows。 )


接著就開始照上面的步驟來做測試,
  • 步驟一:資料收集
    • XOR真值表(利用真值表的四個狀態做為資料做為訓練資料):
      X1 X2 Output
      0 0 0
      0 1 1
      1 0 1
      1 1 0

  •  步驟二:資料前處理
    資料收集完成後,我們就要將資料轉換成libsvm看得懂得格式。
    • libsvm format :
      <分類> 0:<屬性> 1:<屬性>... K:<屬性>  

    • 將真值表轉換成libsvm format(檔案名稱 : xor.txt)
      0  1:0  2:0 
      1  1:0  2:1
      1  1:1  2:0
      0  1:1  2:1

    • 調整對應值
      svm-scale.exe  xor.txt > xor.txt.scale

      svm-scale主要目的將資料數值對應至[0,1]或[-1,+1]之間。若打開xor.txt.scale可發現xor.txt轉換成
      0  1:-1  2:-1
      1  1:-1  2:1
      1  1:1  2:-1
      0  1:1  2:1

  •  步驟三:訓練模型
    做完資料前處理之後,就可以開始訓練模型啦!!!!
    • 訓練指令
      svm-train xor.txt.scale
      產出:
      xor.txt.scale.model

      顯示:
      *
      optimization finished, #iter = 2
      nu = 1.000000
      obj = -2.504710, rho = 0.000000
      nSV = 4, nBSV =4
      Toatal nSV = 4

  • 步驟四:測試模型
    終於來到最後階段。到底由SVM模型準不準呢??

    先準備測試檔案。
    • xor-test.txt
      1  1:-1  2:1
      1  1:1  2:-1
      0  1:-1  2:-1
      0  1:1  2:1

    • 測試指令
      svm-predict xor-test.txt xor.txt.scale.model xor.res
      產出:
      xor.res
      顯示 :
      Accuracy = 100% <4/4> <classification>

Accuracy = 100%,這表示預測結果非常準,以上是我使用SVM預測XOR的結果。

Reference :
[1] LIBSVM -- A Library for Support Vector Machines
[2] 支持向量機器(Support Vector Machine) | 逍遙文工作室
[3] 笨蛋也可以用libsvm。
[4] [LibSVM] Support Vector Machine (SVM) 實驗

沒有留言:

張貼留言