###前提・実現したいこと
Javaでオントロジクラスタリングに関するシステムを作っています。
類似度を使って要素同士、要素とクラスタ、クラスタとクラスタを比較する機能を実装しています
###発生している問題・エラーメッセージ
下記に示した部分は、要素と要素で類似度の最も高い2つの要素をつなぐ
と言った処理です
次に、クラスタと要素で、「類似度の最も高いクラスタ内の要素を基準としてクラスタと要素をつなぐ」という事とクラスタとクラスタの場合「クラスタに含まれる最上位層に繋がれている要素を比較して類似度の最も高い要素を含む2つのクラスタをつなぐ」ということを実現したいです。
Javaに触れるのが2年ぶりで変数だとか引数の扱いをすっかり忘れてしまい、困っています。
###該当のソースコード
static ArrayList<Integer>[] hardClusteringProc(ArrayList<Integer>[] cluster, double[][] similarity, int elemSize, int currentNum) { int aaa = 0; if (cluster[currentNum].size() > 1 && currentNum * 2 + 1 <= cluster.length) { while (true) { int a_min = 0; int b_min = 0; double sim_min = 1.0d; double sim_max = 0.0d; for (int i = 0; i < cluster[currentNum].size(); i++) { int num1 = cluster[currentNum].get(i); for (int j = 0; j < cluster[currentNum].size(); j++) { int num2 = cluster[currentNum].get(j); if (similarity[num1][num2] < sim_min && num1 != num2) { if (cluster[currentNum * 2].isEmpty() && cluster[currentNum * 2 + 1].isEmpty()) { a_min = num1; b_min = num2; sim_min = similarity[num1][num2]; } else if (!cluster[currentNum * 2].contains(num1) && !cluster[currentNum * 2 + 1].contains(num2)) { a_min = num1; b_min = num2; sim_min = similarity[num1][num2]; } } } if (sim_min == 1.0d) break; String chosen = ""; if (!cluster[currentNum * 2].isEmpty() && !cluster[currentNum * 2 + 1].isEmpty()) { System.out.println("---- Get Minimum Value ----:" + currentNum); System.out.println("[" + a_min + "][" + b_min + "] = " + sim_min); for (int i = 0; i < cluster[currentNum * 2].size(); i++) { int num1 = cluster[currentNum * 2].get(i); if (similarity[num1][a_min] > sim_max && num1 != a_min) { sim_max = similarity[num1][a_min]; chosen = "2n"; } } for (int i = 0; i < cluster[currentNum * 2].size(); i++) { int num1 = cluster[currentNum * 2].get(i); if (similarity[num1][b_min] > sim_max && num1 != b_min) { sim_max = similarity[num1][b_min]; chosen = "2n+1"; } } for (int j = 0; j < cluster[currentNum * 2 + 1].size(); j++) { int num2 = cluster[currentNum * 2 + 1].get(j); if (similarity[num2][a_min] > sim_max && num2 != a_min) { sim_max = similarity[num2][a_min]; chosen = "2n+1"; } } for (int j = 0; j < cluster[currentNum * 2 + 1].size(); j++) { int num2 = cluster[currentNum * 2 + 1].get(j); if (similarity[num2][b_min] > sim_max && num2 != b_min) { sim_max = similarity[num2][b_min]; chosen = "2n"; } } } // if (chosen.equals("2n+1")) { cluster[currentNum * 2].add(b_min); cluster[currentNum * 2 + 1].add(a_min); } else { cluster[currentNum * 2].add(a_min); cluster[currentNum * 2 + 1].add(b_min); } } double sim_max = 0.0d; String chosen = ""; for (int i = 0; i < cluster[currentNum].size(); i++) { int num1 = cluster[currentNum].get(i); if (!cluster[currentNum * 2].contains(num1) && !cluster[currentNum * 2 + 1].contains(num1)) { for (int j = 0; j < cluster[currentNum * 2].size(); j++) { int num2 = cluster[currentNum * 2].get(j); if (similarity[num1][num2] > sim_max && num1 != num2) { sim_max = similarity[num1][num2]; chosen = "2n"; } } for (int j = 0; j < cluster[currentNum * 2 + 1].size(); j++) { int num3 = cluster[currentNum * 2 + 1].get(j); if (similarity[num1][num3] > sim_max && num1 != num3) { sim_max = similarity[num1][num3]; chosen = "2n+1"; } } if (chosen.equals("2n")) { cluster[currentNum * 2].add(num1); } else if (chosen.equals("2n+1")) { cluster[currentNum * 2 + 1].add(num1); } } } // cluster = hardClusteringProc(cluster, similarity, elemSize, currentNum * 2); cluster = hardClusteringProc(cluster, similarity, elemSize, currentNum * 2 + 1); } return cluster; }
###補足情報(言語/FW/ツール等のバージョンなど)
言語:Java
開発環境:Eclipse Neon
回答1件
あなたの回答
tips
プレビュー