2011-04-05 33 views
0

我有一個聚類算法存儲羣集在HashMap<String, ArrayList<String>>我如何將HashMaps與不同的密鑰進行比較?

我需要將它與存儲在另一個HashMap<String, ArrayList<String>>中的地面實況進行比較。

鍵不一樣,因爲數組是通過增量聚類創建的,所以我想知道如何將原始集羣與生成的集羣進行比較。

我使用NMI和BCUBED作爲聚類評價措施,但我的問題是如何指向同一個集羣(ArrayList的),如果他們有不同的鍵..

任何想法?

+0

那麼你是說,'地面實況'散列圖通常是來自增量聚類地圖的適當超集? – MeBigFatGuy 2011-04-05 12:14:09

+0

你是什麼意思的關鍵是不一樣的?它們不屬於同一類型。 – 2011-04-05 12:14:12

+0

@MeBigFatGuy因爲聚類算法應該給出原始的HashMap,但結果從來都不是完美的,所以我應該測量這些聚類與原始聚類的距離。所有文檔(ArrayList 對象)都存在,但它們可能位於不同的集羣中,或者可能存在更多或更少的集羣(或多或少的HashMap項目)。 – user680406 2011-04-05 12:22:51

回答

0

我不是100%清楚你的班級是如何設置的,以及HashMap<String, ArrayList<String>>是如何工作的,但我的意思是你應該有一把鑰匙。所以當你分配集羣時,你可以做這樣的事情。

原始數據:

Hashmap<String, ArrayList<String>> = key: Array Of Original Data 

您將存儲的是在每個集羣的功能:

HashMap<String, ArrayList<String>> = Cluster Key: Array of Original Data Keys 

這會給你一個機制,以循環通過在每個羣集對象並仍然保持原始對象的狀態,這是否有道理?你會最終再能寫一些類似於:

for(String clusterKey : clusterMap.keySet()){ 
    for(String itemKey : clusterMap.get(clusterKey)){ 
     calculateDistance(centroid, originalMap.get(itemKey); 
    } 
} 

這是一個過於簡單化,但應該讓你在正確的方向前進。

編輯 我也承擔人有重心向集羣自身的HashMap中。因此,作爲calculateDistance(centroidMap.get(clusterKey), originalMap.get(itemKey));

0

我想你可以創建一個反向的HashMap其中KeyObj是一個ArrayList和計數器的新對象calculateDistance()方法可以rewritted。

在反向HashMap中,密鑰的計數器將是相等的ArrayList的數量。

現在比較算法很簡單: 迭代第一個HashMap的值並搜索該值作爲新HashMap的關鍵字。如果找到密鑰並且計數器爲0,或者找不到密鑰,則返回false。否則,請計數 - 並繼續下一次迭代。 最後,返回true。

+0

嗨,只有在keyObj完全相同的情況下才能工作嗎?我的意思是,同樣的參考?或者也是相同的對象,但存儲在內存中的2個不同點是好的? – user680406 2011-04-05 13:23:44

+0

我實際上並沒有看到這可能是如何工作的,因爲每個KeyObj是具有所有文檔ID的數組列表,可能與原始數據不同。我的意思是,這實際上是我想測量的錯誤。如果不一樣,我怎樣才能把它當作鑰匙使用? – user680406 2011-04-05 13:25:45

+0

另外,我不知道分配給計數器的值是多少,因爲我只能檢查每個羣集在迭代時共有多少文檔,但不會提前。 – user680406 2011-04-05 13:28:10

相關問題