2014-09-19 3 views
0

У меня есть код python о пользователе сходства с Корреляцией Пирсона, и я хочу проанализировать шаг вычисления, потому что я начинаю с Python хе-хе. Когда я пытаюсь вычислить вручную и сравнить с результатом этой программы, результат всегда отличается. Мне интересно, ошибаюсь ли я, когда пытаюсь вычислить вручную. Код выглядит так:Корреляция Пирсона в Python

# A dictionary of movie critics and their ratings of a small set of movies 


critics={'User 1': {'Spiderman': 1.0, 'Batman Begins': 2.0, 'Superman': 4.0}, 
    'User 2': {'Spiderman': 2.0, 'Batman Begins': 3.0, 'Superman': 3.0} 
} 


from math import sqrt 

# Returns the Pearson correlation coefficient for p1 and p2 
def sim_pearson(prefs,p1,p2): 
    # Get the list of mutually rated items 
    si={} 
    for item in prefs[p1]: 
    if item in prefs[p2]: si[item]=1 

    # if they are no ratings in common, return 0 
    if len(si)==0: return 0 

    # Sum calculations 
    n=len(si) 

    # Sums of all the preferences 
    sum1=sum([prefs[p1][it] for it in si]) 
    sum2=sum([prefs[p2][it] for it in si]) 

    # Sums of 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 of the products 
    pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si]) 

    # Calculate r (Pearson 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 


def main(): 
    z = sim_pearson(critics, 'User 1','User 2') 
    print z 

if __name__ == "__main__": 
    main() 

Я хочу, чтобы вычислить сходство между пользователем 1 и пользователем 2. Но я запутался в этой части:

([prefs[p1][it] for it in si]) 

, что есть смысл [его] ?

Результат подобия, если я использую это программа: +0,755928946018

верно значение этого кода ([prefs[p1][it] for it in si]) множится рейтинги пользователя 1? Мне нравится 1*2*4? или он должен быть умножен на рейтинги пользователя 2? Мне нравится (1*2)+(1*3)+(4*3)?

Я смущен с [p1][it]. Надеюсь, вы можете мне помочь, спасибо за то, что вы сделали.

ответ

1

Давайте линию вы запутываемый и разбить его:

sum1=sum([prefs[p1][it] for it in si]) 

Позволяет работать с внешней стороны к внутренней стороне. Внешняя большая часть представляет собой оператор присваивания, поэтому мы вычисления некоторого значения присвоить sum1:

sum1 = ... 

Теперь давайте посмотрим, что в настоящее время назначены:

sum1 = sum(...) 

Встроенная sum функция рассчитывает передается итерируемый объект (например, список). Давайте посмотрим, что аргумент:

sum1 = sum([... for it in si]) 

Внешние квадратные скобки говорят нам, что мы получаем список. Синтаксис for it in si означает, что это понимание списка. Python запускает цикл for для создания элементов списка. Я уверен, что имя переменной it означает «item». Цикл находится над клавишами словаря si (который действительно должен был быть создан как список, так как вы никогда не заботитесь о его значениях).

Следует отметить, что вы действительно можете оставить квадратные скобки из кода здесь, и вместо того, чтобы быть понятным в списке, который производит полный список всех фронтов, это будет «ленивое» генераторное выражение, которое создает итеративный генератор, который вычисляет каждое значение один за другим, по мере их запроса.

Во всяком случае, позволяет выяснить, какие элементы списка понимания являются:

sum1 = sum([...[it] for it in si]) 

квадратные скобки в [it] индексируете синтаксис, так как они непосредственно справа от другого выражения. Вы можете индексировать списки и кортежи с целыми числами и словарями с любыми типами хешируемых объектов (например, строк). В этом случае ключом является it, который является нашей переменной цикла в понимании списка.Давайте посмотрим, что мы индексирование:

sum1 = sum([...[p1][it] for it in si]) 

[it] индексация применяется к результату предыдущей индексации, на этот раз с [p1], которая является аргументом функции. Давайте посмотрим, что эта индексация выполняется на:

sum1 = sum([prefs[p1][it] for it in si]) 

Индексация делается на prefs, которая представляет собой глобальную переменную, содержащую словарь. Ключи к этому словарю - это рецензенты (это то, что должно быть p1), а значения - это дополнительные вложенные словари, сопоставляемые от имен фильмов до рейтингов.

Итак, инструкция добавляет оценки одного рецензента для определенного набора фильмов и назначает их sum1. С вашими данными примера это будет 1.0 + 2.0 + 4.0, поэтому sum1 будет назначен 7.0.

+0

Хороший ответ! Очень подробно – Llopis

+0

и 'n' относится к числу пользователей или количеству фильмов, рейтинг которых по пользователю? – user3528526

+0

Я получил 'sum1 = 7'' sum2 = 8'' sum1sq = 21' 'sum2sq = 22'' psum = 56', это правда? потому что результат всегда различен каждый раз, когда я вычисляю вручную хмм – user3528526

 Смежные вопросы

  • Нет связанных вопросов^_^