这是数据样本
{1: {1: 5,
2: 3,
3: 4,
4: 3,
5: 3,
6: 5,
7: 4,
8: 1,
9: 5,
10: 3,
11: 2,
12: 5,
13: 5,
14: 5,
15: 5,
16: 5,
17: 3,
18: 4,
19: 5,
20: 4,
21: 1,
22: 4,
23: 4,
24: 3,
25: 4,
26: 3,
27: 2,
28: 4,
29: 1,
30: 3,
31: 3,
32: 5,
33: 4,
34: 2,
35: 1,
36: 2,
37: 2,
38: 3,
39: 4,
40: 3,
41: 2,
42: 5,
43: 4,
44: 5,
45: 5,
46: 4,
47: 4,
48: 5,
49: 3,
50: 5,
51: 4,
52: 4,
53: 3,
54: 3,
55: 5,
56: 4,
57: 5,
58: 4,
59: 5,
60: 5,
61: 4,
62: 3,
63: 2,
64: 5,
65: 4,
66: 4,
67: 3,
68: 4,
69: 3,
70: 3,
71: 3,
72: 4,
73: 3,
74: 1,
75: 4,
76: 4,
77: 4,
78: 1,
79: 4,
80: 4,
81: 5,
82: 5,
83: 3,
84: 4,
85: 3,
86: 5,
87: 5,
88: 4,
89: 5,
90: 4,
91: 5,
92: 3,
93: 5,
94: 2,
95: 4,
96: 5,
97: 3,
98: 4,
99: 3,
100: 5,
101: 2,
102: 2,
103: 1,
104: 1,
105: 2,
106: 4,
107: 4,
108: 5,
109: 5,
110: 1,
111: 5,
112: 1,
113: 5,
114: 5,
115: 5,
116: 3,
117: 3,
118: 3,
119: 5,
120: 1,
121: 4,
122: 3,
123: 4,
124: 5,
125: 3,
126: 2,
127: 5,
128: 4,
129: 5,
130: 3,
131: 1,
132: 4,
133: 4,
134: 4,
135: 4,
136: 3,
137: 5,
138: 1,
139: 3,
140: 1,
141: 3,
142: 2,
143: 1,
144: 4,
145: 2,
146: 4,
147: 3,
148: 2,
149: 2,
150: 5,
151: 4,
152: 5,
153: 3,
154: 5,
155: 2,
156: 4,
157: 4,
158: 3,
159: 3,
160: 4,
161: 4,
162: 4,
163: 4,
164: 3,
165: 5,
166: 5,
167: 2,
168: 5,
169: 5,
170: 5,
171: 5,
172: 5,
173: 5,
174: 5,
175: 5,
176: 5,
177: 5,
178: 5,
179: 3,
180: 3,
181: 5,
182: 4,
183: 5,
184: 4,
185: 4,
186: 4,
187: 4,
188: 3,
189: 3,
190: 5,
191: 5,
192: 4,
193: 4,
194: 4,
195: 5,
196: 5,
197: 5,
198: 5,
199: 4,
200: 3,
201: 3,
202: 5,
203: 4,
204: 5,
205: 3,
206: 4,
207: 5,
208: 5,
209: 4,
210: 4,
211: 3,
212: 4,
213: 2,
214: 4,
215: 3,
216: 5,
217: 3,
218: 3,
219: 1,
220: 3,
221: 5,
222: 4,
223: 5,
224: 5,
225: 2,
226: 3,
227: 4,
228: 5,
229: 4,
230: 4,
231: 1,
232: 3,
233: 2,
234: 4,
235: 5,
236: 4,
237: 2,
238: 4,
239: 4,
240: 3,
241: 4,
242: 5,
243: 1,
244: 2,
245: 2,
246: 5,
247: 1,
248: 4,
249: 4,
250: 4,
251: 4,
252: 2,
253: 5,
254: 1,
255: 2,
256: 4,
257: 4,
258: 5,
259: 1,
260: 1,
261: 1,
262: 3,
263: 1,
264: 2,
265: 4,
266: 1,
267: 4,
268: 5,
269: 5,
270: 5,
271: 2,
272: 3},
2: {1: 4,
10: 2,
13: 4,
14: 4,
19: 3,
25: 4,
50: 5,
100: 5,
111: 4,
127: 5,
237: 4,
242: 5,
251: 5,
255: 4,
257: 4,
258: 3,
269: 4,
272: 5,
273: 4,
274: 3,
275: 5,
276: 4,
277: 4,
278: 3,
279: 4,
280: 3,
281: 3,
282: 4,
283: 5,
284: 4,
285: 5,
286: 4,
287: 3,
288: 3,
289: 3,
290: 3,
291: 3,
292: 4,
293: 4,
294: 1,
295: 4,
296: 3,
297: 4,
298: 3,
299: 4,
300: 4,
301: 4,
302: 5,
303: 4,
304: 4,
305: 3,
306: 4,
307: 3,
308: 3,
309: 1,
310: 4,
311: 5,
312: 3,
313: 5,
314: 1,
315: 1,
316: 5},
3: {181: 4,
245: 1,
258: 2,
260: 4,
264: 2,
268: 3,
271: 3,
272: 2,
288: 2,
294: 2,
299: 3,
300: 2,
302: 2,
303: 3,
307: 3,
317: 2,
318: 4,
319: 2,
320: 5,
321: 5,
322: 3,
323: 2,
324: 2,
325: 1,
326: 2,
327: 4,
328: 5,
329: 4,
330: 2,
331: 4,
332: 1,
333: 2,
334: 3,
335: 1,
336: 1,
337: 1,
338: 2,
339: 3,
340: 5,
341: 1,
342: 4,
343: 3,
344: 4,
345: 3,
346: 5,
347: 5,
348: 4,
349: 3,
350: 3,
351: 3,
352: 2,
353: 1,
354: 3,
355: 3}
4: {11: 4,
50: 5,
210: 3,
258: 5,
260: 4,
264: 3,
271: 4,
288: 4,
294: 5,
300: 5,
301: 5,
303: 5,
324: 5,
327: 5,
328: 3,
329: 5,
354: 5,
356: 3,
357: 4,
358: 2,
359: 5,
360: 5,
361: 5,
362: 5},
5: {1: 4,
2: 3,
17: 4,
21: 3,
24: 4,
25: 3,
29: 4,
40: 4,
42: 5,
50: 4,
62: 4,
63: 1,
66: 1,
69: 1,
70: 4,
79: 3,
80: 2,
89: 5,
90: 3,
94: 3,
95: 4,
98: 3,
99: 3,
100: 5,
101: 5,
102: 3,
105: 3,
109: 5,
110: 1,
121: 4,
135: 4,
139: 3,
143: 3,
144: 3,
145: 1,
151: 3,
153: 5,
154: 3,
162: 1,
163: 5,
167: 2,
168: 3,
169: 5,
172: 5,
173: 4,
174: 5,
176: 3,
181: 5,
183: 4,
185: 3,
186: 5,
189: 5,
194: 4,
200: 2,
204: 4,
208: 4,
209: 5,
210: 3,
211: 4,
214: 3,
216: 1,
219: 3,
222: 4,
225: 2,
226: 3,
227: 4,
228: 5,
229: 2,
230: 3,
231: 2,
233: 4,
234: 2,
235: 4,
239: 4,
241: 1,
243: 1,
250: 3,
257: 5,
259: 1,
267: 4,
363: 3,
364: 1,
365: 1,
366: 3,
367: 3,
368: 1,
369: 1,
370: 1,
371: 1,
372: 3,
373: 3,
374: 3,
375: 3,
376: 2,
377: 1,
378: 1,
379: 3,
380: 3,
381: 1,
382: 5,
383: 3,
384: 3,
385: 4,
386: 2,
387: 3,
388: 2,
389: 1,
390: 5,
391: 4,
392: 2,
393: 2,
394: 2,
395: 2,
396: 5,
397: 2,
398: 2,
399: 3,
400: 1,
401: 5,
402: 1,
403: 3,
404: 2,
405: 3,
406: 1,
407: 3,
408: 5,
409: 2,
410: 1,
411: 1,
412: 3,
413: 3,
414: 3,
415: 1,
416: 1,
417: 3,
418: 3,
419: 3,
420: 3,
421: 1,
422: 4,
423: 4,
424: 1,
425: 2,
426: 3,
427: 3,
428: 5,
429: 3,
430: 5,
431: 3,
432: 4,
433: 5,
434: 5,
435: 4,
436: 5,
437: 1,
438: 1,
439: 1,
440: 1,
441: 1,
442: 1,
443: 4,
444: 2,
445: 3,
446: 4,
447: 3,
448: 2,
449: 2,
450: 1,
451: 1,
452: 1,
453: 1,
454: 1,
455: 4,
456: 1,
457: 1},
6: {1: 4,
7: 2,
8: 4,
9: 4,
12: 4,
13: 2,
14: 5,
15: 3,
19: 4,
21: 3,
22: 3,
23: 4,
28: 2,
32: 4,
47: 3,
50: 4,
56: 4,
59: 5,
64: 4,
69: 3,
70: 3,
71: 4,
79: 3,
81: 4,
86: 3,
87: 4,
89: 4,
95: 2,
98: 5,
100: 5,
111: 2,
117: 2,
124: 5,
125: 3,
127: 5,
131: 5,
132: 5,
133: 4,
134: 5,
135: 5,
136: 5,
137: 5,
143: 2,
151: 3,
153: 4,
154: 3,
156: 3,
165: 5,
166: 4,
168: 4,
169: 4,
170: 4,
173: 5,
174: 4,
175: 4,
177: 4,
178: 4,
180: 4,
182: 4,
183: 4,
185: 5,
186: 4,
187: 4,
188: 3,
189: 3,
191: 4,
192: 4,
193: 3,
194: 4,
195: 4,
197: 5,
199: 4,
200: 3,
202: 3,
203: 3,
204: 3,
205: 3,
208: 4,
209: 4,
211: 5,
213: 4,
216: 5,
221: 4,
223: 4,
237: 2,
238: 5,
242: 4,
246: 3,
248: 3,
257: 2,
258: 2,
259: 1,
261: 3,
268: 3,
269: 4,
272: 4,
274: 4,
275: 4,
276: 2,
284: 2,
285: 3,
286: 2,
293: 3,
294: 2,
297: 3,
298: 3,
301: 2,
302: 4,
303: 3,
304: 4,
306: 4,
308: 3,
309: 2,
310: 2,
317: 3,
318: 4,
321: 3,
340: 2,
357: 4,
367: 2,
405: 1,
408: 4,
410: 4,
419: 4,
423: 3,
425: 3,
427: 4,
432: 4,
435: 4,
458: 1,
459: 2,
460: 2,
461: 4,
462: 5,
463: 4,
464: 2,
465: 1,
466: 4,
467: 4,
468: 3,
469: 5,
470: 3,
471: 2,
472: 1,
473: 2,
474: 5,
475: 5,
476: 1,
477: 1,
478: 4,
479: 5,
480: 4,
481: 5,
482: 4,
483: 5,
484: 5,
485: 5,
486: 4,
487: 5,
488: 5,
489: 5,
490: 5,
491: 4,
492: 5,
493: 5,
494: 4,
495: 4,
496: 4,
497: 4,
498: 4,
499: 4,
500: 4,
501: 5,
502: 4,
503: 3,
504: 3,
505: 4,
506: 4,
507: 4,
508: 3,
509: 4,
510: 4,
511: 5,
512: 4,
513: 4,
514: 5,
515: 4,
516: 4,
517: 4,
518: 3,
519: 5,
520: 4,
521: 4,
522: 5,
523: 5,
524: 3,
525: 5,
526: 3,
527: 4,
528: 4,
529: 4,
530: 4,
531: 4,
532: 3,
533: 4,
534: 4,
535: 2,
536: 4,
537: 4,
538: 2,
539: 2}
我想使用此代码,但是会发生ZeroDivisionError
该代码应更改什么?
import math
def sim_pearson(data, name1, name2):
avg_name1 = 0
avg_name2 = 0
count = 0
for movies in data[name1]:
if movies in data[name2]:
avg_name1 = data[name1][movies]
avg_name2 = data[name2][movies]
count += 1
avg_name1 = avg_name1 / count
avg_name2 = avg_name2 / count
sum_name1 = 0
sum_name2 = 0
sum_name1_name2 = 0
count = 0
for movies in data[name1]:
if movies in data[name2]:
sum_name1 += pow(data[name1][movies] - avg_name1, 2)
sum_name2 += pow(data[name2][movies] - avg_name2, 2)
sum_name1_name2 += (data[name1][movies] - avg_name1) * (data[name2][movies] - avg_name2)
return sum_name1_name2 / (math.sqrt(sum_name1)*math.sqrt(sum_name2))
def sim_cosine(data, name1, name2):
sum_name1 = 0
sum_name2 = 0
sum_name1_name2 = 0
count = 0
for movies in data[name1]:
if movies in data[name2]:
sum_name1 += pow(data[name1][movies], 2)
sum_name2 += pow(data[name2][movies], 2)
sum_name1_name2 += data[name1][movies]*data[name2][movies]
return sum_name1_name2 / (math.sqrt(sum_name1)*math.sqrt(sum_name2))
def top_match(data, name, index=3, sim_function=sim_pearson):
li=[]
for i in data:
if name!=i:
li.append((sim_function(data,name,i),i))
li.sort()
li.reverse()
return li[:index]
def getRecommendation (data, person, k=3, sim_function=sim_pearson):
result = top_match(data, person, k)
score = 0
li = list()
score_dic = dict()
sim_dic = dict()
for sim, name in result:
print(sim, name)
if sim < 0 : continue
for movie in data[name]:
if movie not in data[person]:
score += sim * data[name][movie]
score_dic.setdefault(movie, 0)
score_dic[movie] += score
sim_dic.setdefault(movie, 0)
sim_dic[movie] += sim
score = 0
for key in score_dic:
score_dic[key] = score_dic[key] / sim_dic[key]
li.append((score_dic[key],key))
li.sort()
li.reverse()
return li
getRecommendation(data, 1)
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-58-473c289caaae> in <module>
----> 1 getRecommendation(data, 1)
<ipython-input-57-89dbc3ddee30> in getRecommendation(data, person, k, sim_function)
1 def getRecommendation (data, person, k=3, sim_function=sim_pearson):
2
----> 3 result = top_match(data, person, k)
4
5 score = 0
<ipython-input-56-98f9728bae63> in top_match(data, name, index, sim_function)
3 for i in data:
4 if name!=i:
----> 5 li.append((sim_function(data,name,i),i))
6 li.sort()
7 li.reverse()
<ipython-input-55-00d38e6b4118> in sim_pearson(data, name1, name2)
25 sum_name1_name2 += (data[name1][movies] - avg_name1) * (data[name2][movies] - avg_name2)
26
---> 27 return sum_name1_name2 / (math.sqrt(sum_name1)*math.sqrt(sum_name2))
ZeroDivisionError: float division by zero