2010-08-04 61 views
2

使用J48樹時出現了奇怪的結果。我需要對48個特徵向量進行分類,效果很好,但是當我試圖「優化」時,我遇到了奇怪的結果。奇怪的weka實例結果

我有一個方法分類:

public boolean classify(double feature1, double feature2, double[] featureVec) { 
     Instance toBeClassified = new Instance(2+featureVec.length); 
     toBeClassified.setValue(0, feature1); 
     toBeClassified.setValue(1, feature2); 
     for (int i = 2; i < f.length + 2; ++i) { 
      toBeClassified.setValue(i, featureVec [i - 2]); 
     } 
     toBeClassified.setDataset(dataset); 

     try { 
      double _class = tree.classifyInstance(toBeClassified); 
      return _class > 0; 
     } catch (Exception e1) { 
      if(Logging.active) { 
       logger.error(e1.getMessage(), e1.getCause());} 
      } 
     return false; 
    } 
} 

它工作得很好,我希望我做的事情吧。但是我想刪除每次方法調用時創建的實例創建,所以我將實例移動到了BeClassified = new Instance(48);進入類體 - 因此它只創建一次。儘管事實證明我的結果與另一個結果略有不同,但這種結果也很好。可以說,從400個分類中,一個是不同的(不是說,不正確)。但我沒有看到這個原因......我希望這裏有一些人使用weka,以便我明白髮生了什麼事情/錯誤。 (是的,2 + featureVec.length是48)。

感謝和問候。

+1

對於同一個數據集上的同一個例子,您是否一致地通過兩種方法獲得相同的不同分類? – Brabster 2010-08-04 19:17:16

+1

另外 - 雖然我很想知道爲什麼會看到差異 - Weka文檔http://weka.sourceforge.net/doc/建議創建新實例可能會更快,而不是修改現有的實例。假設您正在尋找最佳性能,您是否定時/分析了這兩種方法,並發現哪種方法更快? – Brabster 2010-08-04 19:21:45

+0

@Brabster是的,即時尋找性能,但也爲「我喜歡它」。我還在測量它,但我明天可以回到工作崗位上。是的,這是一貫的,如果我只是改變實例創建的方式,我總是會得到不同的結果。 – InsertNickHere 2010-08-04 19:55:07

回答

3

J48不太可能出現任何問題。分類器的創建和分類本身都是確定性的。我建議發佈更大一部分代碼,因爲這看起來不錯(unbuggy)。

至於你的400循環測試:這個肯定應該每次都會產生相同的結果,沒有例外。兩個想法:

  • 把斷言,檢查實例的值是否與模型相同。這將排除實例中的任何錯誤。

  • 分類是否以多線程方式運行?有沒有共享數據對象?

+0

對不起,但我不能顯示更多的代碼,因爲它會違反我在合同中表達的內容。哈哈哈哈,你的我的男人。就像我閱讀你的「多線程方式」 - 是的,這個函數是從不同線程併發調用的。 Ofc這是沒有問題的,如果每個方法調用都創建它自己的實例,但是如果我只使用一個,我必須同步才能正確完成工作。我會在明天重做,如果成功,請接受你的答案。 – InsertNickHere 2010-08-04 19:58:21

+0

感謝您的快速回復。糾正我,如果我錯了:比方說,你有N個線程,N個實例和...分類器的一個實例? – Rekin 2010-08-04 20:17:20

+1

所以分類器實例在線程之間共享。我不知道這是否是問題,但我聽說在Java中,甚至必須同步讀取。嘗試克隆每個線程的實例。 'java.util.concurrent'包中的'ThreadLocal'對象可能有幫助。 – Rekin 2010-08-05 07:59:15