निरंतर और बाइनरी चर के साथ के-निकटतम-पड़ोसी


10

मेरे पास कॉलम a b c(3 विशेषताओं) के साथ एक डेटा सेट है । aजबकि संख्यात्मक और निरंतर है bऔर cदो स्तरों के साथ प्रत्येक श्रेणीबद्ध हैं। मैं वर्गीकृत करने के लिए aऔर bपर K- निकटतम पड़ोसियों विधि का उपयोग कर रहा हूँ c। इसलिए, दूरियों को मापने में सक्षम होने के लिए मैं अपने डेटा सेट को हटाकर bऔर जोड़कर परिवर्तित करता हूं b.level1और b.level2। यदि अवलोकन श्रेणियों iमें पहला स्तर है b, b.level1[i]=1और b.level2[i]=0

अब मैं अपने नए डेटा सेट में दूरी को माप सकता हूं: a b.level1 b.level2

सैद्धांतिक / गणितीय दृष्टिकोण से: क्या आप बाइनरी और निरंतर डेटा दोनों के साथ K-निकटतम पड़ोसी (KNN) का प्रदर्शन कर सकते हैं?

मैं FNNआर और फ़ंक्शन में पैकेज का उपयोग कर रहा हूंknn()


मेरे पास कोई KNN अनुभव नहीं है, लेकिन मैं यह नहीं देखता कि द्विआधारी चर दूरियों को स्थापित करने में कितना मददगार होगा। मैं उत्सुक हूं कि आप इस दृष्टिकोण की ओर क्यों झुक रहे हैं।
rolando2

क्योंकि मुझे संख्यात्मक चर की तुलना करने के लिए एक बेहतर तरीका नहीं दिखता है। बेहतर दृष्टिकोण का सुझाव देने के लिए स्वतंत्र महसूस करें :)
k.dkhk

जवाबों:


11

यह श्रेणीबद्ध और निरंतर चर (सुविधाओं) का संयोजन ठीक है।

किसी तरह, k-NN जैसी विधि के लिए बहुत सैद्धांतिक जमीन नहीं है। अनुमानी यह है कि यदि दो बिंदु एक-दूसरे (कुछ दूरी के अनुसार) के करीब हैं, तो उनके पास आउटपुट के संदर्भ में सामान्य रूप से कुछ है। शायद हां, शायद नहीं। और यह आपके द्वारा उपयोग की जाने वाली दूरी पर निर्भर करता है।

अपने उदाहरण में आप दो बिंदुओं और बीच की दूरी को परिभाषित करते हैं :(,,सी)(',',सी')

  • और :: बीच का वर्ग दूरी लें'(-')2
  • +2 जोड़ें यदि और भिन्न हैं, +0 यदि समान है (क्योंकि आप प्रत्येक श्रेणी के लिए 1 का अंतर गिनाते हैं)'
  • +2 जोड़ें अगर और अलग हैं, +0 बराबर है (समान)सीसी'

यह प्रत्येक विशेषता को वज़न देने से मेल खाती है।

ध्यान दें कि यदि बड़ा विचरण के साथ (1000, 2000 ...) की तरह बड़े मूल्यों लेता है तो द्विआधारी सुविधाओं के वजन के वजन की तुलना में नगण्य हो जाएगा । केवल और बीच की दूरी वास्तव में मायने रखेगी। और दूसरी तरह के आसपास: यदि 0.001 जैसे छोटे मूल्यों लेता है: केवल बाइनरी सुविधाओं में रखा जाएगा।'

आप रिवाइजिंग करके व्यवहार को सामान्य कर सकते हैं: प्रत्येक सुविधा को उसके मानक विचलन द्वारा विभाजित करना। यह निरंतर और द्विआधारी चर दोनों पर लागू होता है। आप अपना पसंदीदा वजन भी प्रदान कर सकते हैं।

ध्यान दें कि R फ़ंक्शन kNN () आपके लिए करता है: https://www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN

पहले प्रयास के रूप में, बस मूल रूप से आदर्श = सही (सामान्यीकरण) का उपयोग करें। यह सबसे अधिक गैर-समझ से बचना होगा जो निरंतर और श्रेणीबद्ध विशेषताओं को जोड़ते समय प्रकट हो सकता है।


अच्छा उत्तर (+1), हालांकि, आप यह उल्लेख कर सकते हैं कि यदि आयाम अधिक है, और कई असतत चर हैं, यूक्लिडियन दूरी के साथ knn अच्छी तरह से काम नहीं कर सकता है।
हायतौ डू

6

हां, आप निश्चित रूप से बाइनरी और निरंतर डेटा दोनों के साथ KNN का उपयोग कर सकते हैं, लेकिन कुछ महत्वपूर्ण विचार हैं जो आपको ऐसा करते समय पता होना चाहिए।

नीचे दिए गए उदाहरण के अनुसार, परिणाम वास्तविक परिणाम के फैलाव (0-1 स्केल किए गए, बिना कटे वैक्टर) के बीच फैलाव के सापेक्ष बाइनरी स्प्लिट्स द्वारा बहुत अधिक सूचित किए जाने वाले हैं:

वास्तविक-मूल्यवान और द्विआधारी चर का पृथक्करण

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

इसके अलावा, यह कई बाइनरी वैरिएबल्स तक फैली हुई है- अगर हम वास्तविक-वैल्यूएबल वेरिएबल्स में से एक को बाइनरी में बदलते हैं, तो हम देख सकते हैं कि वास्तविक वैल्यूज़ की समीपता की तुलना में शामिल सभी बाइनरी वैरिएबल्स पर मेल करके दूरियों को अधिक सूचित किया जाएगा:

वास्तविक-मूल्यवान और द्विआधारी चर का पृथक्करण

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

#code to reproduce plots:
library(scatterplot3d) 

scalevector <- function(x){(x-min(x))/(max(x)-min(x))}

x <- scalevector(rnorm(100))
y <- scalevector(rnorm(100))
z <- ifelse(sign(rnorm(100))==-1, 0, 1)
df <- data.frame(cbind(x,y,z))

scatterplot3d(df$x, df$z, df$y, pch=16, highlight.3d=FALSE,
              type="h", angle =235, xlab='', ylab='', zlab='')

x <- scalevector(rnorm(100))
y <- ifelse(sign(rnorm(100))==-1, 0, 1)
z <- ifelse(sign(rnorm(100))==-1, 0, 1)
df <- data.frame(cbind(x,y,z))

scatterplot3d(df$x, df$z, df$y, pch=16, highlight.3d=FALSE,
              type="h", angle =235, xlab='', ylab='', zlab='')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.