武翔

add apriori and userfc

1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 1,
6 + "metadata": {
7 + "collapsed": true
8 + },
9 + "outputs": [],
10 + "source": [
11 + "dataSet = [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]"
12 + ]
13 + },
14 + {
15 + "cell_type": "code",
16 + "execution_count": 2,
17 + "metadata": {
18 + "collapsed": true
19 + },
20 + "outputs": [],
21 + "source": [
22 + "#对数据集中的每一项构建一个不变的集合,作为第一个候选项集\n",
23 + "def createC1(dataSet):\n",
24 + " c1 = []\n",
25 + " for transaction in dataSet:\n",
26 + " for item in transaction:\n",
27 + " if not [item] in c1:\n",
28 + " c1.append([item])\n",
29 + " c1.sort()\n",
30 + " return map(frozenset,c1)\n",
31 + "\n",
32 + "#找出满足最小支持度的频繁项集,Ck为候选项集列表,最开始为单个的候选项集,D表示数据集合\n",
33 + "def scanD(D,Ck,minSupport):\n",
34 + " ssCnt ={}\n",
35 + " for tid in D:\n",
36 + " for can in Ck:#遍历每一个候选项集\n",
37 + " if can.issubset(tid):\n",
38 + " if not ssCnt.has_key(can):\n",
39 + " ssCnt[can]=1\n",
40 + " else:\n",
41 + " ssCnt[can]+=1\n",
42 + " numItems = float(len(D))#数据集总共有多少项\n",
43 + " retList = []\n",
44 + " supportData = {}\n",
45 + " for key in ssCnt:\n",
46 + " support = ssCnt[key]/numItems\n",
47 + " if support >= minSupport:\n",
48 + " retList.insert(0,key)\n",
49 + " supportData[key]=support\n",
50 + " #supportData包含每一个候选项集的支持度\n",
51 + " #retlist包含每一个满足最小支持度的项集\n",
52 + " return retList,supportData\n",
53 + "#生成频繁项集\n",
54 + "\n",
55 + "\n",
56 + "#参数为频繁项集列表Lk和项集个数K,输出候选集\n",
57 + "def aprioriGen(Lk, k):\n",
58 + " retList = []\n",
59 + " lenLk = len(Lk)#频繁项集个数\n",
60 + " for i in range(lenLk):\n",
61 + " for j in range(i+1,lenLk):\n",
62 + " L1=list(Lk[i])[:k-2]\n",
63 + " L2=list(Lk[j])[:k-2]\n",
64 + " L1.sort(),L2.sort()\n",
65 + " if L1==L2:\n",
66 + " retList.append(Lk[i]|Lk[j])\n",
67 + " return retList\n",
68 + "\n",
69 + "def apriori(dataSet,minSupport=0.5):\n",
70 + " C1=createC1(dataSet)\n",
71 + " D = map(set,dataSet)\n",
72 + " L1, supportData = scanD(D,C1,minSupport)\n",
73 + " L=[L1]\n",
74 + " k=2\n",
75 + " while (len(L[k-2])>0):\n",
76 + " Ck = aprioriGen(L[k-2],k)#输出候选项集\n",
77 + " Lk, supK = scanD(D,Ck,minSupport)#生成频繁项集\n",
78 + " supportData.update(supK)#更每一个候选集的字典\n",
79 + " L.append(Lk)\n",
80 + " k += 1\n",
81 + " return L, supportData\n",
82 + "\n",
83 + "\n",
84 + "def generateRules(L,supportData,minConf=0.7):\n",
85 + " bigRuleList=[]\n",
86 + " for i in range(1,len(L)):\n",
87 + " for freqSet in L[i]:\n",
88 + " H1 = [frozenset([item]) for item in freqSet]\n",
89 + " if(i>1):\n",
90 + " rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf)\n",
91 + " else:\n",
92 + " calcConf(freqSet,H1,supportData,bigRuleList,minConf)\n",
93 + " return bigRuleList\n",
94 + "\n",
95 + "def calcConf(freqSet,H,supportData,br1,minConf=0.7):\n",
96 + " prunedH = []\n",
97 + " for conseq in H:\n",
98 + " conf = supportData[freqSet]/supportData[freqSet-conseq]\n",
99 + " if conf >= minConf:\n",
100 + " print (freqSet-conseq,'-->',conseq,'conf:',conf)\n",
101 + " br1.append((freqSet-conseq,conseq,conf))\n",
102 + " prunedH.append(conseq)\n",
103 + " return prunedH\n",
104 + "\n",
105 + "def rulesFromConseq(freqSet,H,supportData,br1,minConf=0.7):\n",
106 + " m=len(H[0])\n",
107 + " if (len(freqSet)>(m+1)):\n",
108 + " Hmp1=aprioriGen(H,m+1)\n",
109 + " Hmp1=calcConf(freqSet,Hmp1,supportData,br1,minConf)\n",
110 + " if (len(Hmp1)>1):\n",
111 + " rulesFromConseq(freqSet,Hmp1,supportData,br1,minConf)"
112 + ]
113 + },
114 + {
115 + "cell_type": "code",
116 + "execution_count": 4,
117 + "metadata": {
118 + "collapsed": false
119 + },
120 + "outputs": [],
121 + "source": [
122 + "#和上面函数功能一致,用列表表达式标书\n",
123 + "# C1 = []\n",
124 + "# [[C1.append([item]) for item in transaction if [item] not in C1]for transaction in DataSet]\n",
125 + "# C1.sort()\n",
126 + "# map(frozenset,C1)"
127 + ]
128 + },
129 + {
130 + "cell_type": "code",
131 + "execution_count": 5,
132 + "metadata": {
133 + "collapsed": false
134 + },
135 + "outputs": [],
136 + "source": [
137 + "# C1=createC1(DataSet)\n",
138 + "# D=map(set,DataSet)\n",
139 + "# L1,suppData0=scanD(D,C1,0.5)\n",
140 + "# L1"
141 + ]
142 + },
143 + {
144 + "cell_type": "code",
145 + "execution_count": 6,
146 + "metadata": {
147 + "collapsed": false
148 + },
149 + "outputs": [],
150 + "source": [
151 + "# #it's a test!\n",
152 + "# for i in range(4):\n",
153 + "# for j in range(i+1,4):\n",
154 + "# print (i,j)\n",
155 + "# #把0、1、2、3共四个数两两进行组合"
156 + ]
157 + },
158 + {
159 + "cell_type": "code",
160 + "execution_count": 7,
161 + "metadata": {
162 + "collapsed": false
163 + },
164 + "outputs": [
165 + {
166 + "data": {
167 + "text/plain": [
168 + "[[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]"
169 + ]
170 + },
171 + "execution_count": 7,
172 + "metadata": {},
173 + "output_type": "execute_result"
174 + }
175 + ],
176 + "source": [
177 + "dataSet"
178 + ]
179 + },
180 + {
181 + "cell_type": "code",
182 + "execution_count": 26,
183 + "metadata": {
184 + "collapsed": false
185 + },
186 + "outputs": [
187 + {
188 + "data": {
189 + "text/plain": [
190 + "[[frozenset({1}), frozenset({3}), frozenset({2}), frozenset({5})],\n",
191 + " [frozenset({1, 3}), frozenset({2, 5}), frozenset({2, 3}), frozenset({3, 5})],\n",
192 + " [frozenset({2, 3, 5})],\n",
193 + " []]"
194 + ]
195 + },
196 + "execution_count": 26,
197 + "metadata": {},
198 + "output_type": "execute_result"
199 + }
200 + ],
201 + "source": [
202 + "L,suppData=apriori(dataSet,minSupport=0.5)\n",
203 + "# rules=generateRules(L,suppData,minConf=0.7)\n",
204 + "L"
205 + ]
206 + },
207 + {
208 + "cell_type": "code",
209 + "execution_count": 27,
210 + "metadata": {
211 + "collapsed": false
212 + },
213 + "outputs": [
214 + {
215 + "data": {
216 + "text/plain": [
217 + "{frozenset({5}): 0.75,\n",
218 + " frozenset({3}): 0.75,\n",
219 + " frozenset({2, 3, 5}): 0.5,\n",
220 + " frozenset({1, 2}): 0.25,\n",
221 + " frozenset({1, 5}): 0.25,\n",
222 + " frozenset({3, 5}): 0.5,\n",
223 + " frozenset({4}): 0.25,\n",
224 + " frozenset({2, 3}): 0.5,\n",
225 + " frozenset({2, 5}): 0.75,\n",
226 + " frozenset({1}): 0.5,\n",
227 + " frozenset({1, 3}): 0.5,\n",
228 + " frozenset({2}): 0.75}"
229 + ]
230 + },
231 + "execution_count": 27,
232 + "metadata": {},
233 + "output_type": "execute_result"
234 + }
235 + ],
236 + "source": [
237 + "suppData"
238 + ]
239 + },
240 + {
241 + "cell_type": "code",
242 + "execution_count": null,
243 + "metadata": {
244 + "collapsed": true
245 + },
246 + "outputs": [],
247 + "source": []
248 + },
249 + {
250 + "cell_type": "code",
251 + "execution_count": 3,
252 + "metadata": {
253 + "collapsed": false
254 + },
255 + "outputs": [],
256 + "source": [
257 + "import pandas as pd\n",
258 + "import random\n",
259 + "from pandas import DataFrame\n",
260 + "import numpy as np\n"
261 + ]
262 + },
263 + {
264 + "cell_type": "code",
265 + "execution_count": 5,
266 + "metadata": {
267 + "collapsed": false
268 + },
269 + "outputs": [],
270 + "source": [
271 + "df=pd.read_csv('tbl_books.csv')"
272 + ]
273 + },
274 + {
275 + "cell_type": "code",
276 + "execution_count": 12,
277 + "metadata": {
278 + "collapsed": false
279 + },
280 + "outputs": [],
281 + "source": [
282 + "# random.randint(0,5001)"
283 + ]
284 + },
285 + {
286 + "cell_type": "code",
287 + "execution_count": 10,
288 + "metadata": {
289 + "collapsed": false
290 + },
291 + "outputs": [
292 + {
293 + "data": {
294 + "text/plain": [
295 + "0 新刊王氏脉经\n",
296 + "1 处境特殊儿童心理\n",
297 + "2 幼儿心理学\n",
298 + "3 遇见德国\n",
299 + "4 多民族国家的文学与文化\n",
300 + "Name: title, dtype: object"
301 + ]
302 + },
303 + "execution_count": 10,
304 + "metadata": {},
305 + "output_type": "execute_result"
306 + }
307 + ],
308 + "source": [
309 + "books=df.title\n",
310 + "books[:5]"
311 + ]
312 + },
313 + {
314 + "cell_type": "code",
315 + "execution_count": 11,
316 + "metadata": {
317 + "collapsed": false
318 + },
319 + "outputs": [],
320 + "source": [
321 + "data_value = []\n",
322 + "data_title=[]\n",
323 + "for index in range(500):\n",
324 + " temp_value = []\n",
325 + " temp_title = []\n",
326 + " for random_value in range(random.randint(3,15)):\n",
327 + " value_random=random.randint(0,20)\n",
328 + " temp_value.append(value_random)\n",
329 + " temp_title.append(books[value_random])\n",
330 + " data_value.append(temp_value)\n",
331 + " data_title.append(temp_title)"
332 + ]
333 + },
334 + {
335 + "cell_type": "code",
336 + "execution_count": 15,
337 + "metadata": {
338 + "collapsed": false
339 + },
340 + "outputs": [
341 + {
342 + "name": "stdout",
343 + "output_type": "stream",
344 + "text": [
345 + "<class 'pandas.core.frame.DataFrame'>\n",
346 + "RangeIndex: 500 entries, 0 to 499\n",
347 + "Data columns (total 15 columns):\n",
348 + "0 500 non-null object\n",
349 + "1 500 non-null object\n",
350 + "2 500 non-null object\n",
351 + "3 457 non-null object\n",
352 + "4 421 non-null object\n",
353 + "5 375 non-null object\n",
354 + "6 340 non-null object\n",
355 + "7 302 non-null object\n",
356 + "8 261 non-null object\n",
357 + "9 232 non-null object\n",
358 + "10 194 non-null object\n",
359 + "11 167 non-null object\n",
360 + "12 123 non-null object\n",
361 + "13 78 non-null object\n",
362 + "14 40 non-null object\n",
363 + "dtypes: object(15)\n",
364 + "memory usage: 58.7+ KB\n"
365 + ]
366 + },
367 + {
368 + "data": {
369 + "text/plain": [
370 + "(500, 15)"
371 + ]
372 + },
373 + "execution_count": 15,
374 + "metadata": {},
375 + "output_type": "execute_result"
376 + }
377 + ],
378 + "source": [
379 + "df=DataFrame(data_title)#模拟展示用户收藏信息 模拟800个用户2000本书\n",
380 + "df.info()\n",
381 + "df.shape"
382 + ]
383 + },
384 + {
385 + "cell_type": "code",
386 + "execution_count": 46,
387 + "metadata": {
388 + "collapsed": false
389 + },
390 + "outputs": [
391 + {
392 + "data": {
393 + "text/plain": [
394 + "[[16, 4, 12, 18, 4, 5, 2, 14],\n",
395 + " [0, 17, 7, 6, 20],\n",
396 + " [20, 13, 6, 10, 19],\n",
397 + " [12, 11, 18, 12],\n",
398 + " [0, 17, 17, 8, 4, 17, 6],\n",
399 + " [5, 4, 3, 0, 17, 18, 18, 8, 9],\n",
400 + " [2, 8, 5, 14, 17, 4, 3, 1, 1],\n",
401 + " [7, 11, 16, 11, 10],\n",
402 + " [15, 10, 14, 15, 4, 9, 2, 14],\n",
403 + " [1, 6, 18, 9],\n",
404 + " [3, 10, 6, 15, 10, 17, 4, 20, 4],\n",
405 + " [11, 14, 20, 7],\n",
406 + " [12, 6, 14, 4, 9, 14, 20, 0],\n",
407 + " [2, 13, 1, 5, 13, 6],\n",
408 + " [16, 17, 0, 0],\n",
409 + " [4, 0, 19, 20, 14, 12, 0, 18, 9, 18, 18, 11, 4, 20, 1],\n",
410 + " [1, 10, 8, 18, 17, 8, 10],\n",
411 + " [8, 14, 0, 14, 7, 3, 13, 19, 9, 10, 14, 14, 13, 9],\n",
412 + " [7, 2, 10, 16, 4, 13, 15, 7, 9, 11, 2, 18, 9, 1, 13],\n",
413 + " [11, 13, 14, 20, 2, 7, 19, 5, 16, 9, 6, 2, 14, 10],\n",
414 + " [15, 11, 14, 14, 0, 4, 14, 17, 20, 19, 13, 13, 15],\n",
415 + " [7, 8, 8, 5],\n",
416 + " [4, 14, 19, 19, 11, 5, 14, 9, 17, 13, 7, 15],\n",
417 + " [19, 16, 1, 15, 12, 5, 7, 18],\n",
418 + " [11, 20, 12, 10],\n",
419 + " [7, 10, 13, 3, 15, 14],\n",
420 + " [3, 0, 19, 8, 4, 1, 6],\n",
421 + " [20, 8, 20, 5, 12, 6],\n",
422 + " [19, 19, 11, 18, 17, 8, 6, 3, 9, 2, 18, 15, 11],\n",
423 + " [1, 2, 17, 14, 3, 14, 14, 16, 8, 11, 7, 11],\n",
424 + " [8, 16, 10, 2, 8, 13, 4, 1, 4, 6, 2, 1, 20, 6, 19],\n",
425 + " [9, 2, 4, 6, 0, 0],\n",
426 + " [9, 1, 15, 8, 19, 12, 13, 13, 2, 4, 3, 17],\n",
427 + " [13, 9, 14, 14, 11, 10],\n",
428 + " [12, 9, 0, 5, 19, 10, 6, 20, 7, 5, 3, 5, 6],\n",
429 + " [10, 12, 13, 19, 11, 16, 20, 9, 15, 6, 19, 2, 0, 16],\n",
430 + " [5, 0, 3, 15, 14, 4, 17],\n",
431 + " [17, 0, 14, 17, 17],\n",
432 + " [1, 7, 11, 7, 10, 10, 20],\n",
433 + " [11, 7, 6, 0, 3, 2, 5, 6, 4],\n",
434 + " [4, 1, 18, 20, 9, 16, 7, 4, 6],\n",
435 + " [7, 6, 14],\n",
436 + " [8, 3, 3, 14, 16],\n",
437 + " [17, 11, 2, 16, 10],\n",
438 + " [3, 0, 15, 5, 5, 1, 11, 15, 3, 17, 20, 16, 1],\n",
439 + " [13, 8, 12, 17],\n",
440 + " [20, 9, 6, 3, 2, 14, 9, 1, 17, 6],\n",
441 + " [19, 5, 1, 16, 19, 10, 5, 10],\n",
442 + " [12, 8, 16, 2, 18, 15, 0, 5, 19],\n",
443 + " [14, 7, 11, 18, 7, 3, 18, 1, 18, 19, 9, 12, 9],\n",
444 + " [13, 6, 2],\n",
445 + " [6, 1, 0, 9],\n",
446 + " [2, 17, 20, 10, 1, 11, 16, 18, 3, 8, 5],\n",
447 + " [19, 20, 3, 6, 19, 8, 4, 8, 5, 0, 3, 20, 3, 1],\n",
448 + " [12, 10, 6],\n",
449 + " [7, 0, 16, 14, 0, 7],\n",
450 + " [20, 6, 3, 7, 4, 7, 9, 9, 18, 19, 14, 3, 20, 19, 17],\n",
451 + " [10, 4, 0, 13, 10, 6, 0, 6, 0, 11, 20, 6],\n",
452 + " [10, 4, 14, 5, 1],\n",
453 + " [1, 11, 1, 10, 12, 13, 6, 17, 6, 9, 15],\n",
454 + " [14, 13, 7, 15, 0, 3, 2, 3, 15],\n",
455 + " [1, 10, 1, 17],\n",
456 + " [2, 15, 0, 11, 12, 4, 1, 12, 6, 9, 19, 3, 20, 5],\n",
457 + " [10, 2, 20, 10],\n",
458 + " [7, 17, 5, 14, 15, 4, 13, 1, 17, 5, 2, 4, 4, 20],\n",
459 + " [3, 6, 12, 7],\n",
460 + " [10, 7, 10, 11, 16, 13, 1, 1, 9, 14, 16],\n",
461 + " [4, 19, 15, 17],\n",
462 + " [20, 9, 18, 11, 20, 14],\n",
463 + " [2, 2, 0, 13, 7, 9, 4, 16, 3, 5, 9, 17],\n",
464 + " [0, 9, 19, 12, 12, 3, 18, 6, 8, 8, 4],\n",
465 + " [11, 1, 2, 18, 6, 14, 4, 10, 17, 20, 1, 16],\n",
466 + " [2, 13, 17, 12, 7, 16, 6, 1, 4, 11, 10],\n",
467 + " [0, 15, 19],\n",
468 + " [15, 2, 18, 2, 0, 16, 2, 13, 15, 9, 14, 19, 20, 10],\n",
469 + " [10, 19, 5, 12, 18, 3, 17, 7],\n",
470 + " [18, 5, 15, 16, 20, 9, 18, 13, 0],\n",
471 + " [2, 11, 4, 15, 15],\n",
472 + " [17, 5, 12, 9, 15, 7, 5, 5, 11],\n",
473 + " [3, 15, 14, 15, 0],\n",
474 + " [3, 18, 3, 17, 17, 3, 11, 1, 4, 7, 1, 19],\n",
475 + " [17, 13, 19, 7, 10, 17, 7, 19, 11, 13, 12],\n",
476 + " [17, 2, 11, 7, 0, 12, 12, 20, 9, 20, 11, 7, 4, 1],\n",
477 + " [5, 4, 19, 2],\n",
478 + " [4, 10, 1, 0],\n",
479 + " [0, 17, 17, 17, 4],\n",
480 + " [9, 7, 10],\n",
481 + " [7, 9, 20, 5, 3, 0, 2, 16, 6, 3, 14, 2],\n",
482 + " [20, 18, 9, 12, 4, 17, 2, 4, 3],\n",
483 + " [15, 0, 5, 3, 2, 5, 20, 20, 3, 9, 3, 12, 5, 13, 9],\n",
484 + " [7, 16, 19, 1],\n",
485 + " [7, 10, 12],\n",
486 + " [7, 12, 9, 14, 6, 13, 16],\n",
487 + " [11, 4, 16, 1, 3, 16, 6, 3, 4, 20, 15, 17, 10, 7],\n",
488 + " [14, 8, 13],\n",
489 + " [6, 14, 17, 0, 3, 13, 19, 2, 10],\n",
490 + " [13, 8, 15, 17, 13, 10, 15, 6],\n",
491 + " [6, 14, 8, 14, 11, 4, 6, 18, 10],\n",
492 + " [18, 15, 4, 13, 6, 18],\n",
493 + " [15, 5, 7, 20, 20, 7, 6, 6, 12, 16, 20, 8, 13],\n",
494 + " [1, 11, 14],\n",
495 + " [14, 6, 6],\n",
496 + " [11, 5, 10, 16, 11, 11, 1, 14, 8, 2, 16, 14],\n",
497 + " [3, 5, 6, 12, 17, 3, 15, 0, 19, 5, 6, 18, 10, 20, 16],\n",
498 + " [16, 6, 15, 16, 14],\n",
499 + " [1, 5, 5, 18, 4, 2, 4, 20, 18],\n",
500 + " [6, 13, 0, 14, 3, 14, 13, 16, 2, 13],\n",
501 + " [12, 6, 20, 11, 9, 12, 9, 5],\n",
502 + " [15, 4, 5, 15, 13, 16, 3, 7, 12],\n",
503 + " [9, 13, 0, 7, 17, 16, 9, 13],\n",
504 + " [15, 20, 7, 12, 20, 7, 18, 4, 11, 15],\n",
505 + " [17, 10, 6, 9, 4, 5],\n",
506 + " [18, 9, 13, 13, 16],\n",
507 + " [8, 2, 16, 5],\n",
508 + " [9, 18, 17, 19, 13, 7],\n",
509 + " [15, 3, 3, 8, 0, 7, 7, 3],\n",
510 + " [15, 9, 18, 19, 7, 1, 7, 2, 6, 14],\n",
511 + " [19, 1, 2, 14, 11, 8],\n",
512 + " [9, 13, 14, 9, 1, 20, 7, 15, 4, 15, 6],\n",
513 + " [13, 20, 8, 4, 12, 8, 6, 13, 7],\n",
514 + " [20, 13, 8, 18, 9, 17],\n",
515 + " [0, 10, 5, 5, 2, 10, 12, 5, 12, 15, 11, 10, 14],\n",
516 + " [20, 19, 9, 16, 19, 16, 11, 3],\n",
517 + " [9, 19, 4, 8, 20, 4, 13],\n",
518 + " [15, 1, 6, 5, 9, 1],\n",
519 + " [20, 15, 9, 10, 0, 1],\n",
520 + " [0, 14, 10, 2, 7, 2, 2, 14, 13, 20, 12, 15],\n",
521 + " [6, 20, 7, 5, 1, 14, 17, 17, 14, 18],\n",
522 + " [6, 16, 10, 17, 8, 10, 9, 1, 18],\n",
523 + " [15, 15, 20, 12, 8, 0],\n",
524 + " [7, 9, 19, 0, 7, 19, 13, 8, 16, 15, 20],\n",
525 + " [10, 15, 12, 6, 7, 19, 14, 19, 9, 20, 14, 6],\n",
526 + " [3, 3, 5, 12, 14, 17, 20, 11, 6],\n",
527 + " [12, 18, 11, 9, 4, 17, 4],\n",
528 + " [7, 8, 19, 11, 13, 4, 4, 6, 7, 14, 12],\n",
529 + " [8, 2, 5, 18, 18],\n",
530 + " [20, 6, 4, 2, 15, 1, 15, 16],\n",
531 + " [0, 12, 13],\n",
532 + " [5, 6, 16, 19, 11, 11, 20, 10, 19, 14, 12, 7],\n",
533 + " [3, 16, 18, 10, 2],\n",
534 + " [11, 11, 16],\n",
535 + " [20, 9, 18, 6, 10, 8, 6, 18, 16, 6],\n",
536 + " [10, 0, 0, 13, 2, 16, 11, 2, 5, 17, 0],\n",
537 + " [14, 3, 10, 7, 2, 16],\n",
538 + " [7, 3, 11, 3, 11],\n",
539 + " [11, 0, 17, 16],\n",
540 + " [7, 8, 10, 16, 15, 14, 8, 20, 4, 3, 17, 7],\n",
541 + " [14, 11, 17, 13, 11, 7, 19, 11, 17, 2, 13, 19, 3],\n",
542 + " [5, 14, 14, 13, 6, 17, 4, 14, 11],\n",
543 + " [15, 14, 20, 19, 3, 8, 16, 0, 4, 12, 6, 4, 1, 20, 2],\n",
544 + " [8, 11, 20],\n",
545 + " [16, 16, 5, 2, 8, 13, 12, 6, 8, 9, 5, 8, 5, 19],\n",
546 + " [0, 5, 17, 15, 16, 11, 3, 4, 0, 3, 5],\n",
547 + " [1, 4, 0, 1, 1, 15, 5, 8, 12, 10, 10, 1, 10, 10, 10],\n",
548 + " [15, 14, 4, 7, 13, 19, 19, 15, 12, 14, 7, 8, 11, 19, 10],\n",
549 + " [18, 12, 6, 11, 1, 2, 7],\n",
550 + " [2, 12, 3, 20, 7, 0, 14, 15, 1, 4, 19],\n",
551 + " [9, 0, 4, 19, 9, 20, 14, 1, 11],\n",
552 + " [17, 8, 0, 1],\n",
553 + " [13, 19, 1, 0, 1, 4, 19, 10],\n",
554 + " [19, 9, 2, 18],\n",
555 + " [6, 0, 4, 5, 7, 13, 3, 14, 17, 12, 7, 8, 19, 7],\n",
556 + " [12, 10, 17, 6, 14, 19, 4, 19, 14, 16, 3],\n",
557 + " [12, 15, 2, 0, 10, 16, 15, 10, 16, 2],\n",
558 + " [20, 8, 13, 19, 17, 16, 0],\n",
559 + " [7, 15, 10, 19, 14, 1, 18, 16, 5, 18, 17, 1],\n",
560 + " [7, 0, 12, 4, 15, 19, 9, 17, 8, 9, 20, 16, 11, 13],\n",
561 + " [3, 18, 13, 6, 10, 16, 19, 15, 19, 15, 15, 0, 5, 17],\n",
562 + " [7, 5, 20, 2, 17, 16, 6, 2, 18],\n",
563 + " [12, 0, 4],\n",
564 + " [7, 14, 15, 8, 10, 2, 20, 7, 13, 17, 11, 2],\n",
565 + " [14, 3, 10, 2, 15, 20, 4, 14, 18, 17, 1],\n",
566 + " [11, 15, 2, 3, 20, 0, 18, 10, 20, 16, 14, 10, 15, 6, 1],\n",
567 + " [6, 12, 11],\n",
568 + " [18, 15, 3, 14, 19, 6],\n",
569 + " [16, 4, 2, 18, 9, 19, 18, 2, 8, 11, 14],\n",
570 + " [7, 12, 5, 5, 18, 4],\n",
571 + " [11, 11, 11],\n",
572 + " [17, 2, 9, 12],\n",
573 + " [18, 3, 1, 8, 14, 13, 0],\n",
574 + " [19, 11, 2, 8, 5, 1, 20, 18, 1, 2, 8, 2],\n",
575 + " [19, 17, 12, 20, 10],\n",
576 + " [20, 20, 3, 11],\n",
577 + " [16, 14, 1, 3, 20, 0, 19, 14, 16, 15, 17, 6],\n",
578 + " [9, 8, 18, 13, 12, 2, 9, 12, 7, 8, 19],\n",
579 + " [1, 3, 8, 9, 2, 12, 5],\n",
580 + " [19, 4, 7, 10, 18, 13, 10, 13],\n",
581 + " [8, 1, 6, 19, 7, 8],\n",
582 + " [10, 12, 9, 7, 2, 5, 4, 1, 20, 14, 0, 13],\n",
583 + " [1, 2, 19, 7, 16, 19, 0, 15, 20, 0, 1, 6],\n",
584 + " [1, 14, 15, 20, 3, 7],\n",
585 + " [5, 3, 1, 8],\n",
586 + " [8, 7, 9, 8, 6, 19, 7, 8, 10, 13, 17],\n",
587 + " [0, 12, 6, 2, 6, 4, 20, 15, 10, 2, 10],\n",
588 + " [16, 1, 16, 17, 15, 14, 16, 14, 4, 14, 0, 18, 2, 6, 5],\n",
589 + " [14, 13, 5],\n",
590 + " [6, 1, 20, 14, 11, 3, 12, 14, 3, 11, 11, 0],\n",
591 + " [10, 14, 13, 20, 13, 13, 17],\n",
592 + " [20, 0, 0, 14, 5, 15, 18, 10, 5, 16, 14, 12],\n",
593 + " [5, 2, 1, 15, 6, 13, 15, 8, 7, 6, 10],\n",
594 + " [2, 15, 8, 1, 4, 10, 1, 7],\n",
595 + " [9, 7, 13, 12, 17, 20, 5, 15, 20],\n",
596 + " [4, 3, 18, 6, 18, 4],\n",
597 + " [3, 4, 10, 13, 1, 5, 20],\n",
598 + " [14, 14, 1, 14, 9, 15, 2, 14, 2, 19, 11, 10, 4],\n",
599 + " [9, 13, 2, 9, 3, 20, 10, 14],\n",
600 + " [1, 20, 3],\n",
601 + " [1, 17, 12, 19, 16, 14, 18, 5, 1],\n",
602 + " [2, 14, 13, 9, 2, 10],\n",
603 + " [8, 5, 4, 10, 12, 14, 15],\n",
604 + " [20, 8, 16, 6, 20, 16, 4, 4, 7, 6, 19, 7, 9, 1],\n",
605 + " [4, 8, 0, 14, 17],\n",
606 + " [19, 7, 15, 16, 18, 19, 12, 4, 15, 1, 10, 16],\n",
607 + " [20, 3, 2, 17, 8, 5, 20, 16, 10, 9, 10, 1],\n",
608 + " [2, 12, 14, 13, 18, 7, 9, 13],\n",
609 + " [4, 11, 12, 2, 14, 20, 5, 6, 0, 16, 3, 8],\n",
610 + " [18, 12, 20, 14, 19, 18, 3, 6],\n",
611 + " [12, 15, 2, 4, 20, 16, 16, 9, 19, 15, 3, 9, 9, 1, 9],\n",
612 + " [18, 1, 7, 7, 18, 14, 2, 2, 15, 3, 13],\n",
613 + " [5, 7, 2, 17, 13, 1, 9, 3, 15, 17, 18, 4, 20, 5],\n",
614 + " [12, 4, 1, 17, 17, 0, 1],\n",
615 + " [17, 16, 10, 7, 15, 8, 1, 6, 5, 17, 10, 15, 13, 15],\n",
616 + " [9, 13, 12],\n",
617 + " [15, 7, 6, 2, 1, 2, 10, 17, 8, 4, 14, 15, 15],\n",
618 + " [16, 13, 7, 0, 12, 16, 19, 5],\n",
619 + " [20, 10, 10],\n",
620 + " [20, 3, 3, 16, 8, 17, 8, 16, 16, 8],\n",
621 + " [3, 9, 1, 5, 6],\n",
622 + " [15, 15, 1, 11, 15, 17, 1, 9, 7, 16, 20, 10],\n",
623 + " [19, 3, 4, 7, 2],\n",
624 + " [3, 7, 14, 8, 13, 3, 19, 9, 17, 2, 17, 0, 11, 19],\n",
625 + " [3, 7, 10, 1, 8, 19, 9, 15, 17, 5, 20, 0],\n",
626 + " [0, 2, 16, 2, 7, 0, 15, 17, 14, 15, 8, 10, 19, 19],\n",
627 + " [3, 17, 6, 2, 4, 7, 5, 5, 8, 11, 10, 3, 1],\n",
628 + " [1, 15, 4, 16, 17, 4, 7],\n",
629 + " [10, 20, 16, 7, 2, 12],\n",
630 + " [0, 13, 7, 1, 17, 12, 2, 16, 15, 3, 10, 17],\n",
631 + " [1, 20, 1, 20, 10, 8],\n",
632 + " [12, 5, 7, 5, 11, 13, 7, 8],\n",
633 + " [18, 15, 18, 13, 17, 4],\n",
634 + " [12, 14, 0, 15, 6, 1, 2],\n",
635 + " [15, 17, 18, 0, 18, 4, 0, 11, 18],\n",
636 + " [14, 5, 11, 18, 10, 8, 5, 3, 0, 15, 8, 1, 17],\n",
637 + " [8, 4, 19, 6, 12, 8, 7, 4, 7, 1, 6, 3],\n",
638 + " [17, 5, 14, 7, 16, 1, 5, 19, 13, 16, 17, 0],\n",
639 + " [7, 8, 2, 5, 9, 10, 15, 10, 6, 5, 18, 6, 19, 5, 11],\n",
640 + " [8, 1, 10, 7, 3, 19, 11, 3],\n",
641 + " [1, 16, 13, 20, 16, 8, 8, 5, 11, 6, 9],\n",
642 + " [4, 15, 11, 10, 7, 14, 18, 4, 14, 12, 18, 7],\n",
643 + " [0, 2, 19, 13, 6, 2, 13, 12, 4, 12, 15],\n",
644 + " [5, 15, 15, 1, 10, 16, 7, 0, 7, 10, 3, 9],\n",
645 + " [16, 12, 17, 16, 12, 7, 2, 20, 1],\n",
646 + " [0, 11, 14, 7, 5, 9, 8, 10],\n",
647 + " [1, 12, 11, 14, 19, 6, 15, 19, 1],\n",
648 + " [10, 17, 1, 0, 18, 15, 16, 8],\n",
649 + " [18, 9, 17, 13, 9, 8, 6, 10, 3, 10, 18, 10, 15],\n",
650 + " [16, 0, 14, 3, 15, 5],\n",
651 + " [11, 3, 0, 5, 6, 2, 18, 19, 3, 6],\n",
652 + " [5, 11, 20, 1],\n",
653 + " [13, 11, 18, 2, 0, 14, 15, 15, 16],\n",
654 + " [15, 8, 6, 17, 3, 11, 9],\n",
655 + " [2, 9, 1, 8, 16, 2, 5, 7],\n",
656 + " [1, 11, 11, 5, 4, 11, 2, 9, 18, 4, 20, 4],\n",
657 + " [0, 13, 16, 15, 19, 4, 7, 8, 2, 11],\n",
658 + " [1, 6, 13, 6, 2],\n",
659 + " [8, 13, 7, 18, 12, 0, 18, 5, 15, 2, 9, 9, 0],\n",
660 + " [12, 12, 1, 0, 12, 7, 8, 4, 16, 17, 10, 13, 13],\n",
661 + " [4, 12, 6, 12, 0, 5],\n",
662 + " [4, 15, 12, 9, 20],\n",
663 + " [17, 5, 6, 14, 12, 2, 0, 5, 4, 3, 19, 20, 0, 3],\n",
664 + " [20, 18, 1, 9, 19, 14, 8],\n",
665 + " [1, 4, 11, 2, 6, 20, 1, 0, 7, 16, 16, 19, 5, 20],\n",
666 + " [14, 1, 1, 3, 16, 8, 5, 19],\n",
667 + " [16, 4, 19, 9, 17, 13, 20, 7],\n",
668 + " [0, 19, 6, 19, 4, 10, 11, 1, 13, 1],\n",
669 + " [9, 3, 19, 11],\n",
670 + " [16, 13, 12, 2, 15, 19],\n",
671 + " [9, 15, 7, 20, 3, 15, 4, 10, 10, 19, 7, 20, 11],\n",
672 + " [6, 12, 13, 2, 11, 13, 12, 6, 6, 12, 14],\n",
673 + " [17, 10, 15, 17, 18, 14],\n",
674 + " [5, 12, 2, 1, 19, 9, 17, 5, 0],\n",
675 + " [15, 13, 1, 8, 15],\n",
676 + " [7, 0, 7, 19, 17],\n",
677 + " [7, 10, 13, 1, 2, 7, 13, 16, 10, 4, 18],\n",
678 + " [20, 11, 11],\n",
679 + " [4, 16, 0, 0, 7, 10, 17, 1, 17, 7],\n",
680 + " [10, 4, 8, 7, 13, 9, 12, 2, 20, 16, 0],\n",
681 + " [2, 3, 6, 3, 19, 20],\n",
682 + " [12, 7, 13, 15, 18, 10, 14, 2],\n",
683 + " [8, 0, 3],\n",
684 + " [2, 17, 18, 13, 7, 17, 4, 0, 8, 18, 16],\n",
685 + " [15, 4, 16, 3, 5, 14, 4, 15, 0, 8, 7, 18, 4, 0],\n",
686 + " [9, 14, 0, 18, 0, 14, 5, 0, 4, 14, 3, 0],\n",
687 + " [5, 12, 10, 12, 10, 19, 11, 2, 8, 1, 8, 4, 16, 0],\n",
688 + " [11, 0, 10, 18, 10, 19, 19, 1, 0, 19, 8, 1],\n",
689 + " [13, 5, 18, 3],\n",
690 + " [1, 6, 10],\n",
691 + " [1, 17, 18, 8, 3, 15, 4, 12, 8, 16, 1, 8, 16, 18],\n",
692 + " [1, 2, 12, 11, 10, 7, 18, 2, 7, 11, 0, 7, 16, 2],\n",
693 + " [15, 19, 15, 3, 11],\n",
694 + " [19, 17, 0],\n",
695 + " [0, 14, 9, 18, 1, 8, 12, 20, 18, 17, 6, 8],\n",
696 + " [2, 14, 17, 19, 9, 5, 7, 10, 14, 8, 14, 18, 4],\n",
697 + " [14, 7, 4, 9, 14, 5, 19, 6, 4],\n",
698 + " [19, 3, 20, 18, 1, 3, 20],\n",
699 + " [13, 18, 0, 18, 3, 9, 5, 0, 18],\n",
700 + " [7, 13, 15, 20, 12, 6, 10, 0, 9, 15, 10],\n",
701 + " [16, 0, 6],\n",
702 + " [3, 15, 13, 19, 14, 15],\n",
703 + " [0, 0, 15, 17, 3, 1, 9, 15, 20, 14, 16, 17, 2, 10],\n",
704 + " [1, 14, 9, 4, 11, 2, 13, 2, 4],\n",
705 + " [0, 7, 14, 3, 3, 20, 7, 17, 15, 5, 2],\n",
706 + " [3, 17, 3, 0, 7, 4, 2, 0, 17, 3, 10, 4, 3, 14],\n",
707 + " [7, 14, 15, 16, 7, 6],\n",
708 + " [7, 10, 19],\n",
709 + " [10, 12, 3, 4],\n",
710 + " [20, 12, 20, 5, 4, 2, 14, 8, 14, 17, 11, 20, 2],\n",
711 + " [18, 15, 14, 6, 8, 6, 15, 3, 9, 16, 4, 19, 8, 0],\n",
712 + " [2, 4, 20, 14, 6],\n",
713 + " [5, 4, 18, 17, 19, 16, 10, 12, 13, 2, 20, 8, 17, 4, 1],\n",
714 + " [7, 7, 15, 10, 9, 14, 15, 12, 5, 5, 13, 5, 10, 16, 16],\n",
715 + " [20, 19, 8],\n",
716 + " [8, 13, 14, 8, 4, 4, 1, 20, 4, 19],\n",
717 + " [3, 10, 2],\n",
718 + " [20, 17, 12, 18, 2, 19, 6, 4, 17, 8, 16, 20, 12, 9],\n",
719 + " [16, 20, 10, 7, 15, 20, 20, 12, 17, 14, 3],\n",
720 + " [15, 4, 10, 2, 20, 14, 20, 11, 17],\n",
721 + " [1, 10, 3, 5, 20],\n",
722 + " [3, 13, 5],\n",
723 + " [7, 18, 16, 16, 11, 3, 9, 7, 2],\n",
724 + " [1, 8, 18, 17, 0, 17, 1, 17, 1, 6, 16],\n",
725 + " [18, 12, 16, 3, 1, 2, 1, 11, 0, 2],\n",
726 + " [5, 18, 16, 16, 7, 16, 11, 16, 16, 1, 2, 7, 9, 14],\n",
727 + " [13, 11, 4],\n",
728 + " [2, 20, 4, 19, 15, 5, 1, 16, 20],\n",
729 + " [1, 16, 10, 8, 6, 20, 12, 20, 20, 7, 14, 10, 16, 3, 6],\n",
730 + " [20, 12, 19],\n",
731 + " [11, 15, 5, 15, 1, 14, 3, 16],\n",
732 + " [14, 17, 14, 19, 2, 1, 7, 10, 16, 12],\n",
733 + " [7, 2, 8, 6, 6],\n",
734 + " [10, 16, 1, 19, 2, 14, 17, 9],\n",
735 + " [3, 16, 4, 9, 15, 7, 9, 19],\n",
736 + " [15, 6, 12, 16, 4, 17],\n",
737 + " [17, 16, 18, 3, 14, 5, 4, 10, 6, 12, 10],\n",
738 + " [17, 2, 7, 5],\n",
739 + " [10, 10, 20, 12, 16, 6, 6],\n",
740 + " [20, 0, 7, 16, 11, 9, 1, 8, 16, 6, 19],\n",
741 + " [8, 10, 1, 16, 17, 19, 16, 17, 2, 16, 8, 4, 18, 4, 4],\n",
742 + " [17, 0, 0, 2, 17, 17, 11, 18, 19, 6, 10, 3, 15, 9],\n",
743 + " [18, 13, 10, 5, 6, 17, 4, 19, 18, 1, 14, 9, 14, 4],\n",
744 + " [20, 10, 12, 3],\n",
745 + " [7, 9, 15, 6, 15, 15, 9, 19, 11],\n",
746 + " [10, 4, 18, 16, 14, 2],\n",
747 + " [0, 16, 12, 3, 17, 4, 17, 5, 5, 8, 12, 18, 8, 11],\n",
748 + " [18, 13, 13, 10, 2],\n",
749 + " [17, 17, 16, 5, 7, 2, 16, 9],\n",
750 + " [14, 2, 20, 1, 14, 5, 7, 4, 16, 13, 5, 0, 12, 2, 9],\n",
751 + " [5, 5, 0, 1, 1, 11, 5, 19, 15, 2, 12, 7, 7, 7],\n",
752 + " [10, 20, 10, 19, 8],\n",
753 + " [5, 19, 8, 3, 17, 16, 10, 16, 20, 4, 2, 15, 9],\n",
754 + " [1, 8, 15, 8, 19, 1, 14, 15, 3, 7, 13, 20, 0, 10],\n",
755 + " [10, 4, 7, 20, 16, 12, 0],\n",
756 + " [11, 3, 5, 15, 2, 14, 8, 2],\n",
757 + " [1, 17, 6, 13, 19, 3],\n",
758 + " [20, 0, 3, 7, 7],\n",
759 + " [17, 1, 20, 7, 8, 18, 4, 10, 19, 1, 14, 6],\n",
760 + " [5, 17, 20, 10, 1, 13, 19, 2, 3, 3],\n",
761 + " [7, 8, 4, 20, 5, 13, 20, 5, 4, 19, 3, 2, 13, 19, 1],\n",
762 + " [16, 20, 16],\n",
763 + " [5, 17, 6, 2, 16, 1, 8],\n",
764 + " [8, 5, 14, 0, 18, 15, 20, 20, 3, 15],\n",
765 + " [12, 7, 2, 18, 4, 16, 20, 2, 4, 16],\n",
766 + " [4, 7, 12, 13, 13],\n",
767 + " [0, 1, 16, 7, 12, 15, 1, 12],\n",
768 + " [4, 4, 9, 12],\n",
769 + " [4, 14, 5],\n",
770 + " [3, 9, 8, 14, 14, 20, 15, 8, 8, 11, 20, 12, 20],\n",
771 + " [0, 18, 11, 17, 13, 18, 6, 18, 11, 10, 19, 2, 11, 7, 8],\n",
772 + " [4, 11, 10, 12],\n",
773 + " [3, 12, 8, 2, 6, 15],\n",
774 + " [0, 6, 9, 14],\n",
775 + " [15, 17, 16],\n",
776 + " [13, 19, 2],\n",
777 + " [0, 1, 13],\n",
778 + " [13, 18, 16, 14, 16, 2, 5, 5],\n",
779 + " [10, 1, 6, 15, 17, 19, 13, 8, 20, 1, 17, 16],\n",
780 + " [13, 10, 4],\n",
781 + " [0, 2, 4],\n",
782 + " [3, 3, 5, 9, 14, 17, 12, 11, 2, 6, 5, 1, 15, 15],\n",
783 + " [3, 4, 11, 1, 17, 16],\n",
784 + " [11, 2, 18],\n",
785 + " [3, 10, 19, 17, 12, 12, 10, 2, 9, 16, 9],\n",
786 + " [8, 11, 15, 6, 19, 11, 19],\n",
787 + " [4, 9, 7, 0, 6, 7, 12, 4, 9, 20, 12],\n",
788 + " [6, 13, 16, 6, 18, 6, 11, 15, 17],\n",
789 + " [4, 11, 16],\n",
790 + " [7, 7, 15, 2],\n",
791 + " [0, 11, 8, 5, 17, 13, 2, 9, 10, 3, 17, 17],\n",
792 + " [10, 3, 6, 11, 17, 0, 18, 20, 0, 7, 2, 7, 5],\n",
793 + " [16, 3, 1, 10, 11],\n",
794 + " [16, 15, 5, 0, 16, 1, 6, 10, 6, 1, 7, 16, 13, 0],\n",
795 + " [10, 17, 11, 18, 19, 12, 12],\n",
796 + " [2, 7, 1, 11, 8, 3, 0, 16, 14, 16, 3, 11, 17],\n",
797 + " [2, 11, 14, 16, 3, 0, 0, 17, 13, 20, 6, 12],\n",
798 + " [15, 16, 20, 16, 2, 2, 3, 7, 1, 5],\n",
799 + " [0, 15, 14, 12, 9, 16, 17, 5],\n",
800 + " [7, 0, 8],\n",
801 + " [13, 6, 18, 1, 15, 13, 4, 16, 13, 3],\n",
802 + " [0, 15, 18, 3],\n",
803 + " [6, 1, 6, 6],\n",
804 + " [9, 18, 13, 7, 13, 2, 20, 14, 6, 20, 6, 6],\n",
805 + " [13, 8, 12, 3, 6, 6, 11, 4, 9, 14, 6, 12, 1, 3, 5],\n",
806 + " [14, 3, 2, 14, 4, 10],\n",
807 + " [3, 0, 11, 12, 6, 9, 3, 13, 12, 2],\n",
808 + " [15, 14, 2, 1, 1, 9, 17, 15, 15, 4, 13, 12, 1, 9],\n",
809 + " [4, 11, 20, 0, 13, 18, 3, 0, 0, 17, 18],\n",
810 + " [14, 16, 7],\n",
811 + " [14, 8, 18, 4, 1, 0],\n",
812 + " [7, 7, 0, 1, 16, 10, 1, 19, 9, 0],\n",
813 + " [9, 14, 3, 19, 14, 10, 17, 13, 8, 19, 18, 19, 5],\n",
814 + " [18, 6, 6, 0, 8, 3, 10, 4, 14],\n",
815 + " [0, 3, 19, 10, 18],\n",
816 + " [1, 18, 11, 2, 5, 3, 11, 5, 11, 4, 4, 16, 3],\n",
817 + " [4, 2, 0, 9, 17, 3, 2, 16, 19, 3, 2, 8, 18],\n",
818 + " [19, 11, 2, 10, 9, 0],\n",
819 + " [7, 18, 3, 16, 10, 10],\n",
820 + " [2, 19, 5, 11, 20, 15],\n",
821 + " [17, 12, 0, 20, 9, 0, 15, 13, 15, 8, 11],\n",
822 + " [6, 5, 7, 16, 5, 11, 15, 16],\n",
823 + " [9, 15, 8, 16, 10, 13, 14, 2, 4, 7, 10, 3, 17],\n",
824 + " [0, 6, 15, 6, 16, 10, 8, 9, 4, 14],\n",
825 + " [12, 20, 3, 0, 17, 4, 8, 1, 8],\n",
826 + " [20, 4, 8],\n",
827 + " [17, 9, 10, 8, 8, 20, 0],\n",
828 + " [7, 2, 14, 3, 2],\n",
829 + " [9, 20, 10],\n",
830 + " [15, 7, 16, 1, 18, 16, 20, 5, 14],\n",
831 + " [12, 11, 8, 16, 1, 1, 10, 2, 20, 17],\n",
832 + " [4, 8, 10, 14, 8],\n",
833 + " [9, 13, 1, 0, 10, 0],\n",
834 + " [10, 13, 7, 19, 0],\n",
835 + " [5, 8, 5],\n",
836 + " [4, 14, 16, 20, 18, 12, 9, 10, 5, 20, 0, 3, 15, 7],\n",
837 + " [10, 6, 3, 6, 1, 19, 15, 10, 10, 13, 6, 20, 12, 5, 17],\n",
838 + " [17, 17, 10, 8, 19, 14, 14, 19, 3, 4, 10, 5, 11, 20, 20],\n",
839 + " [5, 11, 9, 14, 12, 11, 20, 13, 11, 16, 15, 0, 12, 20, 16],\n",
840 + " [11, 16, 15, 8, 7, 9, 13, 10, 4, 18, 1, 1, 9, 0],\n",
841 + " [12, 15, 18],\n",
842 + " [14, 18, 6, 6, 1],\n",
843 + " [16, 6, 12, 11],\n",
844 + " [12, 19, 17, 0, 18, 10, 11, 2, 12, 4, 5, 16],\n",
845 + " [8, 20, 15, 5, 16, 7, 20, 14, 15, 17, 1],\n",
846 + " [5, 7, 5, 13, 2, 18, 5, 2, 2, 12, 20, 14],\n",
847 + " [2, 11, 4, 9],\n",
848 + " [2, 13, 1, 5, 4],\n",
849 + " [11, 5, 5, 2, 17, 8, 5, 17, 13, 5, 9],\n",
850 + " [20, 19, 6, 3, 10, 8, 6, 0],\n",
851 + " [2, 20, 18, 6, 14, 15, 13, 12, 10, 12, 8, 20, 16, 4],\n",
852 + " [14, 0, 13, 9],\n",
853 + " [13, 20, 18, 1, 3, 5, 0, 18, 20],\n",
854 + " [7, 14, 5, 12, 12, 8, 9, 6, 20, 16],\n",
855 + " [18, 7, 12, 5, 5, 19, 19, 4, 10, 8, 11, 18, 17, 19, 6],\n",
856 + " [2, 7, 17, 16, 19, 18, 7, 9, 12, 3, 6, 7, 10],\n",
857 + " [6, 10, 11, 14, 3, 18, 10, 2, 13, 0, 20, 11, 20, 1],\n",
858 + " [8, 12, 6, 5, 4, 20, 12, 8],\n",
859 + " [7, 8, 1, 16, 10, 11, 19, 18],\n",
860 + " [16, 0, 17, 1, 3, 18],\n",
861 + " [3, 6, 17, 19, 17, 1, 13, 13, 13],\n",
862 + " [2, 20, 16, 5, 19, 16, 6, 4, 2],\n",
863 + " [17, 12, 15, 2, 11, 16, 19, 15, 3, 20],\n",
864 + " [8, 20, 20, 9, 2, 4, 14, 1, 13],\n",
865 + " [17, 0, 19, 7, 6, 10, 2, 5, 7, 17, 17, 4, 16],\n",
866 + " [18, 17, 15, 20, 15, 0, 6, 7, 20],\n",
867 + " [17, 13, 15, 15, 19, 11, 9, 10, 8],\n",
868 + " [20, 20, 13, 15, 6, 16, 11, 14, 14, 6],\n",
869 + " [2, 10, 3, 15, 3, 14, 4, 12, 19],\n",
870 + " [1, 12, 8, 16],\n",
871 + " [6, 10, 10, 9, 20, 1, 15, 3, 10, 5, 8, 0, 13, 7, 10],\n",
872 + " [11, 15, 2],\n",
873 + " [4, 4, 20, 4, 7, 7, 4, 7, 2, 9, 18, 4],\n",
874 + " [13, 7, 1, 20],\n",
875 + " [12, 14, 10, 18, 12, 13, 5, 13, 18, 16, 12, 4, 1, 16, 9],\n",
876 + " [20, 7, 15],\n",
877 + " [5, 14, 0, 7, 3, 1, 9, 15, 11, 10, 20, 2, 18, 6],\n",
878 + " [11, 19, 12, 10, 1, 5, 20, 19, 8, 10, 14, 9, 14, 16, 3],\n",
879 + " [5, 15, 18, 8, 2],\n",
880 + " [7, 17, 20, 12],\n",
881 + " [19, 14, 9, 3, 14, 4, 17, 15, 14, 12, 16],\n",
882 + " [3, 18, 6, 15, 10, 3, 15, 11, 3, 5, 14],\n",
883 + " [8, 15, 19, 16, 4],\n",
884 + " [8, 12, 18, 0, 9],\n",
885 + " [5, 4, 1, 7, 9, 5, 10, 14, 19, 7, 4, 0],\n",
886 + " [1, 15, 11, 5, 11, 14, 12, 20, 17, 4, 13, 12],\n",
887 + " [11, 9, 11, 18, 5],\n",
888 + " [9, 18, 19, 0, 4, 1, 8, 0, 4, 7, 8, 19, 3],\n",
889 + " [3, 9, 13, 4, 1, 11, 3],\n",
890 + " [3, 4, 14, 15, 9, 2, 16, 0, 17, 8, 2, 3],\n",
891 + " [11, 12, 18, 11, 11, 10, 19, 16, 10, 9],\n",
892 + " [11, 19, 9, 3, 4, 18, 8, 15, 4, 3, 15, 17, 18, 1, 13],\n",
893 + " [14, 20, 0, 1, 2, 19, 0, 4, 8, 2, 8, 11, 14]]"
894 + ]
895 + },
896 + "execution_count": 46,
897 + "metadata": {},
898 + "output_type": "execute_result"
899 + }
900 + ],
901 + "source": [
902 + "data_value #模拟展示用户搜藏图书id"
903 + ]
904 + },
905 + {
906 + "cell_type": "code",
907 + "execution_count": 16,
908 + "metadata": {
909 + "collapsed": false
910 + },
911 + "outputs": [
912 + {
913 + "name": "stdout",
914 + "output_type": "stream",
915 + "text": [
916 + "563 房地产经济专业知识与实务历年真题及名师密押试卷\n",
917 + "296 金博士一点全通\n",
918 + "1236 会计电算化应用教程\n",
919 + "Name: title, dtype: object\n"
920 + ]
921 + }
922 + ],
923 + "source": [
924 + "print books[[563,296,1236]] #验证id号和书名一一对应"
925 + ]
926 + },
927 + {
928 + "cell_type": "code",
929 + "execution_count": 53,
930 + "metadata": {
931 + "collapsed": false
932 + },
933 + "outputs": [
934 + {
935 + "data": {
936 + "text/plain": [
937 + "[[frozenset({9}),\n",
938 + " frozenset({2}),\n",
939 + " frozenset({12}),\n",
940 + " frozenset({1}),\n",
941 + " frozenset({16}),\n",
942 + " frozenset({19}),\n",
943 + " frozenset({4}),\n",
944 + " frozenset({14}),\n",
945 + " frozenset({8}),\n",
946 + " frozenset({11}),\n",
947 + " frozenset({18}),\n",
948 + " frozenset({13}),\n",
949 + " frozenset({15}),\n",
950 + " frozenset({6}),\n",
951 + " frozenset({17}),\n",
952 + " frozenset({0}),\n",
953 + " frozenset({3}),\n",
954 + " frozenset({10}),\n",
955 + " frozenset({5}),\n",
956 + " frozenset({20}),\n",
957 + " frozenset({7})],\n",
958 + " [frozenset({3, 14}),\n",
959 + " frozenset({1, 15}),\n",
960 + " frozenset({4, 5}),\n",
961 + " frozenset({9, 15}),\n",
962 + " frozenset({4, 11}),\n",
963 + " frozenset({6, 14}),\n",
964 + " frozenset({5, 8}),\n",
965 + " frozenset({11, 19}),\n",
966 + " frozenset({5, 18}),\n",
967 + " frozenset({6, 15}),\n",
968 + " frozenset({2, 4}),\n",
969 + " frozenset({5, 16}),\n",
970 + " frozenset({4, 13}),\n",
971 + " frozenset({0, 8}),\n",
972 + " frozenset({7, 19}),\n",
973 + " frozenset({1, 17}),\n",
974 + " frozenset({9, 14}),\n",
975 + " frozenset({9, 19}),\n",
976 + " frozenset({8, 14}),\n",
977 + " frozenset({7, 8}),\n",
978 + " frozenset({10, 14}),\n",
979 + " frozenset({2, 7}),\n",
980 + " frozenset({11, 20}),\n",
981 + " frozenset({2, 10}),\n",
982 + " frozenset({13, 19}),\n",
983 + " frozenset({11, 12}),\n",
984 + " frozenset({3, 9}),\n",
985 + " frozenset({17, 18}),\n",
986 + " frozenset({12, 20}),\n",
987 + " frozenset({10, 17}),\n",
988 + " frozenset({0, 6}),\n",
989 + " frozenset({7, 12}),\n",
990 + " frozenset({9, 10}),\n",
991 + " frozenset({17, 19}),\n",
992 + " frozenset({7, 14}),\n",
993 + " frozenset({12, 16}),\n",
994 + " frozenset({4, 18}),\n",
995 + " frozenset({0, 16}),\n",
996 + " frozenset({0, 9}),\n",
997 + " frozenset({2, 6}),\n",
998 + " frozenset({1, 2}),\n",
999 + " frozenset({13, 20}),\n",
1000 + " frozenset({7, 15}),\n",
1001 + " frozenset({0, 13}),\n",
1002 + " frozenset({3, 7}),\n",
1003 + " frozenset({7, 9}),\n",
1004 + " frozenset({12, 19}),\n",
1005 + " frozenset({6, 8}),\n",
1006 + " frozenset({19, 20}),\n",
1007 + " frozenset({0, 17}),\n",
1008 + " frozenset({4, 15}),\n",
1009 + " frozenset({17, 20}),\n",
1010 + " frozenset({1, 8}),\n",
1011 + " frozenset({11, 16}),\n",
1012 + " frozenset({12, 17}),\n",
1013 + " frozenset({13, 17}),\n",
1014 + " frozenset({2, 9}),\n",
1015 + " frozenset({16, 19}),\n",
1016 + " frozenset({10, 16}),\n",
1017 + " frozenset({2, 17}),\n",
1018 + " frozenset({4, 12}),\n",
1019 + " frozenset({3, 8}),\n",
1020 + " frozenset({16, 18}),\n",
1021 + " frozenset({4, 20}),\n",
1022 + " frozenset({15, 17}),\n",
1023 + " frozenset({0, 4}),\n",
1024 + " frozenset({0, 12}),\n",
1025 + " frozenset({0, 1}),\n",
1026 + " frozenset({7, 11}),\n",
1027 + " frozenset({14, 15}),\n",
1028 + " frozenset({2, 15}),\n",
1029 + " frozenset({1, 6}),\n",
1030 + " frozenset({2, 3}),\n",
1031 + " frozenset({1, 16}),\n",
1032 + " frozenset({3, 6}),\n",
1033 + " frozenset({9, 11}),\n",
1034 + " frozenset({3, 4}),\n",
1035 + " frozenset({1, 20}),\n",
1036 + " frozenset({4, 19}),\n",
1037 + " frozenset({11, 17}),\n",
1038 + " frozenset({1, 14}),\n",
1039 + " frozenset({14, 20}),\n",
1040 + " frozenset({5, 20}),\n",
1041 + " frozenset({4, 10}),\n",
1042 + " frozenset({6, 9}),\n",
1043 + " frozenset({2, 11}),\n",
1044 + " frozenset({1, 9}),\n",
1045 + " frozenset({3, 11}),\n",
1046 + " frozenset({8, 15}),\n",
1047 + " frozenset({3, 10}),\n",
1048 + " frozenset({5, 7}),\n",
1049 + " frozenset({8, 13}),\n",
1050 + " frozenset({1, 7}),\n",
1051 + " frozenset({4, 6}),\n",
1052 + " frozenset({7, 13}),\n",
1053 + " frozenset({14, 19}),\n",
1054 + " frozenset({8, 20}),\n",
1055 + " frozenset({1, 4}),\n",
1056 + " frozenset({8, 16}),\n",
1057 + " frozenset({3, 18}),\n",
1058 + " frozenset({2, 14}),\n",
1059 + " frozenset({10, 19}),\n",
1060 + " frozenset({3, 15}),\n",
1061 + " frozenset({13, 14}),\n",
1062 + " frozenset({8, 10}),\n",
1063 + " frozenset({6, 12}),\n",
1064 + " frozenset({12, 15}),\n",
1065 + " frozenset({5, 11}),\n",
1066 + " frozenset({4, 9}),\n",
1067 + " frozenset({4, 8}),\n",
1068 + " frozenset({0, 15}),\n",
1069 + " frozenset({15, 20}),\n",
1070 + " frozenset({5, 17}),\n",
1071 + " frozenset({7, 16}),\n",
1072 + " frozenset({2, 12}),\n",
1073 + " frozenset({0, 2}),\n",
1074 + " frozenset({5, 9}),\n",
1075 + " frozenset({2, 20}),\n",
1076 + " frozenset({3, 5}),\n",
1077 + " frozenset({5, 15}),\n",
1078 + " frozenset({11, 14}),\n",
1079 + " frozenset({7, 17}),\n",
1080 + " frozenset({6, 10}),\n",
1081 + " frozenset({16, 20}),\n",
1082 + " frozenset({3, 16}),\n",
1083 + " frozenset({6, 19}),\n",
1084 + " frozenset({4, 7}),\n",
1085 + " frozenset({0, 10}),\n",
1086 + " frozenset({14, 18}),\n",
1087 + " frozenset({0, 14}),\n",
1088 + " frozenset({10, 15}),\n",
1089 + " frozenset({3, 19}),\n",
1090 + " frozenset({14, 17}),\n",
1091 + " frozenset({2, 8}),\n",
1092 + " frozenset({1, 5}),\n",
1093 + " frozenset({5, 6}),\n",
1094 + " frozenset({3, 17}),\n",
1095 + " frozenset({9, 16}),\n",
1096 + " frozenset({10, 13}),\n",
1097 + " frozenset({2, 19}),\n",
1098 + " frozenset({1, 11}),\n",
1099 + " frozenset({16, 17}),\n",
1100 + " frozenset({0, 20}),\n",
1101 + " frozenset({8, 17}),\n",
1102 + " frozenset({9, 17}),\n",
1103 + " frozenset({7, 10}),\n",
1104 + " frozenset({0, 7}),\n",
1105 + " frozenset({15, 16}),\n",
1106 + " frozenset({10, 18}),\n",
1107 + " frozenset({7, 20}),\n",
1108 + " frozenset({1, 10}),\n",
1109 + " frozenset({0, 3}),\n",
1110 + " frozenset({4, 17}),\n",
1111 + " frozenset({1, 3}),\n",
1112 + " frozenset({12, 14}),\n",
1113 + " frozenset({10, 11}),\n",
1114 + " frozenset({0, 19}),\n",
1115 + " frozenset({10, 20}),\n",
1116 + " frozenset({3, 20}),\n",
1117 + " frozenset({6, 17}),\n",
1118 + " frozenset({10, 12}),\n",
1119 + " frozenset({8, 19}),\n",
1120 + " frozenset({9, 12}),\n",
1121 + " frozenset({4, 16}),\n",
1122 + " frozenset({1, 18}),\n",
1123 + " frozenset({9, 13}),\n",
1124 + " frozenset({2, 5}),\n",
1125 + " frozenset({9, 20}),\n",
1126 + " frozenset({11, 15}),\n",
1127 + " frozenset({5, 14}),\n",
1128 + " frozenset({5, 10}),\n",
1129 + " frozenset({2, 18}),\n",
1130 + " frozenset({1, 13}),\n",
1131 + " frozenset({0, 5}),\n",
1132 + " frozenset({15, 19}),\n",
1133 + " frozenset({5, 12}),\n",
1134 + " frozenset({6, 16}),\n",
1135 + " frozenset({6, 20}),\n",
1136 + " frozenset({1, 19}),\n",
1137 + " frozenset({9, 18}),\n",
1138 + " frozenset({8, 9}),\n",
1139 + " frozenset({2, 13}),\n",
1140 + " frozenset({6, 7}),\n",
1141 + " frozenset({4, 14}),\n",
1142 + " frozenset({14, 16}),\n",
1143 + " frozenset({2, 16}),\n",
1144 + " frozenset({13, 15})],\n",
1145 + " []]"
1146 + ]
1147 + },
1148 + "execution_count": 53,
1149 + "metadata": {},
1150 + "output_type": "execute_result"
1151 + }
1152 + ],
1153 + "source": [
1154 + "L,suppData=apriori(data_value,minSupport=0.1)\n",
1155 + "L\n"
1156 + ]
1157 + },
1158 + {
1159 + "cell_type": "code",
1160 + "execution_count": 60,
1161 + "metadata": {
1162 + "collapsed": false
1163 + },
1164 + "outputs": [
1165 + {
1166 + "name": "stdout",
1167 + "output_type": "stream",
1168 + "text": [
1169 + "(frozenset([14]), '-->', frozenset([3]), 'conf:', 0.4057142857142857)\n",
1170 + "(frozenset([3]), '-->', frozenset([14]), 'conf:', 0.41764705882352937)\n",
1171 + "(frozenset([4]), '-->', frozenset([2]), 'conf:', 0.41208791208791207)\n",
1172 + "(frozenset([2]), '-->', frozenset([4]), 'conf:', 0.4098360655737705)\n",
1173 + "(frozenset([5]), '-->', frozenset([16]), 'conf:', 0.4140127388535032)\n",
1174 + "(frozenset([19]), '-->', frozenset([7]), 'conf:', 0.4)\n",
1175 + "(frozenset([12]), '-->', frozenset([20]), 'conf:', 0.4267515923566879)\n",
1176 + "(frozenset([17]), '-->', frozenset([10]), 'conf:', 0.4285714285714285)\n",
1177 + "(frozenset([18]), '-->', frozenset([4]), 'conf:', 0.4)\n",
1178 + "(frozenset([15]), '-->', frozenset([7]), 'conf:', 0.4082840236686391)\n",
1179 + "(frozenset([9]), '-->', frozenset([7]), 'conf:', 0.4)\n",
1180 + "(frozenset([8]), '-->', frozenset([1]), 'conf:', 0.4276729559748428)\n",
1181 + "(frozenset([9]), '-->', frozenset([2]), 'conf:', 0.4)\n",
1182 + "(frozenset([10]), '-->', frozenset([16]), 'conf:', 0.41208791208791207)\n",
1183 + "(frozenset([16]), '-->', frozenset([10]), 'conf:', 0.41899441340782123)\n",
1184 + "(frozenset([12]), '-->', frozenset([4]), 'conf:', 0.42038216560509556)\n",
1185 + "(frozenset([18]), '-->', frozenset([16]), 'conf:', 0.4)\n",
1186 + "(frozenset([15]), '-->', frozenset([14]), 'conf:', 0.42603550295857984)\n",
1187 + "(frozenset([14]), '-->', frozenset([15]), 'conf:', 0.4114285714285714)\n",
1188 + "(frozenset([1]), '-->', frozenset([16]), 'conf:', 0.42391304347826086)\n",
1189 + "(frozenset([16]), '-->', frozenset([1]), 'conf:', 0.4357541899441341)\n",
1190 + "(frozenset([20]), '-->', frozenset([1]), 'conf:', 0.4157303370786517)\n",
1191 + "(frozenset([1]), '-->', frozenset([20]), 'conf:', 0.40217391304347827)\n",
1192 + "(frozenset([19]), '-->', frozenset([4]), 'conf:', 0.40625)\n",
1193 + "(frozenset([11]), '-->', frozenset([2]), 'conf:', 0.41935483870967744)\n",
1194 + "(frozenset([13]), '-->', frozenset([7]), 'conf:', 0.4155844155844156)\n",
1195 + "(frozenset([4]), '-->', frozenset([1]), 'conf:', 0.4065934065934066)\n",
1196 + "(frozenset([1]), '-->', frozenset([4]), 'conf:', 0.40217391304347827)\n",
1197 + "(frozenset([14]), '-->', frozenset([2]), 'conf:', 0.41714285714285715)\n",
1198 + "(frozenset([19]), '-->', frozenset([10]), 'conf:', 0.41875)\n",
1199 + "(frozenset([8]), '-->', frozenset([4]), 'conf:', 0.4088050314465409)\n",
1200 + "(frozenset([7]), '-->', frozenset([16]), 'conf:', 0.4357541899441341)\n",
1201 + "(frozenset([16]), '-->', frozenset([7]), 'conf:', 0.4357541899441341)\n",
1202 + "(frozenset([5]), '-->', frozenset([3]), 'conf:', 0.40764331210191085)\n",
1203 + "(frozenset([5]), '-->', frozenset([1]), 'conf:', 0.43312101910828027)\n",
1204 + "(frozenset([3]), '-->', frozenset([17]), 'conf:', 0.411764705882353)\n",
1205 + "(frozenset([17]), '-->', frozenset([3]), 'conf:', 0.4166666666666667)\n",
1206 + "(frozenset([17]), '-->', frozenset([16]), 'conf:', 0.4345238095238095)\n",
1207 + "(frozenset([16]), '-->', frozenset([17]), 'conf:', 0.40782122905027934)\n",
1208 + "(frozenset([8]), '-->', frozenset([17]), 'conf:', 0.4025157232704403)\n",
1209 + "(frozenset([7]), '-->', frozenset([10]), 'conf:', 0.41899441340782123)\n",
1210 + "(frozenset([10]), '-->', frozenset([7]), 'conf:', 0.41208791208791207)\n",
1211 + "(frozenset([15]), '-->', frozenset([16]), 'conf:', 0.4319526627218934)\n",
1212 + "(frozenset([16]), '-->', frozenset([15]), 'conf:', 0.40782122905027934)\n",
1213 + "(frozenset([10]), '-->', frozenset([1]), 'conf:', 0.4065934065934066)\n",
1214 + "(frozenset([1]), '-->', frozenset([10]), 'conf:', 0.40217391304347827)\n",
1215 + "(frozenset([3]), '-->', frozenset([0]), 'conf:', 0.41764705882352937)\n",
1216 + "(frozenset([0]), '-->', frozenset([3]), 'conf:', 0.4127906976744186)\n",
1217 + "(frozenset([17]), '-->', frozenset([4]), 'conf:', 0.4166666666666667)\n",
1218 + "(frozenset([3]), '-->', frozenset([1]), 'conf:', 0.4)\n",
1219 + "(frozenset([13]), '-->', frozenset([9]), 'conf:', 0.4090909090909091)\n",
1220 + "(frozenset([5]), '-->', frozenset([2]), 'conf:', 0.4394904458598726)\n",
1221 + "(frozenset([9]), '-->', frozenset([20]), 'conf:', 0.4)\n",
1222 + "(frozenset([18]), '-->', frozenset([2]), 'conf:', 0.4068965517241379)\n",
1223 + "(frozenset([6]), '-->', frozenset([20]), 'conf:', 0.42138364779874216)\n",
1224 + "(frozenset([19]), '-->', frozenset([1]), 'conf:', 0.4)\n",
1225 + "(frozenset([13]), '-->', frozenset([2]), 'conf:', 0.4025974025974026)\n",
1226 + "(frozenset([14]), '-->', frozenset([4]), 'conf:', 0.4000000000000001)\n",
1227 + "(frozenset([2]), '-->', frozenset([16]), 'conf:', 0.42622950819672134)\n",
1228 + "(frozenset([16]), '-->', frozenset([2]), 'conf:', 0.4357541899441341)\n"
1229 + ]
1230 + },
1231 + {
1232 + "data": {
1233 + "text/plain": [
1234 + "[(frozenset({14}), frozenset({3}), 0.4057142857142857),\n",
1235 + " (frozenset({3}), frozenset({14}), 0.41764705882352937),\n",
1236 + " (frozenset({4}), frozenset({2}), 0.41208791208791207),\n",
1237 + " (frozenset({2}), frozenset({4}), 0.4098360655737705),\n",
1238 + " (frozenset({5}), frozenset({16}), 0.4140127388535032),\n",
1239 + " (frozenset({19}), frozenset({7}), 0.4),\n",
1240 + " (frozenset({12}), frozenset({20}), 0.4267515923566879),\n",
1241 + " (frozenset({17}), frozenset({10}), 0.4285714285714285),\n",
1242 + " (frozenset({18}), frozenset({4}), 0.4),\n",
1243 + " (frozenset({15}), frozenset({7}), 0.4082840236686391),\n",
1244 + " (frozenset({9}), frozenset({7}), 0.4),\n",
1245 + " (frozenset({8}), frozenset({1}), 0.4276729559748428),\n",
1246 + " (frozenset({9}), frozenset({2}), 0.4),\n",
1247 + " (frozenset({10}), frozenset({16}), 0.41208791208791207),\n",
1248 + " (frozenset({16}), frozenset({10}), 0.41899441340782123),\n",
1249 + " (frozenset({12}), frozenset({4}), 0.42038216560509556),\n",
1250 + " (frozenset({18}), frozenset({16}), 0.4),\n",
1251 + " (frozenset({15}), frozenset({14}), 0.42603550295857984),\n",
1252 + " (frozenset({14}), frozenset({15}), 0.4114285714285714),\n",
1253 + " (frozenset({1}), frozenset({16}), 0.42391304347826086),\n",
1254 + " (frozenset({16}), frozenset({1}), 0.4357541899441341),\n",
1255 + " (frozenset({20}), frozenset({1}), 0.4157303370786517),\n",
1256 + " (frozenset({1}), frozenset({20}), 0.40217391304347827),\n",
1257 + " (frozenset({19}), frozenset({4}), 0.40625),\n",
1258 + " (frozenset({11}), frozenset({2}), 0.41935483870967744),\n",
1259 + " (frozenset({13}), frozenset({7}), 0.4155844155844156),\n",
1260 + " (frozenset({4}), frozenset({1}), 0.4065934065934066),\n",
1261 + " (frozenset({1}), frozenset({4}), 0.40217391304347827),\n",
1262 + " (frozenset({14}), frozenset({2}), 0.41714285714285715),\n",
1263 + " (frozenset({19}), frozenset({10}), 0.41875),\n",
1264 + " (frozenset({8}), frozenset({4}), 0.4088050314465409),\n",
1265 + " (frozenset({7}), frozenset({16}), 0.4357541899441341),\n",
1266 + " (frozenset({16}), frozenset({7}), 0.4357541899441341),\n",
1267 + " (frozenset({5}), frozenset({3}), 0.40764331210191085),\n",
1268 + " (frozenset({5}), frozenset({1}), 0.43312101910828027),\n",
1269 + " (frozenset({3}), frozenset({17}), 0.411764705882353),\n",
1270 + " (frozenset({17}), frozenset({3}), 0.4166666666666667),\n",
1271 + " (frozenset({17}), frozenset({16}), 0.4345238095238095),\n",
1272 + " (frozenset({16}), frozenset({17}), 0.40782122905027934),\n",
1273 + " (frozenset({8}), frozenset({17}), 0.4025157232704403),\n",
1274 + " (frozenset({7}), frozenset({10}), 0.41899441340782123),\n",
1275 + " (frozenset({10}), frozenset({7}), 0.41208791208791207),\n",
1276 + " (frozenset({15}), frozenset({16}), 0.4319526627218934),\n",
1277 + " (frozenset({16}), frozenset({15}), 0.40782122905027934),\n",
1278 + " (frozenset({10}), frozenset({1}), 0.4065934065934066),\n",
1279 + " (frozenset({1}), frozenset({10}), 0.40217391304347827),\n",
1280 + " (frozenset({3}), frozenset({0}), 0.41764705882352937),\n",
1281 + " (frozenset({0}), frozenset({3}), 0.4127906976744186),\n",
1282 + " (frozenset({17}), frozenset({4}), 0.4166666666666667),\n",
1283 + " (frozenset({3}), frozenset({1}), 0.4),\n",
1284 + " (frozenset({13}), frozenset({9}), 0.4090909090909091),\n",
1285 + " (frozenset({5}), frozenset({2}), 0.4394904458598726),\n",
1286 + " (frozenset({9}), frozenset({20}), 0.4),\n",
1287 + " (frozenset({18}), frozenset({2}), 0.4068965517241379),\n",
1288 + " (frozenset({6}), frozenset({20}), 0.42138364779874216),\n",
1289 + " (frozenset({19}), frozenset({1}), 0.4),\n",
1290 + " (frozenset({13}), frozenset({2}), 0.4025974025974026),\n",
1291 + " (frozenset({14}), frozenset({4}), 0.4000000000000001),\n",
1292 + " (frozenset({2}), frozenset({16}), 0.42622950819672134),\n",
1293 + " (frozenset({16}), frozenset({2}), 0.4357541899441341)]"
1294 + ]
1295 + },
1296 + "execution_count": 60,
1297 + "metadata": {},
1298 + "output_type": "execute_result"
1299 + }
1300 + ],
1301 + "source": [
1302 + "rules=generateRules(L,suppData,minConf=0.4)\n",
1303 + "rules"
1304 + ]
1305 + },
1306 + {
1307 + "cell_type": "code",
1308 + "execution_count": null,
1309 + "metadata": {
1310 + "collapsed": true
1311 + },
1312 + "outputs": [],
1313 + "source": []
1314 + },
1315 + {
1316 + "cell_type": "code",
1317 + "execution_count": null,
1318 + "metadata": {
1319 + "collapsed": true
1320 + },
1321 + "outputs": [],
1322 + "source": []
1323 + },
1324 + {
1325 + "cell_type": "code",
1326 + "execution_count": null,
1327 + "metadata": {
1328 + "collapsed": true
1329 + },
1330 + "outputs": [],
1331 + "source": []
1332 + }
1333 + ],
1334 + "metadata": {
1335 + "anaconda-cloud": {},
1336 + "kernelspec": {
1337 + "display_name": "Python [Root]",
1338 + "language": "python",
1339 + "name": "Python [Root]"
1340 + },
1341 + "language_info": {
1342 + "codemirror_mode": {
1343 + "name": "ipython",
1344 + "version": 2
1345 + },
1346 + "file_extension": ".py",
1347 + "mimetype": "text/x-python",
1348 + "name": "python",
1349 + "nbconvert_exporter": "python",
1350 + "pygments_lexer": "ipython2",
1351 + "version": "2.7.12"
1352 + }
1353 + },
1354 + "nbformat": 4,
1355 + "nbformat_minor": 0
1356 +}
1 +import math
2 +#!usr/bin/python
3 +
4 +
5 +
6 +def readFile(file_name):
7 + contents_lines=[]
8 + f = open(file_name,'r')
9 + contents_lines=f.readlines()
10 + f.close()
11 + return contents_lines
12 +
13 +def getBooksList(file_name):
14 + books_contents=readFile(file_name)
15 + books_info={}
16 + for book in books_contents:
17 + book_info=book.split("|")
18 + books_info[int(book_info[0])]=book_info[1:]
19 + return books_info
20 +
21 +
22 +
23 +def getRatingInformation(ratings):
24 + rates=[]
25 + for line in ratings:
26 + rate = line.split('\t')
27 + rates.append([int(rate[0]),int(rate[1]),int(rate[2])])
28 + return rates
29 +
30 +def createUserRankDic(rates):
31 + user_rate_dic={}
32 + item_to_user={}
33 + for i in rates:
34 + user_rank=(i[1],i[2])
35 + if i[0] in user_rate_dic:
36 + user_rate_dic[i[0]].append(user_rank)
37 + else:
38 + user_rate_dic[i[0]]=[user_rank]
39 +
40 + if i[1] in item_to_user:
41 + item_to_user[i[1]].append(i[0])
42 + else:
43 + item_to_user[i[1]]=[i[0]]
44 + return user_rate_dic,item_to_user
45 +
46 +def clacSimlaryCosDist(user1,user2):
47 + sum_x=0.0
48 + sum_y=0.0
49 + sum_xy=0.0
50 + avg_x=0.0
51 + avg_y=0.0
52 + for key in user1:
53 + avg_x+=key[1]
54 + avg_x=avg_x/len(user1)
55 +
56 + for key in user2:
57 + avg_y+=key[1]
58 + avg_y=avg_y/len(user2)
59 +
60 + for key1 in user1:
61 + for key2 in user2:
62 + if key1[0]==key2[0]:
63 + sum_xy+=(key1[1]-avg_x)*(key2[1]-avg_y)
64 + sum_x+=(key1[1]-avg_x)*(key1[1]-avg_x)
65 + for key2 in user2:
66 + sum_y+=(key2[1]-avg_y)*(key2[1]-avg_y)
67 + # print sum_x,sum_y,sum_xy
68 + if sum_xy ==0.0:
69 + return 0
70 + sx_sy=math.sqrt(sum_x*sum_y)
71 + return sum_xy/sx_sy
72 +
73 +
74 +
75 +def calcNearestNeighbor(userid,users_dic,item_dic):
76 + neighbors=[]
77 + for item in users_dic[userid]:
78 + for neighbor in item_dic[item[0]]:
79 + if neighbor != userid and neighbor not in neighbors:
80 + neighbors.append(neighbor)
81 +
82 + neighbors_dist=[]
83 + for neighbor in neighbors:
84 + dist=clacSimlaryCosDist(users_dic[userid],users_dic[neighbor])
85 + neighbors_dist.append([dist,neighbor])
86 + neighbors_dist.sort(reverse=True)
87 + return neighbors_dist
88 +
89 +
90 +def recommendByUserFC(file_name,userid,k=5):
91 + test_contents=readFile(file_name)
92 + test_rates = getRatingInformation(test_contents)
93 + test_dic,test_item_to_user=createUserRankDic(test_rates)
94 +
95 + neighbors=calcNearestNeighbor(userid,test_dic,test_item_to_user)[:k]
96 +
97 + recommend_dic={}
98 + for neighbor in neighbors:
99 + neighbor_user_id=neighbor[1]
100 + books=test_dic[neighbor_user_id]
101 + for book in books:
102 + if book[0] not in recommend_dic:
103 + recommend_dic[book[0]]=neighbor[0]
104 + else:
105 + recommend_dic[book[0]]+=neighbor[0]
106 + recommend_list=[]
107 + for key in recommend_dic:
108 + recommend_list.append([recommend_dic[key],key])
109 +
110 + recommend_list.sort(reverse=True)
111 + user_books = [i[0] for i in test_dic[userid]]
112 +
113 + return [i[1] for i in recommend_list],user_books,neighbors
114 +
115 +
116 +if __name__ == '__main__':
117 + books = readFile('u.data')
118 + rates = getRatingInformation(books)
119 + recommend_list,user_movie,neighbors=recommendByUserFC("u.data",222)
120 +
121 + print recommend_list[:5]
122 +