उच्च-आयामी डेटा में निकटतम पड़ोसी?


163

मैंने कुछ दिन पहले एक प्रश्न पूछा है कि किसी दिए गए वेक्टर के लिए निकटतम पड़ोसियों को कैसे खोजना है। मेरा वेक्टर अब 21 आयामों का है और इससे पहले कि मैं आगे बढ़ूं, क्योंकि मैं मशीन लर्निंग के क्षेत्र से नहीं हूं और न ही गणित, मैं खुद से कुछ बुनियादी सवाल पूछना शुरू कर रहा हूं:

  • क्या पहले स्थान पर निकटतम पड़ोसियों को खोजने के लिए यूक्लिडियन दूरी एक अच्छी मीट्रिक है? यदि नहीं, तो मेरे पास क्या विकल्प हैं?
  • इसके अलावा, के-पड़ोसियों को निर्धारित करने के लिए सही दहलीज तय करने के बारे में कैसे जाना जाता है? क्या इस मूल्य का पता लगाने के लिए कुछ विश्लेषण किया जा सकता है?
  • पहले, मुझे kd-Trees का उपयोग करने का सुझाव दिया गया था, लेकिन विकिपीडिया पृष्ठ स्पष्ट रूप से कहता है कि उच्च-आयामों के लिए, kd-Tree एक ब्रूट-बल खोज के लगभग बराबर है। उस मामले में, एक लाख बिंदु डेटासेट में कुशलतापूर्वक निकटतम पड़ोसियों को खोजने का सबसे अच्छा तरीका क्या है?

क्या कोई उपरोक्त प्रश्नों में से कुछ (या सभी) को स्पष्ट कर सकता है?


Metaoptimize.com
pajton

4
कुछ लोगों के लिए "उच्च आयाम" 20 है और कुछ डेटा, दूसरों के लिए 50 या 100 या 1000। कृपया संख्या दें यदि आप कर सकते हैं, उदाहरण के लिए "मैंने xx का उपयोग करके मंद 21, 1000000 डेटा बिंदुओं को किया है"।
डेनिस

kD-Tree एक समय में दो आयामों के साथ डेटा को विभाजित करता है। यदि आपके पास 20 आयाम हैं और केवल 1M डेटा बिंदु हैं, तो आपको लगभग 1 स्तर का पेड़ मिलता है - जहां स्तर का अर्थ है हर धुरी पर विभाजित होना। चूंकि कोई वास्तविक गहराई नहीं है, इसलिए आपको पेड़ की शाखाओं की अनदेखी करने का लाभ नहीं मिलता है। यह एक द्विआधारी वृक्ष के रूप में इतना सोचने के लिए उपयोगी नहीं है, लेकिन यह एक द्विआधारी वृक्ष की तरह कार्यान्वित होने के बावजूद, क्वाड-ट्री, ऑक्ट्री, आदि की तरह है।
फाकलर

@ हेडिस, हिग्स डाटासेट के लिए 'मंद 21, 1000000 डेटा पॉइंट' था?
नीक

1
यहाँ हिग्स डाटासेट डाउनलोड करने के लिए लिंक है। 28 विशेषताओं के साथ 11 मिलियन अवलोकन। अंतिम कॉलम लेबल है: सिग्नल के लिए 1, शोर के लिए शून्य। संग्रह
.ics.uci.edu

जवाबों:


179

मैं वर्तमान में ऐसी समस्याओं का अध्ययन करता हूं - वर्गीकरण, निकटतम पड़ोसी खोज - संगीत की जानकारी पुनर्प्राप्ति के लिए।

आपको लगभग निकटतम पड़ोसी ( ANN ) एल्गोरिदम में रुचि हो सकती है। विचार यह है कि आप एल्गोरिथ्म को पड़ोसियों के पास पर्याप्त रूप से लौटने की अनुमति देते हैं (शायद निकटतम पड़ोसी नहीं); ऐसा करने में, आप जटिलता को कम करते हैं। आपने केडी-ट्री का उल्लेख किया ; यह एक उदाहरण है। लेकिन जैसा कि आपने कहा, केडी-ट्री उच्च आयामों में खराब काम करता है। वास्तव में, सभी वर्तमान अनुक्रमण तकनीकें (अंतरिक्ष विभाजन के आधार पर) पर्याप्त उच्च आयामों [1] [2] [3] के लिए रैखिक खोज को नीचा दिखाती हैं।

के अलावा एएनएन हाल ही में प्रस्तावित एल्गोरिदम, शायद सबसे लोकप्रिय है इलाका-संवेदनशील हैशिंग ( LSH ) है, जो यानी डिब्बे का एक सेट, में एक उच्च आयामी अंतरिक्ष में निर्धारित बिन्दुओं के नक्शे, एक हैश तालिका [1] [3]। लेकिन पारंपरिक हैश के विपरीत, एक स्थानीय-संवेदनशील हैश पास के बिंदुओं को एक ही बिन में रखता है ।

एलएसएच के कुछ बड़े फायदे हैं। पहला, यह सरल है। आप अपने डेटाबेस में सभी बिंदुओं के लिए हैश की गणना करते हैं, फिर उनसे एक हैश तालिका बनाते हैं। क्वेरी करने के लिए, बस क्वेरी बिंदु के हैश की गणना करें, फिर उसी तालिका के सभी बिंदुओं को हैश तालिका से पुनर्प्राप्त करें।

