2016-03-09 11 views
0

Я пытаюсь создать программу, в которой я могу ввести имя пользователя, и он будет использовать расстояние для человека, чтобы найти ближайшего человека.Неподдерживаемый тип операнда

Я продолжаю сталкиваться с этими ошибками, точнее, с ошибкой операнда. Как я могу это исправить?

Traceback ниже:

Traceback (most recent call last):  
    line 60, in <module> pprint(nearest_neighbor("Ricky", users))  
    line 52, in nearest_neighbor (pearson(ratings[username], ratings[other_user]),  
    line 22, in pearson square_sum1 = sum(pow(ratingsUser1.values(),2))  
TypeError: unsupported operand type(s) for ** or pow(): 'dict_values' and 'int' 

И вот мой код:

users = {"Ricky": {"Bob Seger": 4.75, "CCR": 4.5, "Beatles": 5, "The Who": 4.25, "Taylor Swift": 4}, 
    "Meg": {"Bob Seger": 4, "CCR": 3, "Beatles": 5, "The Who": 2, "Taylor Swift": 1}, 
    "Jake": {"Bob Seger": 4, "CCR": 3, "Beatles": 5, "The Who": 3, "Taylor Swift": 3} 
    } 

def pearson(ratingsUser1, ratingsUser2): 


# Summation over all attributes for both objects 
sum_ratingsUser1 = sum(ratingsUser1.values()) 
sum_ratingsUser2 = sum(ratingsUser2.values()) 

# Sum the squares 
square_sum1 = sum(pow(ratingsUser1.values(),2)) 
square_sum2 = sum(pow(ratingsUser2.values(),2)) 

# Add up the products 
product = sum([ratingsUser1.values*ratingsUser2.values]) 

#Calculate Pearson Correlation score 
numerator = product - (sum_ratingsUser1*sum_ratingsUser2/len(ratingsUser1)) 
denominator = ((square_sum1 - pow(sum_ratingsUser1,2)/len(ratingsUser1)) * (square_sum2 - 
    pow(sum_ratingsUser2,2)/len(ratingsUser1))) ** 0.5 

# Can"t have division by 0 
if denominator == 0: 
    return 0 

result = numerator/denominator 
return result 
# Compute the Summation 

# Compute the numerator 

# Compute the denominator 


def nearest_neighbor(username, ratings): 
distances = [] 

for other_user in ratings: 
    if other_user != username: 
     distances.append(
      (pearson(ratings[username], ratings[other_user]), other_user) 
     ) 
distances.sort() 

return distances 

from pprint import pprint 

pprint(nearest_neighbor("Ricky", users)) 
+0

Во-первых, вы должны отступы ваш код правильно. Во-вторых, хотите ли вы поднять все значения до мощности, а затем получить сумму результатов или суммировать все значения, а затем поднять результат до мощности? 'pow (sum (some_dictionary.values ​​()), 2)' # works 'sum (pow (some_dictionary.values ​​()), 2)' # не работает. Требуется итерация, для цикла, функции lamba, map и т. Д. Для применения операции к каждому элементу в 'dict_values'. Вы не можете использовать 'pow()' для нескольких элементов, подобных этому. – jDo

ответ

0

Здесь вы идете:

Ваш код был несколько вопросов ...

  1. В строке, где вы пишете square_sum1 = sum(pow(ratingsUser1.values(),2)) вы пытаетесь взять сумму значений словаря, в этом случае лучше пропустить их через цикл.

  2. После попытки запустить после исправления этой ошибки я нашел другую. В строке, где вы пишете product = sum([ratingsUser1.values*ratingsUser2.values]), вы снова пытаетесь взять сумму значений словаря, умноженную вместе, и даже если вы МОЖЕТЕ сделать это, вы пропустили () в конце values.


from pprint import pprint 

users = {"Ricky": {"Bob Seger": 4.75, "CCR": 4.5, "Beatles": 5, "The Who": 4.25, "Taylor Swift": 4}, 
    "Meg": {"Bob Seger": 4, "CCR": 3, "Beatles": 5, "The Who": 2, "Taylor Swift": 1}, 
    "Jake": {"Bob Seger": 4, "CCR": 3, "Beatles": 5, "The Who": 3, "Taylor Swift": 3} 
    } 

def pearson(ratingsUser1, ratingsUser2): 



    # Summation over all attributes for both objects 
    sum_ratingsUser1 = sum(ratingsUser1.values()) 
    sum_ratingsUser2 = sum(ratingsUser2.values()) 

    # Sum the squares 
    square_sum1 = 0 
    square_sum2 = 0 
    for value in ratingsUser1.values(): 
     square_sum1 += pow(value, 2) 
    for value in ratingsUser2.values(): 
     square_sum2 += pow(value, 2) 


    # Add up the products 
    product = sum_ratingsUser1 * sum_ratingsUser2 

    #Calculate Pearson Correlation score 
    numerator = product - (sum_ratingsUser1*sum_ratingsUser2/len(ratingsUser1)) 
    denominator = ((square_sum1 - pow(sum_ratingsUser1,2)/len(ratingsUser1)) * (square_sum2 - 
     pow(sum_ratingsUser2,2)/len(ratingsUser1))) ** 0.5 

    # Can"t have division by 0 
    if denominator == 0: 
     return 0 

    result = numerator/denominator 
    return result 
# Compute the Summation 

# Compute the numerator 

# Compute the denominator 


def nearest_neighbor(username, ratings): 
    distances = [] 

    for other_user in ratings: 
     if other_user != username: 
      distances.append(
       (pearson(ratings[username], ratings[other_user]), other_user) 
      ) 
    distances.sort() 

    return distances 



pprint(nearest_neighbor("Ricky", users)) 


Удачного программирования!
сигнала

0

Вы не можете использовать pow с Dict/список

from pprint import pprint 

users = {"Ricky": {"Bob Seger": 4.75, "CCR": 4.5, "Beatles": 5, "The Who": 4.25, "Taylor Swift": 4}, 
    "Meg": {"Bob Seger": 4, "CCR": 3, "Beatles": 5, "The Who": 2, "Taylor Swift": 1}, 
    "Jake": {"Bob Seger": 4, "CCR": 3, "Beatles": 5, "The Who": 3, "Taylor Swift": 3} 
    } 


def pearson(ratingsUser1, ratingsUser2): 
    # Summation over all attributes for both objects 
    sum_ratingsUser1 = sum(ratingsUser1.values()) 
    sum_ratingsUser2 = sum(ratingsUser2.values()) 
    # Sum the squares 
    square_sum1 = sum(base ** 2 for base in ratingsUser1.values()) 
    square_sum2 = sum(base ** 2 for base in ratingsUser2.values()) 
    # Add up the products 
    product = sum_ratingsUser1 * sum_ratingsUser2 


    try: 
     # Can"t have division by 0 
     #Calculate Pearson Correlation score 
     numerator = product - (sum_ratingsUser1*sum_ratingsUser2/len(ratingsUser1)) 
     denominator = (
          (square_sum1 - pow(sum_ratingsUser1, 2)/len(ratingsUser1)) * 
          (square_sum2 - pow(sum_ratingsUser2, 2)/len(ratingsUser1))) ** 0.5 

     return numerator/denominator 
    except ZeroDivisionError: 
     return 0 

# Compute the Summation 
# Compute the numerator 
# Compute the denominator 

def nearest_neighbor(username, ratings):  
    distances = [(pearson(ratings[username], ratings[other_user]), other_user) for other_user in ratings if other_user != username and username in ratings ] 
    distances.sort() 
    return distances 




pprint(nearest_neighbor("Ricky", users)) 
Смежные вопросы