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ı?
'2 - 2 * kosinüs benzerliği normal normalleştirilmiş vektörlerin L2 mesafesidir – eickenberg
Ö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
Satır/sütun miktarlarını değiştirdim, şimdi daha hızlı çalışmalıyım – pplat