5

मैं यादृच्छिक मूल्यों के मैट्रिक्स से बाहर दिए गए कॉलम वेक्टर को निकटतम कॉलम वैक्टर खोजने के लिए विज्ञानकिट के निकटतम पड़ोसी कार्यान्वयन का उपयोग करने का प्रयास कर रहा हूं।विज्ञान-सीखने का नजदीक पड़ोसी क्यों उचित कोसाइन समानता दूरी वापस नहीं प्रतीत होता है?

इस कोड को फिर स्तंभ के खिलाफ उन पड़ोसियों की वास्तविक कोज्या समानता जाँच स्तंभ 21 के निकटतम पड़ोसी ढूंढ़ना माना जाता है 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] 

आउटपुट लगता है कि

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 

तो के उत्पादन kneighbors न तो कोसाइन दूरी या कोसाइन समानता है। क्या देता है?

इसके अलावा, एक तरफ के रूप में, मैंने सोचा कि sklearn के निकटतम पड़ोसियों के कार्यान्वयन लगभग निकटतम पड़ोसियों के दृष्टिकोण नहीं थे, फिर भी मुझे लगता है कि अगर मैं इसे खत्म करता हूं तो परिणामों के मुकाबले यह मेरे डेटासेट में वास्तविक सर्वश्रेष्ठ पड़ोसियों का पता लगाना प्रतीत नहीं होता है मैट्रिक्स और सभी अन्य लोगों के लिए कॉलम 211 की समानताओं की जांच करें। क्या मैं यहां कुछ बुनियादी समझ रहा हूं?

उत्तर

7

ठीक है समस्या यह थी कि निकटतम नेविघर्स की .fit() विधि डिफ़ॉल्ट रूप से मानती है कि पंक्तियां नमूने हैं और कॉलम विशेषताएं हैं। फिट होने से पहले मुझे मैट्रिक्स को ट्रांसफर करना पड़ा।

संपादित करें: इसके अलावा, एक और समस्या यह है कि मेट्रिक के रूप में पारित कॉल योग्य दूरी को कॉल करने योग्य, एक समानता कॉल करने योग्य नहीं होना चाहिए। अन्यथा आप के सबसे दूर के पड़ोसियों को प्राप्त करेंगे:/

+0

'2 - 2 * कोसाइन समानता 'सामान्यीकृत वैक्टरों की एल 2 दूरी – eickenberg

+0

क्या आप इसे छोटा बनाने के लिए अपना उदाहरण बदल सकते हैं, उदा। (20, 40) के बजाय (500, 500)? मेरे कंप्यूटर पर चलाने में थोड़ी देर लग गई और इस बिंदु को साबित करने के लिए उस बड़े होने की आवश्यकता नहीं है। आकार गैर वर्ग बनाने के नमूने और सुविधाओं अक्ष के बीच असंबद्ध मदद कर सकते हैं। यदि, अन्य सभी चीजें बराबर हैं, तो आप अपने लूप में 'sim2 = smp.cosine_similarity (test [x,:], test [d,:]) लिखते हैं, फिर सभी मान मेल खाते हैं। – eickenberg

+0

मैंने पंक्ति/कॉलम रकम बदल दी है, अब तेजी से चलना चाहिए – pplat

संबंधित मुद्दे