質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

2回答

3355閲覧

類似度を使ったクラスタリング法

Yoshi-5630

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2017/01/04 13:32

編集2017/01/05 06:23

###実現したいこと

IaaSクラウドオントロジクラスタリングに関するシステムを作っています

要素(elem)と要素(elem)
要素(elem)とクラスタ(cluster)
クラスタ(cluster)とクラスタ(cluster)

このそれぞれ3種類を、類似度を使いJavaで実現したいと思っています。

###発生している問題(分からないこと)
イメージとしては、類似度(Similarity)で
要素(elem)と要素(elem)を線で結ぶ
要素(elem)とクラスタ(cluster)を線で結ぶ
クラスタ(cluster)とクラスタ(cluster)を線で結ぶ

で作りたいと考えていますが、類似度を測った後、類似度が高い要素、又はクラスタを線で結ぶという表現をどのようにすればよいか(コードの書き方)がわからないという感じです。

このように3種類をそれぞれメソッドで実装したまでは普通なのですが、そこから全く手がついていません。

###試したこと
本を引っ張り出して読んで、HashMapとか文字列結合などありましたが、どれも実装できませんでした。
単に自分がプログラミングが嫌いなので、逃げてるだけかもしれません。(このような場で言うことではないですが)

###補足情報(言語/FW/ツール等のバージョンなど)
上記の説明ではわからないと思いますので、パワーポイントのスライドを添付させていただきます。

大変わかりづらい説明で恐縮でございますが、どうぞ宜しくお願いします。

[イメージ説明]

