5

Belirli bir sütun vektörüne en yakın sütun vektörlerini rastgele değerler matrisinden bulmak için scikit'in En Yakın Komşu Uygulamasını kullanmaya çalışıyorum.scikit-learn'in En Yakın Komşusu niçin uygun kosinüs benzerlik mesafeleri döndürüyor gibi görünmüyor?

Bu kod sonra sütuna karşı olanlar komşularının gerçek kosinüs benzerliği kontrol sütununun 21 yakın komşuları bulmak gerekiyordu 21.

from sklearn.neighbors import NearestNeighbors 
import sklearn.metrics.pairwise as smp 
import numpy as np 

test=np.random.randint(0,5,(50,50)) 
nbrs = NearestNeighbors(n_neighbors=5, algorithm='auto', metric=smp.cosine_similarity).fit(test) 
distances, indices = nbrs.kneighbors(test) 

x=21 

for idx,d in enumerate(indices[x]): 

    sim2 = smp.cosine_similarity(test[:,x],test[:,d]) 


    print "sklearns cosine similarity would be ", sim2 
    print 'sklearns reported distance is', distances[x][idx] 
    print 'sklearns if that distance was cosine, the similarity would be: ' ,1- distances[x][idx] 

Çıktı benziyor

sklearns cosine similarity would be [[ 0.66190748]] 
sklearns reported distance is 0.616586738214 
sklearns if that distance was cosine, the similarity would be: 0.383413261786 

Yani çıkış arasında Kneighbors ne kosinüs mesafesi ne de kosinüs benzerliğidir. Ne verir?

Ayrıca, bir yandan, sklearn'in En Yakın Komşular uygulamasının bir Yaklaşan En Yakın Komşular yaklaşımı olmadığını düşünmüştüm, ancak veri kümemdeki gerçek en iyi komşuları algılamıyor gibi görünüyor. Matrisi ve sütun 211'in benzerlerini diğerlerine göre kontrol edin. Burada temel bir şeyi yanlış anladım mı?

cevap

7

Sorun şu ki En Yakın Enerjiler'in .fit() yönteminin varsayılan olarak satırların örnek olduğunu ve sütunların özellikleri olduğunu varsayar. Matrisi uygun hale getirmeden önce onu yerleştirmek zorunda kaldım.

DÜZENLEME: Ayrıca, başka bir sorun, metrik olarak geçirilebilen geçişin kalınabilir bir benzerlik değil, geçici olarak geçebilmesidir. Aksi takdirde K Farthest Komşular elde edersiniz:/

+0

'2 - 2 * kosinüs benzerliği normal normalleştirilmiş vektörlerin L2 mesafesidir – eickenberg

+0

Örneğinizi daha küçük yapmak için, örn. (20, 40) yerine (500, 500)? Bilgisayarımda çalışmak biraz zaman aldı ve bu noktayı kanıtlamak için o kadar büyük olma ihtiyacı duymuyor. Kare olmayan şekli yapmak, örnekler ve özellikler eksenleri arasında ayrım yapmaya yardımcı olabilir. Diğer tüm şeyler eşitse, özniteliğinizde sim2 = smp.cosine_similarity (test [x,:], test [d,:]) 'yazın, sonra tüm değerler çakışmaya başlar. – eickenberg

+0

Satır/sütun miktarlarını değiştirdim, şimdi daha hızlı çalışmalıyım – pplat