古いデータ ビジュアライゼーションを新しいプラットフォームに変換していますが、コミュニティの並べ替え機能に少し固執しています。元のコードでは、作成者がコサイン類似度計算機で凝集クラスタリングを使用しているようです。Javascript でこれにアプローチする最善の方法は、カスタム コサイン類似度関数をメトリックとして使用して、clusterfck でツリーを作成することだと考えました。ツリーは、渡すデータのセットごとにほぼ正しくソートされます。(ただし、プロジェクトの仕様上、「ほぼ」では十分ではありません)。アルゴリズムをチェックしたところ、すべてが正しく見えましたが、コサイン類似度とユークリッド距離を使用して結果を比較すると、同じ並べ替え結果が得られます。
何が原因でしょうか? 何かを間違って渡している可能性があり、clusterfck はデフォルトで euclidean を渡していると思います。以下は私のコードの一部です。誰かが確認できますか?(また、コサイン類似度を計算する簡単な方法はありますか? JS にはドット積が組み込まれているとは思いません)。
clusters = clusterfck.hcluster(relationArray, clusterfck.cosSim2, clusterfck.SINGLE_LINKAGE);
postOrder(clusters);
function postOrder(t) {
i++;
if (t == null) {
return;
} else {
postOrder(t.left);
postOrder(t.right);
if (t.left == null && t.right == null) {
communityArr.push(t.canonical[0]);
} else {
return;
}
}
}
function cosSim2(arr1, arr2) {
var d1 = 0,
d2 = 0,
cos = 0;
for(var i = 0; i < arr1.length; i++) {
d1 += Math.pow(arr1[i], 2);
}
for(var j = 0; j < arr2.length; j++) {
d2 += Math.pow(arr2[j], 2);
}
d1 = Math.sqrt(d1);
d2 = Math.sqrt(d2);
for(var j = 0; j < arr2.length; j++) {
if (arr1[j] == null) {
cos += 0;
} else {
cos += arr1[j] * arr2[j];
}
}
var cosSimilarity = cos / (d1 * d2);
return cosSimilarity;
}