दूसरा, एक कठोर सिद्धांत है जो इसके प्रदर्शन का समर्थन करता है। यह दिखाया जा सकता है कि क्वेरी समय सबलाइन है डेटाबेस के आकार में, यानी, तेजी से रैखिक खोज की तुलना में। कितना तेजी से निर्भर करता है कि हम कितना सन्निकटन सहन कर सकते हैं

अंत में, LSH के लिए किसी भी Lp मानदंड के साथ संगत है 0 < p <= 2। इसलिए, अपने पहले प्रश्न का उत्तर देने के लिए, आप यूक्लिडियन दूरी मीट्रिक के साथ एलएसएच का उपयोग कर सकते हैं , या आप मैनहट्टन (एल 1) दूरी मीट्रिक के साथ इसका उपयोग कर सकते हैं। हेमिंग दूरी और कोसाइन समानता के लिए भी वेरिएंट हैं।

2008 [4] में IEEE सिग्नल प्रोसेसिंग पत्रिका के लिए मैल्कम स्लैनी और माइकल केसी द्वारा एक सभ्य अवलोकन लिखा गया था।

एलएसएच को हर जगह उचित रूप से लागू किया गया है। आप इसे एक कोशिश देना चाह सकते हैं।


[१] दातार, इंडीक, इमोरलिक, मिरोक्नी, "पी-स्टेबल डिस्ट्रीब्यूशन पर आधारित लोकलिटी-सेंसिटिव हैशिंग स्कीम" २००४।

[२] वेबर, शेक, ब्लॉट, "उच्च-आयामी स्थानों में समानता-खोज विधियों के लिए एक मात्रात्मक विश्लेषण और प्रदर्शन अध्ययन," १ ९९,।

[३] जियोनी, इंडिक, मोटवानी, "हैशिंग के माध्यम से उच्च आयामों में समानता खोज," 1999।

[४] स्लेनी, केसी, "निकटतम पड़ोसियों को खोजने के लिए स्थानीय-संवेदनशील हैशिंग", 2008।


1
@Steve: उत्तर के लिए धन्यवाद। क्या आपके पास LSH कार्यान्वयन पर कुछ सुझाव हैं? मैंने जो देखा वही MIT से आया था। क्या कोई अन्य पैकेज तैर रहा है?
लीजेंड

1
उस एक के अलावा, नहीं, मुझे दूसरों का पता नहीं है। मैंने अपने विशिष्ट उद्देश्यों के लिए पायथन में अपना लेखन समाप्त किया। अनिवार्य रूप से, प्रत्येक हैश टेबल को पायथन डिक्शनरी के रूप में लागू किया जाता है d, जहां d[k]कुंजी के साथ एक बिन होता है kd[k]उन सभी बिंदुओं के लेबल समाहित करता है जिनका हैश है k। फिर, आपको बस प्रत्येक बिंदु के लिए हैश की गणना करने की आवश्यकता है। ईक देखें। (१) [४] में, या धारा ३ में [१]।
स्टीव तोजा

@ साइट: आपकी मदद के लिए धन्यवाद। मैं अब इसे लागू करना शुरू करूंगा। क्या आपको इस बात का कोई अंदाजा है कि किसी भी संयोग से बड़े डेटासेट के लिए यह कार्यप्रणाली कैसी है?
लेजेंड

1
एलएसएच का समर्थन करने वाला एक और संदर्भ: हाई-डायमेंशनल स्पेस में निकटतम पड़ोसी एल्गोरिदम की तुलना , हेन्द्रा गुणदी, 2011। cs.anu.edu.au/student/projects/11S2/Reports/Hendra/20Gunadi.pdf
ओलिवर कोलमैन

1
@SteveTjoa: कीवर्ड और एम्बेड किए गए फ़ॉर्मूला को विज़ुअली ग्रैस्प करना कठिन है। जैसा कि आपने पहले ही एलएसएच पर एक ही हाइलाइट किया था, मैंने इसे पूरक किया। केवल सबसे अच्छे इरादों के साथ। हालांकि, वापस लौटने के लिए स्वतंत्र महसूस करें। यह सब के बाद आपका जवाब है। :)
Regexident

81

I. द मेट्रिक मेट्रिक

सबसे पहले, डेटा सेट की संख्या (कॉलम) kNN में उपयोग के लिए एक दूरी मीट्रिक का चयन करने का कारक नहीं है। इस प्रश्न को ठीक करने के लिए काफी कुछ प्रकाशित अध्ययन निर्देशित हैं, और तुलना के लिए सामान्य आधार हैं:

  • आपके डेटा के अंतर्निहित सांख्यिकीय वितरण;

  • उन विशेषताओं के बीच संबंध जो आपके डेटा को समाहित करते हैं (क्या वे स्वतंत्र हैं - यानी, कोवरियन मैट्रिक्स कैसा दिखता है); तथा

  • वह समन्वय स्थान जिससे आपका डेटा प्राप्त किया गया था।

यदि आपके पास वितरण का कोई पूर्व ज्ञान नहीं है, जिससे आपका डेटा सैंपल किया गया था, तो कम से कम एक (अच्छी तरह से प्रलेखित और पूरी तरह से) अध्ययन का निष्कर्ष है कि यूक्लिडियन दूरी सबसे अच्छा विकल्प है।

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

