2015-06-01 76 views
0

我執行對多個對象的成對比較和估計的相似創建從成對比較

Item-1,Item-2,Similarity 
11, 16, 0.9 
11, 18, 0.5 
11, 21, 0.9 
12, 19, 0.8 
12,22, 0.9 
12, 24, 0.3 

祝基於閾值到現在創建集羣,例如具有0.8的閾想列表創建列表如下:

{11,16, 21} 
{12,19,22} 

with threshold > 0.8 

有沒有辦法在LINQ中做到這一點?我發現了幾種從列表生成對的方法,但是我需要做相反的操作。

+1

但是'16'和'21'之間沒有相似之處。此外,你用什麼作爲門檻?最低/總和/產品/ ... –

+0

因爲11對於16和21都很常見,所以它們需要聚集在一起。不確定我得到問題的第二部分 – Santino

+0

你可以說第一個簇的相似性是'0.72':s(11,16)* s(11,21)'。由於*樸素貝葉斯假設*,一些AI算法會這樣做。 –

回答

2

假設你有這樣的對,在性能,Item1Item2的集合,並Similarity請求組前兩個是整數,第二個是雙精度。

var threshold = 0.8f; 
var sets = pairs.Where(p => p.Similarity > threshold) 
       .GroupBy(p => p.Item1, p => p.Item2) 
       .Select(g => new [] { g.Key }.Union(g)); 
+0

這似乎是我正在尋找的。萬分感謝。一直堅持了幾個小時。 – Santino

1

您可以開始使用

items.Where(i => i.Similarity >= .8).GroupBy(i => i.Item1)

,然後將名單group.Key + group.Select(i => i.Item2)