Introduction
在 Part1 提到如果 Training Data 是 Linear Separable, 那你一定可以在進行 PLA 演算法正常的結束並找到 w 並正確地從 Training Data 找出 g(x)=y. 但如果 Training Data 不是 Linear Separable 或是 Training Data 中包含 Noise 時? 這時可以使用 Pocket Algorithm 來找出最好的 g:
PLA - Pocket Algorithm
這個演算法會比原先的 Cyclic 的方法慢, 但是保證一定能從 PLA 執行中正常結束. 其演算法步驟簡單說明如下:
使用與 Part1 同樣的 Training Data, 並透過 GML 套件中的 PLA 類別撰寫範例代碼如下:
- package demo.classify
- import ml.classify.PLA
- import ml.classify.PLAClassify
- import ml.data.ui.DataInXYChart
- import org.jfree.ui.RefineryUtilities
- import flib.util.TimeStr
- // 1) Prepare Training Data
- def x = [[1,7], [1,2], [1,4], [-1,3], [-4,-2], [-3,2], [3,-2], [-2, -11], [2.5, -15], [-1, -12], [1, 22]]
- def y = [1,1,1,-1,-1,-1,1, -1, 1, 1, -1]
- // 2) Training
- PLA pla = new PLA()
- PLAClassify cfy = pla.pocket(x, y) // Or pla.cyclic(x, y)
- printf("\t[Info] Weighting Matrix(%d/%s):\n", cfy.loop, TimeStr.ToString(cfy.sp))
- cfy.w.eachWithIndex{v, i->printf("\t\tw[%d]=%s\n", i, v)}
- // 3) Predicting
- def t = [[1,3], [-4,1], [2,2], [3,6], [-1,9], [3, 39]]
- def r = [1, -1, 1, 1, -1, -1]
- def p = []
- t.eachWithIndex{ v, i->
- e = cfy.classify(v)
- printf("\t[Info] %s is classified as %d\n", v, e)
- if(e==r[i]) p.add(e) // Correct
- else p.add(3) // Miss
- }
- t.addAll(x)
- p.addAll(y)
- // 4) Show Predicting Result
- DataInXYChart demo = new DataInXYChart("Training Data", t, p, cfy.w)
- demo.pack();
- RefineryUtilities.centerFrameOnScreen(demo);
- demo.setVisible(true);
使用 Pocket 的方法執行結果如下:
可以發現 Cyclic 的執行時間 (32ms) 比 Pocket 的方法快 (63ms); 但是 Pocket 找出的 w 可以正確的預測 Testing Data (沒有黃點出現)!
沒有留言:
張貼留言