2016-03-23 17 views
1

Karşılaştırılan bir aralık için maksimum ve minimum sayıları nasıl tanımlarım? Örneğin, Shane tarafından aşağıdaki film derecelendirmelerine sahibim; [5, 5, 5, 5, 5, 5] ve Jaycee'nin derecelendirme listesi; [1, 1, 1, 1, 1, 1, 1], 5 yıldız dışındalar. Bunların bir sözlükten .values ​​() olduğunu ve filmlerin her bir liste için sıraya dizildiğini varsayalım. o 5 ila 1. Bu yapılırdı nasıl gibi, muhtemelen, oran düşük sonuna yakın çevresinde 0,5 olması gerekirkenAralıktaki sayı listesi arasındaki benzerlik?

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]) 

çıkışı 1.0:

aşağıdaki işlevleri kullanarak

?

cevap

1
sizin örnekten

: Eğer 1.0 var neden

numerator = 5*1*7 = 35 

Ve

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

ve kosinüs benzerliği formülü olarak eğer bu mantıklı:

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

Not o iki vektör noktanız [5, 5, ..., 5] ve [1, 1, ..., 1] olduğundan 7 boyutlu koordinatlarda tam olarak aynı yönde. Böylece, 1.0 olan kosinüs benzerliğine sahiptir. cos(theta), 1.0'tır.

+0

Bundan sonra, sayıların benzerliğine göre doğru bir şekilde 0,0 ile 1,0 arasında bir çıktı verecek başka bir yöntem var mı? –

+0

Hmm, bu "benzerlik" ile ne demek istediğine bağlı olacaktı ... ama bana göre istediğin, yönünden bağımsız bir benzerlik - sadece değere dayalı. Değer benzerliğinizin gerçekte nasıl davranmasını istersiniz? – Ian

+0

Sayıların farkına dayanan benzerlik derecelendirmesi düşünüyordum, oran o kadar yüksek, –