私は現在の式を実装する必要があります。これは、分類法でノードをスコアリングするためのものです。基本的に、ノードのスコアは、子ノードの数とそのスコアに依存します((nodes(h+1))
は次のレベルのノードの数であり、Cl(concept)
は子の集合です)。私のユースケース用語頻度で再帰的メソッドへの数式
だけ今のように葉のために定義されています。私は実装を行いましたが、問題はノードの子が2人いる場合、実装は片側だけになるということです。特定の分類のために
:
周波数が与えられている 1
/\
2 3
| |
4 17
/\
11 13
:freq(11) = 3
、freq(13) = 5
とfreq(17) = 10
。 node(1)
のスコアを取得しようとすると、結果は0.0
になります。再帰は子孫node(4)
には入っていないため、freq(17)
しか取得できません。通常、結果がでなければなりません。ここ
7.実装です:
public static float calcScore(int keyID, Map<Integer, Integer> frequencies, Map<Integer, Integer> subTaxonomy) {
float res = 0f;
int nodes = 0;
if (frequencies.containsKey(keyID)) {
return frequencies.get(keyID) + 0f;
}
for (Map.Entry<Integer, Integer> entry : subTaxonomy.entrySet()) {
if (entry.getValue() - 1 == subTaxonomy.get(keyID)) {
nodes++;
res += calcScore(entry.getKey(), frequencies, subTaxonomy);
}
}
return 1/nodes * res;
}
注:
subTaxonomy
- 店舗ノードIDと分類
frequencies
でそのレベル - 周波数を保存しますリーフノードの場合。
私もIdeoneでスニペットを作成しました:それは与えられたノードのすべての子供たちの上に横断するようSource
は、どのように私は、コードを編集する必要がありますか?
UPDATEだから今
は、更新されたソースで、それはすべての分類学上の横断が、結果はまだ0.0です。
を含むマップである、あなたは、そのレベルよりも大きい場合、すべてのノードを取得することができますあなたが地図から興味を持っているノードのレベル? – SomeDude
@svasaはい、それは基本的に私がやっていることです。私は与えられたノードのレベルを取得し、トラバース中には1つ下のレベルにあるすべてのノードをチェックし、それらを子ノードとみなします。つまり、そのノードにメソッドを適用します。 – Cap
'subTaxonomy.put(17、3);'ではないでしょうか? – c0der