यह केवल मेरे लिए कुछ समय के लिए विफल रहा है, उन मामलों में से प्रत्येक यूक्लिडियन दूरी विफल रही क्योंकि अंतर्निहित (कार्टेशियन) समन्वय प्रणाली एक खराब विकल्प थी। और आप आमतौर पर इसे पहचान लेंगे क्योंकि उदाहरण के लिए पथ की लंबाई (दूरी) अब जोड़ नहीं हैं - उदाहरण के लिए, जब मीट्रिक स्थान एक बिसात है, तो मैनहट्टन की दूरी यूक्लिडियन से बेहतर है, इसी तरह जब मीट्रिक स्थान पृथ्वी है और आपकी दूरी पार है - कॉन्टिनेंटल उड़ानें, एक ध्रुवीय समन्वय प्रणाली के लिए उपयुक्त एक दूरी मीट्रिक एक अच्छा विचार है (उदाहरण के लिए, लंदन से वियना तक 2.5 घंटे है, वियना से सेंट पीटर्सबर्ग एक और 3 बजे है, कमोबेश उसी दिशा में, फिर भी लंदन से सेंट) । पीटर्सबर्ग 5.5 घंटे का नहीं है, इसके बजाय, 3 घंटे से थोड़ा अधिक है।)

लेकिन उन मामलों के अलावा, जिनमें आपका डेटा नॉन-कार्टेशियन कोऑर्डिनेट सिस्टम में होता है, डिस्टेंस मेट्रिक का विकल्प आमतौर पर भौतिक नहीं होता है। ( सीएस छात्र से इस ब्लॉग पोस्ट को देखें , केएनएन क्लासिफायर पर उनके प्रभाव की जांच करके कई दूरी के मैट्रिक्स की तुलना करें - ची स्क्वायर सबसे अच्छे परिणाम देते हैं, लेकिन अंतर बड़े नहीं हैं; एक अधिक व्यापक अध्ययन अकादमिक पेपर में है, तुलनात्मक अध्ययन; निकटतम पड़ोसियों के लिए दूरी के कार्य मोहननोबिस (अनिवार्य रूप से आयाम कोवरियन के लिए खाते में सामान्य रूप से यूक्लिडियन) इस अध्ययन में सबसे अच्छा था।

एक महत्वपूर्ण अनंतिम: दूरी मीट्रिक गणना के लिए सार्थक होने के लिए, आपको होना चाहिए पुन: पैमाने परआपका डेटा - ऐसा करने के बिना सटीक पूर्वानुमान उत्पन्न करने के लिए शायद ही कभी kNN मॉडल का निर्माण संभव है। उदाहरण के लिए, यदि आप एथलेटिक प्रदर्शन की भविष्यवाणी करने के लिए एक केएनएन मॉडल का निर्माण कर रहे हैं, और आपकी अपेक्षा चर ऊंचाई (सेमी), वजन (किलो), बॉडीफैट (%), और आराम करने वाली पल्स (प्रति मिनट धड़कता है) है, तो एक विशिष्ट गति बिंदु हो सकता है कुछ इस तरह देखो: [१ this०.४, ६६.१, ११.३, [१]। स्पष्ट रूप से दूरी की गणना ऊंचाई पर हावी होगी, जबकि बॉडीफैट% द्वारा योगदान लगभग नगण्य होगा। एक और तरीका रखो, अगर इसके बजाय, डेटा अलग-अलग रिपोर्ट किया गया था, ताकि बॉडीवेट किलोग्राम के बजाय ग्राम में था, तो 86.1 का मूल मूल्य, 86,100 होगा, जिसका आपके परिणामों पर बड़ा प्रभाव पड़ेगा, जो वास्तव में डॉन है 'नहीं चाहिए।

X_new = (X_old - mu) / sigma


द्वितीय। डेटा संरचना

यदि आप kd-tree संरचना के प्रदर्शन के बारे में चिंतित हैं, A Voronoi Tessellation एक वैचारिक रूप से सरल कंटेनर है, लेकिन यह kd-Trees की तुलना में प्रदर्शन और पैमानों को बेहतर बनाएगा।

Dat

यह केएनएन प्रशिक्षण डेटा को बनाए रखने के लिए सबसे आम तरीका नहीं है, हालांकि इस उद्देश्य के लिए वीटी के आवेदन, साथ ही परिणामी प्रदर्शन लाभ, अच्छी तरह से प्रलेखित हैं (उदाहरण के लिए यह माइक्रोसॉफ्ट रिसर्च रिपोर्ट देखें )। इसका व्यावहारिक महत्व यह है कि, बशर्ते आप 'मुख्यधारा' की भाषा का उपयोग कर रहे हों (उदाहरण के लिए, TIOBE इंडेक्स में ) तो आपको वीटी करने के लिए लाइब्रेरी ढूंढनी चाहिए। मैं पायथन और आर में जानता हूं, प्रत्येक भाषा के लिए कई विकल्प हैं (उदाहरण के लिए, CR पर उपलब्ध R के लिए voronoi पैकेज )

केएनएन के लिए वीटी का उपयोग इस तरह से करता है ::

अपने डेटा से, बेतरतीब ढंग से w बिंदुओं का चयन करें - ये आपके वोरोनोई केंद्र हैं। एक वोरोनोई सेल सभी पड़ोसी बिंदुओं को अलग करती है जो प्रत्येक केंद्र के सबसे करीब हैं। कल्पना करें कि क्या आप वोरोनोई केंद्रों में से प्रत्येक को एक अलग रंग प्रदान करते हैं, ताकि किसी दिए गए केंद्र को सौंपे गए प्रत्येक बिंदु को उस रंग में चित्रित किया जाए। जब तक आपके पास पर्याप्त घनत्व है, ऐसा करने से प्रत्येक वोरोनोई केंद्र की सीमाओं को अच्छी तरह से दिखाई देगा (दो सीमाओं को अलग करने वाली सीमा के रूप में।

वोरोनोई केंद्रों का चयन कैसे करें? मैं दो ऑर्थोगोनल दिशानिर्देशों का उपयोग करता हूं। W बिंदुओं को यादृच्छिक रूप से चुनने के बाद, अपने प्रशिक्षण डेटा के लिए VT की गणना करें। अगले प्रत्येक वोरोनोई केंद्र को सौंपे गए डेटा बिंदुओं की संख्या की जांच करें - ये मान समान (आपके समान स्थान पर एक समान घनत्व दिए गए) होने चाहिए। दो आयामों में, यह उसी आकार की टाइलों के साथ एक वीटी का कारण होगा। पहला नियम, यहां दूसरा है। पुनरावृति द्वारा w चुनें - एक चर पैरामीटर के रूप में w के साथ अपना kNN एल्गोरिथ्म चलाएं, और प्रदर्शन को मापें (वीटी को क्वेरी करके एक भविष्यवाणी को वापस करने के लिए आवश्यक समय)।

तो कल्पना कीजिए कि आपके पास एक मिलियन डेटा पॉइंट्स हैं ..... यदि पॉइंट्स को साधारण 2D डेटा संरचना में, या केडी-ट्री में बनाए रखा गया था, तो आप औसतन कुछ मिलियन मिलियन के लिए गणना करेंगे। प्रत्येक केनए डेटा पॉइंट्स जिनके रिस्पॉन्स वेरिएबल की आप भविष्यवाणी करना चाहते हैं। बेशक, वे गणना एकल डेटा सेट पर की जाती हैं। V / T के साथ, निकटतम-पड़ोसी खोज को दो चरणों में किया जाता है एक के बाद एक, डेटा की दो अलग-अलग आबादी के खिलाफ - पहले वोरोनोई केंद्रों के खिलाफ, फिर एक बार निकटतम केंद्र मिल जाने पर, सेल के अंदर के बिंदुओं के अनुरूप उस केंद्र को वास्तविक निकटतम पड़ोसी (क्रमिक दूरी की गणना द्वारा) खोजने के लिए खोजा जाता है, संयुक्त, ये दोनों लुक-अप एक ही जानवर-बल के लुक-अप की तुलना में बहुत तेज़ हैं। यह देखना आसान है: 1M डेटा बिंदुओं के लिए, मान लीजिए कि आप अपने डेटा स्थान को खाली करने के लिए 250 वोरोनोई केंद्रों का चयन करते हैं। औसतन, प्रत्येक वोरोनोई सेल में 4,000 डेटा बिंदु होंगे। इसलिए औसतन 500,000 डिस्टेंस कैलकुलेशन (ब्रूट फोर्स) पर प्रदर्शन करने के बजाय, आप औसत से कम सिर्फ 125 + 2,000 का प्रदर्शन करते हैं।

तृतीय। परिणाम की गणना (अनुमानित प्रतिक्रिया चर)

केएनएन प्रशिक्षण डेटा के एक सेट से अनुमानित मूल्य की गणना करने के लिए दो चरण हैं। पहली गणना के लिए उपयोग करने के लिए n, या निकटतम पड़ोसियों की संख्या की पहचान कर रहा है । दूसरा यह है कि अनुमानित मूल्य के लिए उनके योगदान को कैसे कम किया जाए

पहला घटक डब्ल्यू / आर / टी, आप एक अनुकूलन समस्या को हल करके एन का सबसे अच्छा मूल्य निर्धारित कर सकते हैं (बहुत कम से कम वर्गों के अनुकूलन के समान)। यही सिद्धांत है; व्यवहार में, ज्यादातर लोग सिर्फ n = 3 का उपयोग करते हैं। किसी भी घटना में, n = 1, n = 2, n = 3, आदि के लिए परीक्षण उदाहरणों (अनुमानित मूल्यों की गणना करने के लिए) के सेट पर अपने kNN एल्गोरिथ्म को चलाना सरल है और n के एक फ़ंक्शन के रूप में त्रुटि की साजिश रचें। यदि आप अभी शुरू करने के लिए n के लिए एक प्रशंसनीय मूल्य चाहते हैं, तो बस n = 3 का उपयोग करें।

दूसरा घटक यह है कि प्रत्येक पड़ोसी के योगदान को कैसे कम किया जाए (n> 1 मानकर)।

सबसे सरल भारोत्तोलन तकनीक केवल एक भारांक गुणांक द्वारा प्रत्येक पड़ोसी को गुणा कर रही है, जो कि सिर्फ 1 / (dist * K) है, या उस पड़ोसी से परीक्षण उदाहरण के लिए दूरी का व्युत्क्रम अक्सर कुछ अनुभवजन्य व्युत्पन्न स्थिरांक से गुणा किया जाता है, I. मैं इस तकनीक का प्रशंसक नहीं हूं क्योंकि यह अक्सर निकटतम पड़ोसियों को मात देता है (और इसके विपरीत अधिक वजन वाले लोगों को मात देता है); इसका महत्व यह है कि एक दी गई भविष्यवाणी लगभग पूरी तरह से एक ही पड़ोसी पर निर्भर हो सकती है, जो बदले में एल्गोरिदम की शोर के प्रति संवेदनशीलता को बढ़ाती है।

एक बेहतर वज़निंग फंक्शन होना चाहिए, जो इस सीमा से काफी हद तक बचता है वह है गॉसियन फंक्शन , जो अजगर में दिखता है:

def weight_gauss(dist, sig=2.0) :
    return math.e**(-dist**2/(2*sig**2))

अपने kNN कोड का उपयोग करके एक अनुमानित मूल्य की गणना करने के लिए, आप n निकटतम पड़ोसियों की पहचान उस डेटा बिंदु पर करेंगे जिसकी प्रतिक्रिया चर आप भविष्यवाणी करना चाहते हैं ('परीक्षण उदाहरण'), फिर वेट_गॉस फ़ंक्शन को कॉल करें, प्रत्येक n पड़ोसियों के लिए, एक बार प्रत्येक पड़ोसी के बीच की दूरी में परीक्षण बिंदु। यह फ़ंक्शन प्रत्येक पड़ोसी के लिए वजन लौटाएगा, जो तब भारित औसत गणना में उस पड़ोसी के गुणांक के रूप में उपयोग किया जाता है।


2
बहुत बढ़िया जवाब! मेरे अनुभव के सापेक्ष व्यापक और सटीक।
टेड डनिंग

अच्छा उत्तर, +1, मैंने यहां एक नया और उत्तर जोड़ा है , क्या यह अच्छा है?
gsamaras

1
"तो कल्पना करें कि आपके पास एक मिलियन डेटा पॉइंट हैं ..... यदि पॉइंट्स को एक सामान्य 2D डेटा संरचना में, या केडी-ट्री में बनाए रखा गया था , तो आप प्रत्येक नए डेटा पॉइंट्स के लिए औसतन कुछ मिलियन डिस्टेंस कैलकुलेशन करेंगे, जिनकी प्रतिक्रिया चर जो आप भविष्यवाणी करना चाहते हैं। " सहमत नहीं हैं। यह सिद्ध किया जा सकता है कि केडी-पेड़ों की O(sqrt(n))2 डी में खोज जटिलता है।
एंटोनी

16

आप जो सामना कर रहे हैं, उसे आयामीता के अभिशाप के रूप में जाना जाता है । पीसीए या आईसीए जैसे एल्गोरिथ्म को चलाने के लिए कभी-कभी उपयोगी होता है यह सुनिश्चित करने के लिए कि आपको वास्तव में सभी 21 आयामों की आवश्यकता है और संभवतः एक रैखिक परिवर्तन खोजें जो आपको लगभग 21 समान परिणाम गुणवत्ता के साथ 21 से कम का उपयोग करने की अनुमति देगा।

अद्यतन: मैंने उन्हें रंगायन द्वारा बायोमेडिकल सिग्नल प्रोसेसिंग नामक एक पुस्तक में सामना किया (मुझे आशा है कि मुझे यह सही ढंग से याद है)। आईसीए एक तुच्छ तकनीक नहीं है, लेकिन यह फिनलैंड में शोधकर्ताओं द्वारा विकसित किया गया था और मुझे लगता है कि इसके लिए मैटलैब कोड सार्वजनिक रूप से डाउनलोड के लिए उपलब्ध है। पीसीए एक अधिक व्यापक रूप से इस्तेमाल की जाने वाली तकनीक है और मेरा मानना ​​है कि आपको इसका आर या अन्य सॉफ्टवेयर कार्यान्वयन खोजने में सक्षम होना चाहिए। पीसीए को रैखिक समीकरणों को क्रमिक रूप से हल करके किया जाता है। मैंने यह याद करने के लिए बहुत पहले किया है कि कैसे। =)

विचार यह है कि आप अपने संकेतों को स्वतंत्र आइगेनवेक्टर्स (असतत आइजनफंक्शंस, वास्तव में) और उनके आइजनवेल्यूज को तोड़ते हैं, 21 आपके मामले में। प्रत्येक eigenvalue प्रत्येक माप में आपके द्वारा दिए गए योगदान की प्रत्येक राशि को दिखाता है। यदि एक eigenvalue छोटा है, तो आप बहुत ही समान रूप से इसके स्वदेशीकरण का उपयोग किए बिना संकेतों को बहुत बारीकी से दर्शा सकते हैं, और इस तरह आप एक आयाम से छुटकारा पा लेते हैं।


+1 धन्यवाद। यह एक बहुत ही दिलचस्प सुझाव है और सही समझ में आता है। अंतिम अनुरोध के रूप में, क्या आप किसी भी हैंड-ऑन ट्यूटोरियल (या तो अजगर या आर या किसी अन्य भाषा में) से परिचित हैं, जो बताता है कि यह कैसे करना है। मैंने कल से कुछ दस्तावेज़ पढ़े हैं, लेकिन उनमें से अधिकांश मेरी समझ से बाहर हैं। कोई सुझाव?
लीजेंड

4
नाइटपैकिंग: आईसीए एक आयाम में कमी एल्गोरिथ्म नहीं है। यह नहीं जानता कि घटकों को कैसे स्कोर किया जाना चाहिए और इस तरह का उपयोग नहीं किया जाना चाहिए।
Gael Varoquaux

12

शीर्ष उत्तर अच्छे लेकिन पुराने हैं, इसलिए मैं 2016 का उत्तर जोड़ना चाहूंगा ।


जैसा कि कहा गया है, एक उच्च आयामी अंतरिक्ष में, आयामीता का अभिशाप कोने के चारों ओर घूमता है, जिससे पारंपरिक दृष्टिकोण, जैसे कि लोकप्रिय kd पेड़, एक क्रूर बल दृष्टिकोण के रूप में धीमा हो जाता है। नतीजतन, हम अपनी रुचि को लगभग निकटतम पड़ोसी खोज (ANNS) में बदल देते हैं , जो कुछ सटीकता के पक्ष में है, इस प्रक्रिया को गति देता है। आपको एक अच्छा प्रस्ताव के साथ, सटीक एनएन का एक अच्छा अनुमान मिलता है।


गर्म विषय जो योग्य हो सकते हैं:

  1. एलएसएच के आधुनिक दृष्टिकोण , जैसे कि रेज़नेशिएन
  2. आरकेडी वन : रैंडम केड ट्री (आरकेडी) के वन (एस), जैसा कि FLANN में वर्णित है , या अधिक हाल के दृष्टिकोण में मैं kd-GeRaF का हिस्सा था ।
  3. LOPQ जो स्थानीय रूप से अनुकूलित उत्पाद मात्राकरण के लिए खड़ा है, जैसा कि यहां वर्णित है । यह नए बाबेंको + लेम्प्टस्की के दृष्टिकोण के समान है

आप मेरे प्रासंगिक उत्तर भी देख सकते हैं:

  1. उच्च आयामी बिंदुओं के दो सेट: दूसरे सेट में निकटतम पड़ोसी का पता लगाएं
  2. विभिन्न डेटा संरचनाओं पर निकटतम पड़ोसी प्रश्नों के क्रम की तुलना
  3. पीसीएल केडी-ट्री कार्यान्वयन बेहद धीमा है

8

एक-एक करके अपने सवालों के जवाब देने के लिए:

  • नहीं, यूक्लिडियन दूरी उच्च आयामी अंतरिक्ष में एक खराब मीट्रिक है। मूल रूप से उच्च आयामों में, डेटा बिंदुओं में एक दूसरे के बीच बड़े अंतर होते हैं। जो किसी दिए गए डेटा बिंदु और उसके निकटतम और दूर के पड़ोसी के बीच की दूरी में सापेक्ष अंतर को कम करता है।
  • बहुत सारे कागजात / शोध उच्च आयाम डेटा में हैं, लेकिन अधिकांश सामानों में बहुत सारे गणितीय परिष्कार की आवश्यकता होती है।
  • उच्च आयामी डेटा के लिए केडी का पेड़ खराब है ... इसे सभी तरीकों से बचें

यहां आपको सही दिशा में शुरुआत करने के लिए एक अच्छा पेपर दिया गया है। " जब निकटतम पड़ोसी में सार्थक ?" बेयर एट सभी द्वारा।

मैं 20K और उसके बाद के आयामों के पाठ डेटा के साथ काम करता हूं। यदि आप पाठ से संबंधित कुछ सलाह चाहते हैं, तो मैं आपकी मदद करने में सक्षम हो सकता हूं।


1
+1 इसे पढ़ने के लिए मैं उस पेपर को प्रिंट कर रहा हूं। इस बीच, क्या आपके पास सुझाव हैं कि निकटतम पड़ोसियों का पता कैसे लगाया जाए? यदि दूरी मीट्रिक और पड़ोसी की परिभाषा दोनों ही त्रुटिपूर्ण हैं, तो लोग आमतौर पर उच्च आयाम की समस्याओं को कैसे हल करते हैं जहां वे फीचर वैक्टर के आधार पर अनुमानित मिलान करना चाहते हैं? कोई सुझाव?
लीजेंड

1
पाठ के मामले में हम कॉशन समानता का भरपूर उपयोग करते हैं। मैं स्वयं पाठ वर्गीकरण में काम कर रहा हूं और पाता हूं कि उच्च आयामों के लिए, रैखिक कर्नेल के साथ एसवीएम सबसे प्रभावी लगता है।
BiGYaN

@BiGYaN आपने अपने स्थान को कैसे परिभाषित किया है। मेरा मतलब है कि वेक्टर शब्द या एम्बेडेड वेक्टर की सीमा पर आधारित है?
user3487667

@ user3487667, अंतरिक्ष इस बात पर निर्भर करता है कि आप अपनी समस्या कैसे बनाते हैं। मैं एक साधारण बैग-ऑफ-वर्ड मॉडल के बारे में बात कर रहा था।
BiYYNN

5

उच्च आयाम वाले वैक्टर की तुलना करने के लिए कॉशन समानता एक सामान्य तरीका है। ध्यान दें कि चूंकि यह एक समानता है दूरी नहीं है, आप इसे कम से कम नहीं करना चाहते हैं। आप डेटा की तुलना करने के लिए एक डोमेन-विशिष्ट तरीके का उपयोग भी कर सकते हैं, उदाहरण के लिए यदि आपका डेटा डीएनए अनुक्रम था, तो आप एक अनुक्रम समानता का उपयोग कर सकते हैं जो म्यूटेशन की संभावनाओं को ध्यान में रखते हैं, आदि।

उपयोग करने के लिए निकटतम पड़ोसियों की संख्या डेटा के प्रकार के आधार पर भिन्न होती है, वहां कितना शोर होता है, आदि कोई सामान्य नियम नहीं हैं, आपको बस एक सीमा के भीतर सभी मूल्यों को आज़माकर अपने विशिष्ट डेटा और समस्या के लिए सबसे अच्छा काम करना है। । लोगों को एक सहज समझ है कि जितना अधिक डेटा है, उतने ही कम पड़ोसी आपको चाहिए। एक काल्पनिक स्थिति में जहां आपके पास सभी संभव डेटा होते हैं, आपको केवल एक निकटतम पड़ोसी को वर्गीकृत करने के लिए देखना होगा।

के निकटतम पड़ोसी विधि कम्प्यूटेशनल रूप से महंगी होने के लिए जानी जाती है। यह मुख्य कारणों में से एक है जो लोग अन्य एल्गोरिदम का समर्थन करते हैं जैसे कि वेक्टर वेक्टर।


यह दिलचस्प है। क्या आप इस बारे में अधिक विस्तार से बता सकते हैं कि मैं अपने मामले में एसवीएम का उपयोग कैसे कर सकता हूं? मुझे लगा कि k- निकटतम पड़ोसी अधिक पसंद किए गए थे और एसवीएम की निगरानी की गई थी। अगर मैं गलत हूं कृपया मुझे सही।
लीजेंड

2
दोनों तरीकों की देखरेख की जाती है, क्योंकि आपके प्रशिक्षण डेटा को सही कक्षाओं के साथ एनोटेट किया जाता है। यदि आपके पास केवल फ़ीचर वैक्टर हैं, और वे उन कक्षाओं को नहीं जानते हैं जो वे संबंधित हैं, तो आप केएनएन या एसवीएम का उपयोग नहीं कर सकते। अनसुचित शिक्षण विधियों को आमतौर पर क्लस्टरिंग एल्गोरिदम के रूप में संदर्भित किया जाता है। वे समान डेटा के समूहों की पहचान कर सकते हैं, लेकिन वे आपको यह नहीं बताते कि समूहों का क्या मतलब है।
कॉलिन

स्पष्टीकरण के लिए धन्यवाद। तुम सही हो। यह वास्तव में एक पर्यवेक्षित तकनीक है। मुझे अभी एहसास नहीं हुआ कि मैंने जो श्रेणियां
लीजेंड

4

केडी-ट्री वास्तव में उच्च-आयामी डेटा पर बहुत अच्छी तरह से काम नहीं करेंगे। क्योंकि प्रूनिंग कदम अब बहुत मदद नहीं करता है, निकटतम बढ़त के रूप में - एक 1 आयामी विचलन - लगभग हमेशा ज्ञात निकटतम पड़ोसियों के पूर्ण-आयामी विचलन से छोटा होगा।

लेकिन इसके अलावा, केडी-पेड़ केवल मेरे द्वारा ज्ञात सभी एलपी मानदंडों के साथ अच्छी तरह से काम करते हैं, और दूरी एकाग्रता प्रभाव है जो बढ़ती हुई गतिशीलता के साथ दूरी आधारित एल्गोरिदम को नीचा दिखाता है।

अधिक जानकारी के लिए, आप आयाम के अभिशाप पर पढ़ना चाह सकते हैं, और इसके विभिन्न प्रकार (इसके एक से अधिक पक्ष हैं!)

मुझे यकीन नहीं है कि यूक्लिडियन निकटतम पड़ोसियों जैसे एलएसएच या यादृच्छिक अनुमानों का उपयोग करने के लिए सिर्फ आँख बंद करके उपयोग करने के लिए बहुत कुछ है। यह पहली जगह में एक बहुत अधिक ठीक ट्यून दूरी समारोह का उपयोग करने के लिए आवश्यक हो सकता है!


क्या आपके पास अपने पहले और दूसरे पैराग्राफ के संदर्भ हैं?
चक

नहीं, लेकिन उन्हें सामान्य रूप से "आयामीता के अभिशाप" से तत्काल स्पष्ट होना चाहिए (सीएफ, सर्वेक्षण ) और किसी भी केडी-वृक्ष को खोजने की कोशिश करें जो यूक्लिडियन के अलावा किसी और चीज का समर्थन करता है ... अन्य दूरी का समर्थन करना संभव है, लेकिन आम नहीं (ईएलकेआई) सभी मिंकोवस्की दूरी + यूक्लिडियन की अनुमति देता है, लेकिन अधिकांश में केवल यूक्लिडियन होगा)। बस विचार करें कि केडी-पेड़ एक आयाम का उपयोग केवल छंटाई के लिए करते हैं, और इसकी तुलना सभी आयामों से दूरी से करते हैं । साथ ही, आपके विभाजन प्रत्येक आयाम में विभाजित नहीं हो पाएंगे।
एरच Schubert

3

बहुत कुछ इस बात पर निर्भर करता है कि आप निकटतम पड़ोसियों को क्यों जानना चाहते हैं। यदि आप वास्तव में चाहते हैं कि आप अपने डेटा सेट के मोड को खोजें, तो आप औसत शिफ्ट एल्गोरिथ्म http://en.wikipedia.org/wiki/Mean-shift पर गौर कर सकते हैं ।


2
जहाँ तक मुझे पता है कि मीन-शिफ्ट उच्च आयामी डेटा को क्लस्टर करने के लिए अनुकूल नहीं है। के-मीन्स एक बेहतर विकल्प हो सकता है।
fdermishin

3

मुझे लगता है कि बूलियन फीचर्स के tf-idf पर कॉशन ज्यादातर समस्याओं के लिए अच्छा काम करेगा। ऐसा इसलिए है क्योंकि इसका समय-सिद्ध हेयुरिस्ट ल्यूसिन जैसे कई खोज इंजनों में उपयोग किया जाता है। मेरे अनुभव में यूक्लिडियन दूरी किसी भी पाठ जैसे डेटा के लिए खराब परिणाम दिखाती है। अलग-अलग वज़न और के-उदाहरणों का चयन प्रशिक्षण डेटा और ब्रूट-फोर्स पैरामीटर चयन के साथ किया जा सकता है।


3

उच्च-आयामी डेटा में सटीक knn पुनर्प्राप्ति के लिए iDistance शायद सबसे अच्छा है। आप इसे एक अनुमानित वोरोनोई टेसलेशन के रूप में देख सकते हैं।


3

मैंने उसी समस्या का अनुभव किया है और निम्नलिखित कह सकते हैं।

  1. यूक्लिडियन दूरी एक अच्छी दूरी की मीट्रिक है, हालांकि यह मैनहट्टन दूरी की तुलना में कम्प्यूटेशनल रूप से अधिक महंगा है , और कभी-कभी थोड़ा खराब परिणाम देता है, इस प्रकार, मैं बाद में चुनूंगा।

  2. K का मान आनुभविक रूप से पाया जा सकता है। आप अलग-अलग मानों की कोशिश कर सकते हैं और एक स्वीकार्य मूल्य खोजने के लिए परिणामस्वरूप आरओसी घटता या कुछ अन्य सटीक / रिकॉल माप की जांच कर सकते हैं ।

  3. यूक्लिडियन और मैनहट्टन दोनों दूरी त्रिभुज असमानता का सम्मान करते हैं , इस प्रकार आप उन्हें मीट्रिक पेड़ों में उपयोग कर सकते हैं। दरअसल, जब डेटा 10 से अधिक आयामों का होता है, तो केडी-पेड़ों का प्रदर्शन बुरी तरह से कम हो जाता है (मैंने खुद उस समस्या का अनुभव किया है)। मैंने पाया कि वीपी-ट्री बेहतर विकल्प हैं।


3

केडी पेड़ 21 आयामों के लिए ठीक काम करते हैं, यदि आप सभी बिंदुओं के 5% कहने के बाद जल्दी छोड़ देते हैं। 128-मंद सिफ्ट वैक्टर से मिलान करने के लिए FLANN यह (और अन्य स्पीडअप) करता है। (दुर्भाग्य से FLANN केवल यूक्लिडियन मीट्रिक करता है, और तेज़ और ठोस scipy.spatial.cKDTree केवल Lp मैट्रिक्स करता है; ये आपके डेटा के लिए पर्याप्त हो सकता है या नहीं भी ।) बेशक यहाँ एक गति-सटीकता वाला ट्रेडऑफ़ है।

(यदि आप अपने Ndata, Nquery, डेटा वितरण का वर्णन कर सकते हैं, तो इससे लोगों को समान डेटा आज़माने में मदद मिल सकती है।)

जोड़ा गया 26 अप्रैल, मेरे पुराने मैक पीपीसी पर कटऑफ के साथ cKDTree के लिए बार चलाएं, एक बहुत ही कठिन विचार देने के लिए:

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=1000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.1 % of the 1000000 points, 0.31 % of 188315 boxes; better 0.0042 0.014 0.1 %
3.5 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.253

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=5000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.48 % of the 1000000 points, 1.1 % of 188315 boxes; better 0.0071 0.026 0.5 %
15 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.245

2

आप az ऑर्डर वक्र की कोशिश कर सकते हैं। यह 3 आयाम के लिए आसान है।


0

क्या पहले स्थान पर निकटतम पड़ोसियों को खोजने के लिए यूक्लिडियन दूरी एक अच्छी मीट्रिक है? यदि नहीं, तो मेरे पास क्या विकल्प हैं?

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

मिश्रित संख्यात्मक और श्रेणीबद्ध डेटासेट के उप-समूह क्लस्टरिंग के लिए एक k- साधन प्रकार क्लस्टरिंग एल्गोरिदम

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.