Sürekli ve ikili değişkenli K-en yakın komşu


10

Ben sütunlar a b c(3 öznitelikleri) ile bir veri kümesi var . aise sayısal ve süreklidir bve ciki düzeyde her kategorik. Sınıflandırmak ave bdevam ettirmek için K-En yakın Komşular yöntemini kullanıyorum c. Yani, kaldırarak benim veri seti dönüşümü mesafeleri ölçmek için muktedir bve ekleme b.level1ve b.level2. Gözlem kategorilerinde iilk seviyeye sahipse ve .bb.level1[i]=1b.level2[i]=0

Şimdi yeni veri setimdeki mesafeleri ölçebilirim: a b.level1 b.level2

Teorik / matematiksel açıdan: K ve en yakın komşusunu (KNN) hem ikili hem de sürekli verilerle gerçekleştirebilir misiniz?

FNNR ve fonksiyonunda paket kullanıyorumknn()


Hiçbir KNN deneyimi var ama bir ikili değişken mesafeler oluşturmada nasıl çok yardımcı olacağını görmüyorum. Bu yaklaşıma neden eğildiğinizi merak ediyorum.
rolando2

Çünkü sayısal bir değişkeni kategorik bir değişkenle karşılaştırmanın daha iyi bir yolunu göremiyorum. Daha iyi bir yaklaşım önermekten çekinmeyin :)
k.dkhk

Yanıtlar:


11

Kategorik ve sürekli değişkenleri (özellikleri) birleştirmek sorun değil.

Her nasılsa, k-NN gibi bir yöntem için çok fazla teorik zemin yoktur. Buluşsal yöntem, eğer iki nokta birbirine yakınsa (bir mesafeye göre), o zaman çıktı açısından ortak bir şeyleri vardır. Belki evet belki hayır. Ve kullandığınız mesafeye bağlıdır.

Örneğinizde, iki nokta arasında bir mesafe tanımlarsınız (a,b,c) ve (a,b,c) gibi :

  • arasındaki kare mesafeyi al a ve a : (aa)2
  • Eğer +2 ekle b ve b farklı, eşitse +0 (çünkü her kategori için 1 farkını saydığınız için)
  • Eğer +2 ekle c ve c farklı, +0 eşittir (aynı)

Bu, her özelliğe dolaylı olarak ağırlık verilmesine karşılık gelir.

Unutmayın ki a büyük varyanslarla büyük değerler (1000, 2000 ... gibi) alırsa, ikili özelliklerin ağırlıkları, a. Sadece arasındaki mesafea ve agerçekten önemli olacak. Ve tam tersi: eğera 0.001 gibi küçük değerler alır: yalnızca ikili özellikler sayılır.

Yeniden tartarak davranışı normalleştirebilirsiniz: her özelliği standart sapmasına bölerek. Bu hem sürekli hem de ikili değişkenler için geçerlidir. Kendi tercih ettiğiniz ağırlıkları da sağlayabilirsiniz.

R fonksiyonunun kNN () sizin için yaptığını unutmayın: https://www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN

İlk denemede, sadece norm = true (normalleştirme) kullanın. Bu, sürekli ve kategorik özellikleri birleştirirken ortaya çıkabilecek anlamsızlıkların çoğunu önleyecektir.


iyi cevap (+1), ancak boyutun yüksek olup olmadığını ve Öklid mesafesiyle bilen çok sayıda farklı değişken olup olmadığını iyi anlamayabilirsiniz.
Haitao Du

6

Evet, KNN'yi kesinlikle ikili ve sürekli verilerle kullanabilirsiniz, ancak bunu yaparken dikkat etmeniz gereken bazı önemli noktalar vardır.

Sonuçlar, aşağıda gösterildiği gibi, gerçek değerli sonuçlar (0-1 ölçekli, ağırlıksız vektörler arasındaki) dağılımına göre ikili bölünmeler tarafından yoğun bir şekilde bilgilendirilecektir:

Reel değerli ve ikili değişkenlerin ayrılması

Bu örnekte, bireysel bir gözlemin mesafeye göre en yakın komşularının, ikili değişken tarafından ölçeklendirilmiş gerçek değer değişkeninden çok daha fazla bilgilendirileceğini görebilirsiniz.

Dahası, bu çoklu ikili değişkenlere uzanır - eğer gerçek değerli değişkenlerden birini ikilik olarak değiştirirsek, mesafelerin gerçek değerlerin yakınlığından ziyade ilgili tüm ikili değişkenlerle eşleştirerek çok daha fazla bilgi sahibi olacağını görebiliriz:

Reel değerli ve ikili değişkenlerin ayrılması

Yalnızca kritik ikili değişkenleri dahil etmek isteyeceksiniz; aslında "en yakın gerçek değerli değerlere sahip ikili değişkenlerin (eğer varsa) bu yapılandırmasıyla eşleşen tüm gözlemlerden mi soruyorsunuz?" Bu, KNN ile ele alınabilecek birçok sorunun makul bir formülasyonudur ve diğer sorunların çok zayıf bir formülasyonudur.

#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='')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.