ZeroDivisionError:电影分级数据中的零除以浮点数(电影推荐系统)(knn)

时间:2020-06-13 15:23:01

标签: python jupyter-notebook knn recommender-systems

这是数据样本

{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

0 个答案:

没有答案