2016-03-23 3 views
1

Как определить максимальное и минимальное число для сравниваемого диапазона? Например, у меня есть следующие рейтинги фильмов Shane; [5, 5, 5, 5, 5, 5, 5] и список рейтингов Jaycee; [1, 1, 1, 1, 1, 1, 1], они не имеют 5 звезд. Притворите, что это слова .values ​​() из словаря, и фильмы для каждого списка.Сходство между списком номеров в диапазоне?

При использовании следующих функций:

from math import * 

def square_rooted(x): 

    return round(sqrt(sum([a*a for a in x])),3) 

def cosine_similarity(x,y): 

    numerator = sum(a*b for a,b in zip(x,y)) 
    denominator = square_rooted(x)*square_rooted(y) 
    return round(numerator/float(denominator),3) 

print cosine_similarity([5, 5, 5, 5, 5, 5, 5], [1, 1, 1, 1, 1, 1, 1]) 

Выход равен 1.0, когда он должен быть рядом с нижним концом отношения, вероятно, около 0,5, так как это между 5 и 1. Как бы это было сделано ?

ответ

1

Из вашего примера:

numerator = 5*1*7 = 35 

И

denominator = sqrt(5*5*7) * sqrt(1*1*7) = 5 * sqrt(7) * sqrt(7) = 35 

Вот почему вы получили 1.0 и это имеет смысл, если учесть формулу косинуса подобия:

a.b = ||a|| ||b|| cos (theta) 

Обратите внимание, что так как у вас есть [5, 5, ..., 5] и [1, 1, ..., 1] ваши два вектора точки до в том же направлении в 7-мерных координатах. Таким образом, он имеет совпадающее подобие косинусов, которое равно 1.0. cos(theta) - 1.0.

+0

Затем есть другой метод, который бы точно дал результат от 0.0 до 1.0 на основе сходства чисел? –

+0

Хм, это будет зависеть от того, что вы подразумеваете под «подобием» ... но мне кажется, что то, что вы хотите, является подобием, независимым от направления - только на основе ценности. Как бы вы хотели, чтобы ваше значение сходства велось на самом деле? – Ian

+0

Я думал о рейтинге подобия, основанном на разнице чисел, чем выше отношение, тем выше сходство –

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