Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AttributeError: 'dict' object has no attribute 'predictors'

Tags:

python

I am new to python and couldn't find the answer to this. Referring to the code at the end of the message, can I know what does the part "for item, total in totals.items()" in the line below mean?

rankings = [(total/simSums[item], item) for item, total in totals.items()] 

Also, the code failed and said

AttributeError: 'dict' object has no attribute 'predictors'

when I changed all instances of "item(s)" in the code to "predictor(s)". Why is that so?

# Return the Pearson correlation coefficient for p1 and p2 def sim_person(prefs, p1, p2):     # Get the list of shared_items     si={}     for item in prefs[p1]:         if item in prefs[p2]:si[item]=1      # Find the number of elements      n=len(si)      # if they have no ratings in common, return 0     if n==0: return 0      # Add up all the preferences     sum1 = sum([prefs[p1][it] for it in si])     sum2 = sum([prefs[p2][it] for it in si])      # Sum up the squares     sum1Sq = sum([pow(prefs[p1][it],2) for it in si])     sum2Sq = sum([pow(prefs[p2][it],2) for it in si])      # Sum up the products     pSum = sum([prefs[p1][it]*prefs[p2][it] for it in si])      # Calculate Person score     num = pSum - (sum1*sum2/n)     den = sqrt((sum1Sq - pow(sum1,2)/n)*(sum2Sq - pow(sum2,2)/n))     if den == 0: return 0      r = num/den     return r  # Returns the best matches for person from the prefs dictionary. # Number of results and similarity function are optional params. def topMatch(prefs, person, n=5, similarity=sim_person):     scores = [(similarity(prefs, person, other), other)                for other in prefs if other!=person]      # Sort the list so the highest scores appear at the top     scores.sort()     scores.reverse()     return scores[0:n]  # Gets recommendations for a person by using a weighted average # of every other user's rankings  def getRecommendations(prefs, person, similarity=sim_person):     totals = {}     simSums = {}     for other in prefs:         # don't compare me to myself         if other == person: continue         sim = similarity(prefs, person, other)          # ignore scores of zero of lower         if sim<=0: continue         for item in prefs[other]:              # only score movies I haven't seen yet             if item not in prefs[person] or prefs[person][item]==0:                 # Similarity * Score                 totals.setdefault(item, 0)                 totals[item]+=prefs[other][item]*sim                 # Sum of similarities                 simSums.setdefault(item, 0)                 simSums[item]+=sim      # Create the normalized list      rankings = [(total/simSums[item], item) for item, total in totals.items()]      # Return the sorted list      rankings.sort()     rankings.reverse()     return rankings 
like image 592
Mike Avatar asked Feb 15 '16 10:02

Mike


2 Answers

The dict.items iterates over the key-value pairs of a dictionary. Therefore for key, value in dictionary.items() will loop over each pair. This is documented information and you can check it out in the official web page, or even easier, open a python console and type help(dict.items). And now, just as an example:

>>> d = {'hello': 34, 'world': 2999} >>> for key, value in d.items(): ...   print key, value ... world 2999 hello 34 

The AttributeError is an exception thrown when an object does not have the attribute you tried to access. The class dict does not have any predictors attribute (now you know where to check it :) ), and therefore it complains when you try to access it. As easy as that.

like image 87
bgusach Avatar answered Oct 07 '22 18:10

bgusach


#Try without dot notation sample_dict = {'name': 'John', 'age': 29} print(sample_dict['name']) # John print(sample_dict['age']) # 29 
like image 28
Shirantha Madusanka Avatar answered Oct 07 '22 16:10

Shirantha Madusanka