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 की तुलना में प्रदर्शन और पैमानों को बेहतर बनाएगा।
यह केएनएन प्रशिक्षण डेटा को बनाए रखने के लिए सबसे आम तरीका नहीं है, हालांकि इस उद्देश्य के लिए वीटी के आवेदन, साथ ही परिणामी प्रदर्शन लाभ, अच्छी तरह से प्रलेखित हैं (उदाहरण के लिए यह माइक्रोसॉफ्ट रिसर्च रिपोर्ट देखें )। इसका व्यावहारिक महत्व यह है कि, बशर्ते आप 'मुख्यधारा' की भाषा का उपयोग कर रहे हों (उदाहरण के लिए, 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 पड़ोसियों के लिए, एक बार प्रत्येक पड़ोसी के बीच की दूरी में परीक्षण बिंदु। यह फ़ंक्शन प्रत्येक पड़ोसी के लिए वजन लौटाएगा, जो तब भारित औसत गणना में उस पड़ोसी के गुणांक के रूप में उपयोग किया जाता है।