public class Plan1 { public static void main(String[] args) throws IOException { final String MODE = "CSV"; final String ClusteringMode = "Avarage"; double hreshold = 0.5d; int clusterSize = 32; String ontFile = "IaaS.owl"; int elemSize = 0; HashMap<String, Integer> elemList = new HashMap<String, Integer>(); double[][] similarity = null; OntModel m = ModelFactory.createOntologyModel(); try { m.read(new FileInputStream("IaaS.owl"), "RDF/XML-ABBREV"); // 指定したファイルをバイナリファイルとして読み込む } catch (FileNotFoundException e) { e.printStackTrace(); } HashMap<String, String> query = new HashMap<String, String>(); OntModel ontModel = loadOnt("IaaS.owl"); String mode = "NORMAL"; String[] csv = loadCSV("cluster.csv"); query.put("CPU", ""); query.put("OS", ""); query.put("Memory", ""); query.put("GHz", ""); query.put("HDD", ""); query.put("SLA", ""); query.put("RAM", ""); query.put("Hourly_Usage_Rate", ""); query.put("Monthly_Usage_Rate", ""); } static String setClusterName(String line, OntModel m) throws IOException { String[] elems = toArray(line); HashMap<String, Integer> names = new HashMap<String, Integer>(); for (int i = 0; i < elems.length; i++) { if (!elems[i].isEmpty() && !elems[i].equals("")) { OntClass targetClass = m .getOntClass("http://www.owl-ontologies.com/Ontology1383285788.owl#" + elems[i]); @SuppressWarnings("unchecked") Iterator<OntClass> superClasses = targetClass.listSuperClasses(true); while (superClasses.hasNext()) { OntClass superClass = superClasses.next(); if ((getString(superClass).equals("CPU") || getString(superClass).equals("Memory") || getString(superClass).equals("GHz") || getString(superClass).equals("HDD") || getString(superClass).equals("SLA") || getString(superClass).equals("RAM") || getString(superClass).equals("Hourly_Usage_Rate") || getString(superClass).equals("Hourly_Usage_Rate")) && !names.containsKey(getString(superClass))) { names.put(getString(superClass), 1); } else if ((getString(superClass).equals("OS") || getString(superClass.getSuperClass()).equals("OS") || getString(superClass.getSuperClass().getSuperClass()).equals("OS")) && !names.containsKey(getString(superClass))) { names.put("OS", 1); } } } } line += ":"; Iterator<String> name = names.keySet().iterator(); while (name.hasNext()) { String key = name.next(); line += key + ","; } return line.substring(0, line.length() - 1); } static double[][] setSimilarity(double[][] similarity) {// similarityの計算方法 System.out.println("---- Set Similarity ----"); for (int i = 0; i < similarity.length; i++) { for (int j = i + 1; j < similarity.length; j++) { similarity[i][j] = Math.random() + 0.1 * Math.random(); if (similarity[i][j] == 0) similarity[i][j] = 0.001; similarity[j][i] = similarity[i][j]; System.out.println(i + "-" + j + ":" + similarity[i][j]); } } return similarity; // 計算結果をsimilarityに返す } @SuppressWarnings("unused") static void Elem_And_Elem(ArrayList<Integer>[] cluster, double[][] similarity, int elemSize, int currentNum) throws IOException { 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; } } static void Cluster_And_Elem(ArrayList<Integer>[] cluster, double[][] similarity, int elemSize, int currentNum) throws IOException { @SuppressWarnings("unchecked") // ClusteringTest.javaより引用 static void Cluster_And_Cluster(double[][] similarity, int elemSize, int clusterSize, HashMap<String, Integer> elemList, String ontFile, OntModel m) throws IOException { ArrayList<Integer>[] cluster = new ArrayList[clusterSize * 2]; // ArrayList for (int i = 0; i < clusterSize * 2; i++) { // 0からクラスタサイズの2倍作成を繰り返す cluster[i] = new ArrayList<Integer>(); } for (int i = 0; i < elemSize; i++) { cluster[1].add(i); } cluster = ClusteringProccess(cluster, similarity, elemSize, 1); // // クラスタリングの結果 System.out.println("---- Clustering Result ----"); for (int i = 0; i < cluster.length; i++) { System.out.print("Cluster[" + i + "]:"); for (int j = 0; j < cluster[i].size(); j++) { System.out.print(cluster[i].get(j) + " "); } System.out.println(""); return; } } private static ArrayList<Integer>[] ClusteringProccess(ArrayList<Integer>[] cluster, double[][] similarity, int elemSize, int i) throws IOException { // TODO 自動生成されたメソッド・スタブ return null; } @SuppressWarnings("unused") private static String[] toArray(String line) throws IOException { return line.split(":")[1].split(","); } /** * * @param rdfNode * @return */ @SuppressWarnings("unused") private static String getString(RDFNode rdfNode) { return rdfNode.toString().substring(rdfNode.toString().indexOf("#") + 1, rdfNode.toString().length()); } private static String[] loadCSV(String file) throws IOException { ArrayList<String> csv = new ArrayList<String>(); FileReader fr; try { fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String line; while ((line = br.readLine()) != null) { csv.add(line); } } catch (FileNotFoundException e) { e.printStackTrace(); } return (String[]) csv.toArray(new String[0]); } private static OntModel loadOnt(String file) { OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); try { ontModel.read(new FileInputStream(file), "RDF/XML-ABBREV"); } catch (FileNotFoundException ex) { ex.printStackTrace(); } return ontModel; } }

※ソースコードの全体を載せます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/01/04 15:33

クラスタはここではIntegerの配列の配列ということになるのですか?クラスタを実現するその型を独自クラスなどに変えることは可能ですか?
yuba

2017/01/04 22:53

線で結ぶというのは、ビジュアル表現上線で結びたいという話ですか? それともデータ構造的にリンクされた状態を表現したいという話ですか?
Yoshi-5630

2017/01/05 01:01

型の表現の、変更は可能です。
Yoshi-5630

2017/01/05 01:02

線で結ぶというのは、データ構造上でリンクと言う意味です。
guest

回答2

0

ベストアンサー

スライドの雰囲気から大学の講義課題のようにお見受けしますので、指導教官の方の意図する教育効果を損なわないよう慎重めに(一から十まで答えを書いてしまわないよう気をつけて)回答します。

要素間のリンクをどう表現するかですが、これは大体どのアルゴリズム本にも先頭の方に書いてあり、「二分木」というデータ構造を用います。
二分木をJavaでどう書き下ろすかは、「継承」もしくは「実装」という方法を使います。

ここまでまず調べてみてください。
わからないところはコメント欄で質問してもらって続けましょう(ただし、本当に講義課題であるなら、まずは指導教官に質問するのが筋かと思います。彼らは学生をサポートするという業務のために報酬をもらっているわけですから)。

投稿2017/01/05 02:21

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yoshi-5630

2017/01/05 03:41 編集

ご回答ありがとうございます。 yuba様の言われる方法を調べてみようと思います。 講義資料ではなくて、より質問内容をイメージをしやすくするために、あの様な書式になってしまいました。
guest

0

Java

1import java.io.BufferedReader; 2import java.io.FileReader; 3import java.io.IOException; 4import java.util.HashMap; 5 6public class DendrogramMax { 7 8 9 public static void main(String[] args) throws IOException { 10 int N = 647; //要素647 11 HashMap<String, Integer> elemList = LoadDepth(); //elemListという名前のハッシュマップにLoadDepthを割り当てる 12 double[][] similarity = LoadSimilarity(N, elemList); //double [][] similarityを(N,elemList)とする 13 14 HashMap<Integer, ElemPair> objectList = new HashMap<Integer, ElemPair>(); //objectListを初期化 15 16 for(int i = 0; i < N; i++){ 17 objectList.put(i, new ElemPair(i+"", i, null, 1)); 18 System.out.println(i+": "+i+", null, 1"); 19 } //要素の数647だけ要素のペアの作成を繰り返す 20 21 System.out.println("---------------------------"); 22 23 String result = null; 24 while(objectList.size()>1){ 25 double max_value = 0; 26 int max_i = 0; //max_iに0を代入 27 int max_j = 0; //max_jに0を代入 28 int max_key1 = 0; //max_key1に0を代入 29 int max_key2 = 0; //max_key2に0を代入 30 for(int key1 : objectList.keySet()){ 31 ElemPair elemPair1 = objectList.get(key1); 32 String[] elems1 = elemPair1.elems.replace("{", "").replace("}", "").split(","); 33 for(int i = 0; i<elems1.length; i++){ 34 for(int key2 : objectList.keySet()){ 35 ElemPair elemPair2 = objectList.get(key2); 36 String[] elems2 = elemPair2.elems.replace("{", "").replace("}", "").split(","); 37 for(int j = 0; j<elems2.length; j++){ 38 if(similarity[Integer.parseInt(elems1[i])][Integer.parseInt(elems2[j])] > max_value && !elems1[i].equals(elems2[j]) && key1 != key2){ 39 max_i = Integer.parseInt(elems1[i]); 40 max_j = Integer.parseInt(elems2[j]); 41 max_key1 = key1; //類似度の高い要素をkey1とする 42 max_key2 = key2; ///類似度の高い要素をkey2とする 43 max_value = similarity[Integer.parseInt(elems1[i])][Integer.parseInt(elems2[j])]; 44 } 45 } 46 } 47 } 48 } 49 ElemPair elemLeft = objectList.get(max_key1); //要素の左側(〇, )にmax_key1を格納 50 ElemPair elemRight = objectList.get(max_key2); //要素の右側( , 〇 )にmax_key1を格納 51 objectList.remove(max_key1); //ObjectListからmax_key1を削除 52 objectList.remove(max_key2); //ObjectListからmax_key2を削除 53 objectList.put(max_key1, new ElemPair("{"+elemLeft.elems+","+elemRight.elems+"}", elemLeft, elemRight, max_value)); 54 result = "{"+elemLeft.elems+","+elemRight.elems+"}"; 55 System.out.println(objectList.size()); 56 System.out.println(" {"+elemLeft.elems+","+elemRight.elems+" }: "+elemLeft+", "+elemRight+", "+max_value); 57 58 } 59 60 61 System.out.println("---------------------------"); 62 System.out.println("Elements list:"); 63 for(String key: elemList.keySet()){ //アルファベット順に振った要素番号を647個表示されるまで繰り返す 64 System.out.println(key+": "+elemList.get(key)); 65 } 66 System.out.println(); 67 System.out.println("Dendrogram:"); 68 System.out.println(result); //結果を表示 69 70 } 71 72 private static HashMap<String, Integer> LoadDepth() throws IOException{ 73 HashMap<String, Integer> elemList = new HashMap<String, Integer>(); 74 FileReader fr = new FileReader("depth.csv"); //depthの読み込み 75 BufferedReader br = new BufferedReader(fr); 76 String line = null; 77 int count = 0; 78 while ((line = br.readLine()) != null) { 79 elemList.put(line.split(",")[0], count); 80 count++; 81 } 82 return elemList; 83 } 84 85 private static double[][] LoadSimilarity(int N, HashMap<String, Integer> elemList) throws NumberFormatException, IOException{ 86 String line = null; 87 double[][] similarity = new double[N][N]; //MとNで多次元配列を初期化 88 FileReader fr = new FileReader("similarity.csv"); //similarity.csvを読み込み 89 BufferedReader br = new BufferedReader(fr); 90 while ((line = br.readLine()) != null) { 91 similarity[elemList.get(line.split(",")[2])][elemList.get(line.split(",")[3])] = Double.parseDouble(line.split(",")[1]); 92 } 93 94 return similarity; //similarityに返す 95 } 96 97} 98 99class ElemPair{ 100 String elems; 101 Object elem1; 102 Object elem2; 103 double distance; 104 105 public ElemPair(String elems, Object elem1, Object elem2, double distance){ 106 this.elems = elems; 107 this.elem1 = elem1; 108 this.elem2 = elem2; 109 this.distance = distance; 110 } 111} 112

という形でできました。

投稿2017/01/26 10:22

Yoshi-5630

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問