5

में कोसाइन मीट्रिक के साथ डीबीएससीएएन त्रुटि मैं कोसाइन मेट्रिक के साथ विज्ञान-सीखने वाली लाइब्रेरी से डीबीएससीएएन एल्गोरिदम का उपयोग करने की कोशिश कर रहा था लेकिन त्रुटि से फंस गया था। कोड की पंक्तिपाइथन

db = DBSCAN(eps=1, min_samples=2, metric='cosine').fit(X)  

जहां X एक csr_matrix है।

मीट्रिक 'कोज्या' एल्गोरिथ्म 'ऑटो' के लिए मान्य नहीं,

हालांकि प्रलेखन कहना है कि यह इस मीट्रिक उपयोग करना संभव है: त्रुटि पीछा कर रहा है। मैंने विकल्प algorithm='kd_tree' और 'ball_tree' का उपयोग करने का प्रयास किया लेकिन उसे वही मिला। हालांकि, अगर मैं euclidean का उपयोग करता हूं या कहता हूं, l1 मीट्रिक का उपयोग करने में कोई त्रुटि नहीं है।

मैट्रिक्स X बड़ा है, इसलिए मैं जोड़ी दूरी के प्रीकंप्यूटेड मैट्रिक्स का उपयोग नहीं कर सकता।

मैं python 2.7.6 और scikit-learn 0.16.1 का उपयोग करता हूं। मेरे डेटासेट में शून्य की पूरी पंक्ति नहीं है, इसलिए कोसाइन मीट्रिक अच्छी तरह परिभाषित है।

+0

यह तर्कसंगत रूप से sklearn में एक बग है, स्पष्ट रूप से। कोसाइन समानता एक मीट्रिक नहीं है। यह त्रिभुज असमानता का पालन नहीं करता है, यही कारण है कि यह केडीटी के साथ काम नहीं करेगा और आपके पास मजबूर करने के अलावा कोई विकल्प नहीं है। जिनमें से सभी सवाल उठाते हैं कि जब आप 'ऑटो' पर एल्गोरिदम सेट करते हैं, तो यह एक विधि का उपयोग करने का प्रयास करता है जिसे पता होना चाहिए कि इसका उपयोग नहीं किया जा सकता है। –

+0

@AdamAcosta: अगर मैं सही ढंग से समझता हूं, तो आप बहस कर रहे हैं कि ''auto'' algorithm'-keyword का उपयोग 'ball_tree'' का उपयोग करके कोशिश करने और विफल होने के बजाय '' brute'' 'का उपयोग करना चाहिए? (मैं सहमत हूं।) –

उत्तर

9

sklearn में सूचकांक (शायद - यह नए संस्करणों के साथ बदल सकता है) कोसाइन को तेज नहीं कर सकता है।

algorithm='brute' आज़माएं।

मैट्रिक्स कि sklearn के अपने संस्करण, में तेजी लाने के कर सकते हैं गेंद पेड़ के समर्थित मीट्रिक देखने की सूची के लिए:

from sklearn.neighbors.ball_tree import BallTree 
print(BallTree.valid_metrics) 
+0

धन्यवाद! अब यह काम कर रहा है। सबसे पहले, यह मुझे एक त्रुटि दे दी क्योंकि मैंने अपने डेटासेट के लिए 'np.double' के बजाय' np.float32' का उपयोग किया था। मुझे लगता है कि डीबीएससीएएन को कोसाइन मीट्रिक के लिए इस तरह की सटीकता की आवश्यकता होती है क्योंकि बाद में एक छोटी सी सीमा होती है (0 और 1 के बीच)। – cheyp

+0

सामान्य रूप से यह आवश्यक नहीं होना चाहिए, लेकिन sklearn कार्यान्वयन में ऐसी सीमाएं हो सकती हैं। –

4

आप कोज्या दूरी की तरह एक सामान्य दूरी चाहते हैं, आप भी अपने वैक्टर को सामान्य कर सकते हैं पहले और फिर यूक्लिडियन मीट्रिक का उपयोग करें। सूचना दो सामान्यीकृत वैक्टर के लिए कि यू और वी इयूक्लिडियन दूरी sqrt के बराबर है (2-2 * cos (u, v)) (see this discussion)

आप इसलिए की तरह कुछ कर सकते हैं:

Xnorm = np.linalg.norm(X,axis = 1) 
Xnormed = np.divide(X,Xnorm.reshape(Xnorm.shape[0],1)) 
db = DBSCAN(eps=0.5, min_samples=2, metric='euclidean').fit(Xnormed) 

दूरी [0,2] में झूठ बोल जाएगी, इसलिए सुनिश्चित करें कि आप तदनुसार अपने पैरामीटर समायोजित करें।

+0

क्या आप थोड़ा और विस्तार कर सकते हैं कि क्यों यूबीक्लिडियन-दूरी-पर-सामान्यीकृत-वैक्टर के साथ डीबीएससीएएन एल्गोरिदम उसी परिणाम को सीधे सीधा-कोसाइन दूरी के साथ उत्पन्न करेगा, अगर ऐसा है? विशेष रूप से, स्क्वायरिंग/स्क्वायर-रूट के साथ क्या होता है, और क्या इससे कोई फर्क पड़ता है कि कोसाइन वास्तव में * समानता * को मापता है और दूरी नहीं (दूरी '1-cos (.; है।) ' –

+0

उदाहरण के लिए, यदि आप जानते हैं कि 'ईपीएस' को कोसाइन दूरी के साथ' x' पर सेट किया जाना चाहिए, तो इसे 'euclid' के साथ डीबीएससीएएन का उपयोग करते समय 'sqrt (x)' पर सेट किया जाना चाहिए। और, यदि ऐसा डेटा है, तो क्या स्लेलेन इंडेक्सिंग अपने उपवास उद्देश्य को पूरा कर रहा है? –

+0

@NikanaReklawyks जैसा कि मैंने ऊपर बताया है, मैंने जो भी उल्लेख किया है वह कोसाइन दूरी की तरह सामान्यीकृत दूरी प्राप्त करने के लिए किया जा सकता है। स्क्वायरिंग ऑपरेशन की वजह से यह वही नहीं होगा। साथ ही, जैसा कि आपने नोट किया है, कोसाइन दूरी वह है जो लोग सकारात्मक स्थान में कोसाइन समानता के पूरक का नाम देते हैं, यह उचित दूरी मीट्रिक नहीं है। लेकिन मैं उन विवरणों में नहीं जाता क्योंकि सवाल कोसाइन दूरी के बारे में पूछा गया था। – benbo