質問編集履歴

3

リンク追記

2017/05/02 22:35

投稿

lazuline8
lazuline8

スコア48

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  FP-Growthのアルゴリズムについては下記の動画が詳しいです。
6
6
 
7
- https://www.youtube.com/watch?v=vPcJEFFWN_k
7
+ [youtube](https://www.youtube.com/watch?v=vPcJEFFWN_k)
8
8
 
9
9
 
10
10
 

2

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

2017/05/02 22:35

投稿

lazuline8
lazuline8

スコア48

test CHANGED
File without changes
test CHANGED
@@ -140,38 +140,8 @@
140
140
 
141
141
  という操作ができるため、これを利用しようと思っています。
142
142
 
143
- 期待する出力は下記の通りです(dot記法)
143
+ 期待する出力は下記の通りです
144
144
 
145
- ```dot
146
-
147
- digraph {
148
-
149
- b [label="b:2"]
150
-
151
- d [label="d:1"]
145
+ ![出力例](08188179eaad753c971303588636f694.png)
152
-
153
- e [label="c:1"]
154
-
155
- c [label="c:1"]
156
-
157
- a [label="a:2"]
158
-
159
- n [label=NULL]
160
-
161
- n -> a
162
-
163
- a -> b
164
-
165
- b -> c
166
-
167
- b -> d
168
-
169
- n -> e
170
-
171
- }
172
-
173
- ```
174
-
175
-
176
146
 
177
147
  解決法をご存知でしたらご教示ください。

1

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

2017/05/02 22:34

投稿

lazuline8
lazuline8

スコア48

test CHANGED
File without changes
test CHANGED
@@ -1,5 +1,177 @@
1
- **FP-Growth**というアルゴリズムを利用してアソシエーションルール分析を行うとしています。
1
+ **FP-Growth**というアルゴリズムを利用してアソシエーションルール分析を行い、その途中で生成される**FP-Tree**を図示してくれるプログラムを書こうとしています。
2
2
 
3
- トランザクションをリスト化して**Orange3-associate**というパッケージ内の関数に食わせる事で頻出パターンの抽出は完了したのですが、この結果(計算過程で構築したツリー)をツリー図(FP-Growthの概念を説明する時に出てくるような、ノード間を線で引いて出現度数を書き加えた樹形図)として出力したく思っています。
4
3
 
4
+
5
+ FP-Growthのアルゴリズムについては下記の動画が詳しいです。
6
+
7
+ https://www.youtube.com/watch?v=vPcJEFFWN_k
8
+
9
+
10
+
11
+ 上記の動画と同じように
12
+
13
+ 「入力されたリストと途中まで同じ構造の枝がすでにあるかどうかを調べて、有った場合は共通部分のカウントを増やしつつ新規部分を枝分かれさせて追加し、なかった場合はrootである[NULL]から新しく枝を生やす」
14
+
15
+ という作業を繰り返してグラフ化したいのですが、これを実現する方法がわかりません。
16
+
17
+
18
+
19
+ ```python
20
+
21
+ from collections import defaultdict, Iterator
22
+
23
+ import graphviz
24
+
25
+ dot = graphviz.Digraph()
26
+
27
+ X=[["b","c","a"],
28
+
29
+ ["b","a","d"],
30
+
31
+ ["c"]]
32
+
33
+
34
+
35
+ #全く同じ組み合わせのトランザクションを数え、[count,transaction]の二項をもつdbを作る(countで降順ソート)
36
+
37
+ db = ((X.count(transaction), transaction) for transaction in X)
38
+
39
+
40
+
41
+ #トランザクション内の要素ごとに出現数を数え、[item:count]の辞書を作る
42
+
43
+ item_support = defaultdict(int)
44
+
45
+ node_support = defaultdict(int)
46
+
47
+ for count, transaction in db:
48
+
49
+ for item in transaction:
50
+
51
+ item_support[item] += count
52
+
53
+ node_support[item] += 1
54
+
55
+
56
+
57
+ #辞書から出現数がしきい値以下の要素を切り捨てる
58
+
59
+ frequent_items = {item
60
+
61
+ for item, support in item_support.items()
62
+
63
+ if support >= min_support}
64
+
65
+
66
+
67
+ #要素数でtransactionを降順ソートするため、辞書型の(sort_index)を作る
68
+
69
+ sort_index = {item: i
70
+
71
+ for i, item in
72
+
73
+ enumerate(sorted(frequent_items,
74
+
75
+ key=item_support.__getitem__,
76
+
77
+ reverse=True))}.__getitem__
78
+
79
+ #dbのtransaction内部をsort_indexでソートする
80
+
81
+ db = [(count, sorted(frequent_items.intersection(transaction),
82
+
83
+ key=sort_index)) for count, transaction in db]
84
+
85
+ ```
86
+
87
+ 上記のようにグラフ描画用のdbを前処理で作るところまではできたのですが、この後でツリーを走査して枝を分岐させるか新しく生やすかを判断してグラフ描画関数に渡す部分で行き詰っています。
88
+
89
+ この時点でfrequent_itemsには
90
+
91
+ |item|support|
92
+
93
+ |:--|--:|
94
+
95
+ |a|2|
96
+
97
+ |b|2|
98
+
99
+ |c|2|
100
+
101
+ |d|1|
102
+
103
+
104
+
105
+ dbには
106
+
107
+
108
+
109
+ |count|transaction|
110
+
111
+ |:--|--:|
112
+
113
+ |1|["a","b","c"]|
114
+
115
+ |1| ["a","b","d"]|
116
+
117
+ |1|["c"]|
118
+
119
+
120
+
121
+ という内容が入っている想定です。
122
+
123
+ 図の出力にはGraphvizを使おうと思っており、graphvizでは
124
+
125
+ ノードの追加
126
+
127
+ ```python
128
+
129
+ dot.node("<ノード名>")
130
+
131
+ ```
132
+
133
+ ノードの親子関係設定
134
+
135
+ ```python
136
+
137
+ dot.edge("<親ノード名>","<子ノード名>")
138
+
139
+ ```
140
+
141
+ という操作ができるため、これを利用しようと思っています。
142
+
143
+ 期待する出力は下記の通りです(dot記法)
144
+
145
+ ```dot
146
+
147
+ digraph {
148
+
149
+ b [label="b:2"]
150
+
151
+ d [label="d:1"]
152
+
153
+ e [label="c:1"]
154
+
155
+ c [label="c:1"]
156
+
157
+ a [label="a:2"]
158
+
159
+ n [label=NULL]
160
+
161
+ n -> a
162
+
163
+ a -> b
164
+
165
+ b -> c
166
+
167
+ b -> d
168
+
169
+ n -> e
170
+
171
+ }
172
+
173
+ ```
174
+
175
+
176
+
5
- このようなことができるパッケージや手法をご存知であれば、ご教示ください。
177
+ 解決法をご存知でしたらご教示ください。