teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

リンク追記

2017/05/02 22:35

投稿

lazuline8
lazuline8

スコア48

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,7 @@
1
1
  **FP-Growth**というアルゴリズムを利用してアソシエーションルール分析を行い、その途中で生成される**FP-Tree**を図示してくれるプログラムを書こうとしています。
2
2
 
3
3
  FP-Growthのアルゴリズムについては下記の動画が詳しいです。
4
- https://www.youtube.com/watch?v=vPcJEFFWN_k
4
+ [youtube](https://www.youtube.com/watch?v=vPcJEFFWN_k)
5
5
 
6
6
  上記の動画と同じように
7
7
  「入力されたリストと途中まで同じ構造の枝がすでにあるかどうかを調べて、有った場合は共通部分のカウントを増やしつつ新規部分を枝分かれさせて追加し、なかった場合はrootである[NULL]から新しく枝を生やす」

2

想定出力をスクリーンショット画像で追加

2017/05/02 22:35

投稿

lazuline8
lazuline8

スコア48

title CHANGED
File without changes
body CHANGED
@@ -69,21 +69,6 @@
69
69
  dot.edge("<親ノード名>","<子ノード名>")
70
70
  ```
71
71
  という操作ができるため、これを利用しようと思っています。
72
- 期待する出力は下記の通りです(dot記法)
72
+ 期待する出力は下記の通りです
73
- ```dot
74
- digraph {
75
- b [label="b:2"]
76
- d [label="d:1"]
73
+ ![出力例](08188179eaad753c971303588636f694.png)
77
- e [label="c:1"]
78
- c [label="c:1"]
79
- a [label="a:2"]
80
- n [label=NULL]
81
- n -> a
82
- a -> b
83
- b -> c
84
- b -> d
85
- n -> e
86
- }
87
- ```
88
-
89
74
  解決法をご存知でしたらご教示ください。

1

具体的な入出力と作成中のコードを追加しました

2017/05/02 22:34

投稿

lazuline8
lazuline8

スコア48

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,89 @@
1
- **FP-Growth**というアルゴリズムを利用してアソシエーションルール分析を行うとしています。
1
+ **FP-Growth**というアルゴリズムを利用してアソシエーションルール分析を行い、その途中で生成される**FP-Tree**を図示してくれるプログラムを書こうとしています。
2
+
3
+ FP-Growthのアルゴリズムについては下記の動画が詳しいです。
4
+ https://www.youtube.com/watch?v=vPcJEFFWN_k
5
+
6
+ 上記の動画と同じように
7
+ 「入力されたリストと途中まで同じ構造の枝がすでにあるかどうかを調べて、有った場合は共通部分のカウントを増やしつつ新規部分を枝分かれさせて追加し、なかった場合はrootである[NULL]から新しく枝を生やす」
8
+ という作業を繰り返してグラフ化したいのですが、これを実現する方法がわかりません。
9
+
10
+ ```python
11
+ from collections import defaultdict, Iterator
12
+ import graphviz
13
+ dot = graphviz.Digraph()
14
+ X=[["b","c","a"],
15
+ ["b","a","d"],
16
+ ["c"]]
17
+
18
+ #全く同じ組み合わせのトランザクションを数え、[count,transaction]の二項をもつdbを作る(countで降順ソート)
19
+ db = ((X.count(transaction), transaction) for transaction in X)
20
+
21
+ #トランザクション内の要素ごとに出現数を数え、[item:count]の辞書を作る
22
+ item_support = defaultdict(int)
23
+ node_support = defaultdict(int)
24
+ for count, transaction in db:
25
+ for item in transaction:
26
+ item_support[item] += count
27
+ node_support[item] += 1
28
+
29
+ #辞書から出現数がしきい値以下の要素を切り捨てる
30
+ frequent_items = {item
31
+ for item, support in item_support.items()
32
+ if support >= min_support}
33
+
34
+ #要素数でtransactionを降順ソートするため、辞書型の(sort_index)を作る
35
+ sort_index = {item: i
36
+ for i, item in
37
+ enumerate(sorted(frequent_items,
38
+ key=item_support.__getitem__,
39
+ reverse=True))}.__getitem__
40
+ #dbのtransaction内部をsort_indexでソートする
41
+ db = [(count, sorted(frequent_items.intersection(transaction),
42
+ key=sort_index)) for count, transaction in db]
43
+ ```
2
- トランザクションをリスト化して**Orange3-associate**というパッケージ内関数食わせ頻出パターンの抽出完了したのですが、この結果(計算過程構築したツリーツリー図(FP-Growthの概念説明す時に出てるような、ノード間線で引い出現度を書加えた樹形図)として出力したく思っています。
44
+ 上記ようグラフ描画用のdbを前処理で作ところまではできたのですが、このでツリーを走査して枝分岐させか新し生やすか判断しグラフ描画関に渡す部分で行っています。
45
+ この時点でfrequent_itemsには
46
+ |item|support|
47
+ |:--|--:|
48
+ |a|2|
49
+ |b|2|
50
+ |c|2|
51
+ |d|1|
52
+
53
+ dbには
54
+
55
+ |count|transaction|
56
+ |:--|--:|
57
+ |1|["a","b","c"]|
58
+ |1| ["a","b","d"]|
59
+ |1|["c"]|
60
+
61
+ という内容が入っている想定です。
62
+ 図の出力にはGraphvizを使おうと思っており、graphvizでは
63
+ ノードの追加
64
+ ```python
65
+ dot.node("<ノード名>")
66
+ ```
67
+ ノードの親子関係設定
68
+ ```python
69
+ dot.edge("<親ノード名>","<子ノード名>")
70
+ ```
71
+ という操作ができるため、これを利用しようと思っています。
72
+ 期待する出力は下記の通りです(dot記法)
73
+ ```dot
74
+ digraph {
75
+ b [label="b:2"]
76
+ d [label="d:1"]
77
+ e [label="c:1"]
78
+ c [label="c:1"]
79
+ a [label="a:2"]
80
+ n [label=NULL]
81
+ n -> a
82
+ a -> b
83
+ b -> c
84
+ b -> d
85
+ n -> e
86
+ }
87
+ ```
88
+
3
- このようなことができるパッケージや手法をご存知であれば、ご教示ください。
89
+ 解決法をご存知でしたらご教示ください。