Javaで凝集クラスタリングアルゴリズムを作成していますが、削除操作に問題があります。クラスタの数が最初の数の半分に達すると、常に失敗するようです。HashSetから反復処理しても失敗します。
以下のサンプルコードでは、clusters
はCollection<Collection<Integer>>
です。ループを通るいくつか実行した後
while(clusters.size() > K){
// determine smallest distance between clusters
Collection<Integer> minclust1 = null;
Collection<Integer> minclust2 = null;
double mindist = Double.POSITIVE_INFINITY;
for(Collection<Integer> cluster1 : clusters){
for(Collection<Integer> cluster2 : clusters){
if(cluster1 != cluster2 && getDistance(cluster1, cluster2) < mindist){
minclust1 = cluster1;
minclust2 = cluster2;
mindist = getDistance(cluster1, cluster2);
}
}
}
// merge the two clusters
minclust1.addAll(minclust2);
clusters.remove(minclust2);
}
、clusters.remove(minclust2)
は、最終的にはfalseを返しますが、私は理由を理解していません。
最初に10個のクラスターを作成し、それぞれのクラスターを1から10の整数で作成しました。距離は0から1の間の乱数です。ここにはprintlnステートメントをいくつか追加した後の出力があります。多数のクラスタの後に、実際のクラスタ、マージ操作、およびclusters.remove(minclust2)の結果を出力します。
Clustering: 10 clusters
[[3], [1], [10], [5], [9], [7], [2], [4], [6], [8]]
[5] <- [6]
true
Clustering: 9 clusters
[[3], [1], [10], [5, 6], [9], [7], [2], [4], [8]]
[7] <- [8]
true
Clustering: 8 clusters
[[3], [1], [10], [5, 6], [9], [7, 8], [2], [4]]
[10] <- [9]
true
Clustering: 7 clusters
[[3], [1], [10, 9], [5, 6], [7, 8], [2], [4]]
[5, 6] <- [4]
true
Clustering: 6 clusters
[[3], [1], [10, 9], [5, 6, 4], [7, 8], [2]]
[3] <- [2]
true
Clustering: 5 clusters
[[3, 2], [1], [10, 9], [5, 6, 4], [7, 8]]
[10, 9] <- [5, 6, 4]
false
Clustering: 5 clusters
[[3, 2], [1], [10, 9, 5, 6, 4], [5, 6, 4], [7, 8]]
[10, 9, 5, 6, 4] <- [5, 6, 4]
false
Clustering: 5 clusters
[[3, 2], [1], [10, 9, 5, 6, 4, 5, 6, 4], [5, 6, 4], [7, 8]]
[10, 9, 5, 6, 4, 5, 6, 4] <- [5, 6, 4]
false
[10、9、5、6、4、5、6、4、...]セットがそこから無限に成長します。
編集:明確にする、私は(クラスタ内の各クラスタについてHashSet<HashSet<Integer>>)
をを使用してい
[10,9,5,6,4,5,6,4、...]は明らかに1組ではありません。それはリストですか? –
ええ、良い点。 HashSetは重複したオブジェクトを含むことはできません。ここには何か変だ。 –