İstatistiki Öğrenim Unsurlarından en yakın k sınıf komşu sınıflayıcısının karar sınırı nasıl çizilir?


31

Trevor Hastie ve Robert Tibshirani & Jerome Friedman'ın ElemStatLearn "İstatistiksel Öğrenmenin Öğeleri: Veri Madenciliği, Çıkarım ve Tahmin. İkinci Basım" kitabında açıklanan grafiği oluşturmak istiyorum. Arsa:

görüntü tanımını buraya girin

Bu kesin grafiği nasıl üretebileceğimi merak ediyorum R, özellikle sınır grafiğini ve ızgara grafiklerini ve hesaplamalarını not edin.



1
@Tastas: evet, öyle. Arsa nasıl oluşturulur? Lütfen yardım eder misin? Çok teşekkürler!
littleEinstein

Yanıtlar:


35

Bu rakamı çoğaltmak için, sisteminizde ElemStatLearn paketinin kurulu olması gerekir . Yapay veri seti mixture.example()@StasK tarafından belirtildiği gibi üretildi.

library(ElemStatLearn)
require(class)
x <- mixture.example$x
g <- mixture.example$y
xnew <- mixture.example$xnew
mod15 <- knn(x, xnew, g, k=15, prob=TRUE)
prob <- attr(mod15, "prob")
prob <- ifelse(mod15=="1", prob, 1-prob)
px1 <- mixture.example$px1
px2 <- mixture.example$px2
prob15 <- matrix(prob, length(px1), length(px2))
par(mar=rep(2,4))
contour(px1, px2, prob15, levels=0.5, labels="", xlab="", ylab="", main=
        "15-nearest neighbour", axes=FALSE)
points(x, col=ifelse(g==1, "coral", "cornflowerblue"))
gd <- expand.grid(x=px1, y=px2)
points(gd, pch=".", cex=1.2, col=ifelse(prob15>0.5, "coral", "cornflowerblue"))
box()

Son üç komut dışında hepsi çevrimiçi yardımdan gelir mixture.example. Çıktısını ilk önce expand.griddeğiştirerek ayarlayacağımız gerçeğini kullandığımızı not edin x, bu da prob15matrisde (69x99 boyutunda ) renklerin indekslenmesini ( sütunlara göre) sağlar; bu, her kafes koordinatı için kazanan sınıfın oy oranını tutar. px1, px2).

görüntü tanımını buraya girin


+1. Teşekkürler! Ayrıca, "kâhiyi açığa çıkarma" metninde açıklanan şekilde nasıl üretileceğini de merak ediyorum. Web sitesindeki verileri kullanmak yerine, lütfen bunu da ekler misiniz?
littleEinstein

@littleEinstein Online yardımda neyin verildiğini kastediyorsunuz mixture.example? # Reproducing figure 2.4, page 17 of the book:Örnek bölümde başlayan çizginin altındaki simülasyon kurulumuna bakın.
chl

Lütfen bağlantıyı bana bildirir misiniz? Onu bulamıyorum.
littleEinstein

Üzgünüm, LittleEinstein, ama muhtemelen kaçırdığım bir şey var. Bu sadece yazarak help(mixture.example)veya example(mixture.example)R komut isteminde (gerekli paketi yükledikten sonra) söz konusudur library(ElemStatLearn). Yapay veri setini üretecek kod (Şekil 2.4'ü oluşturmamak için) Örnek bölümünde düz R ile yazılmıştır.
chl

1
BTW, az önce @ Shane'nin ggplotbenzer bir amaç için kullandığı web günlüğüne rastladım . Şuna bakın : ESL 2.1: Doğrusal Regresyon - KNN .
chl

7

ESL'yi kendi kendine öğreniyorum ve kitapta verilen tüm örnekler üzerinde çalışmaya çalışıyorum. Ben sadece bunu yaptım ve aşağıdaki R kodunu kontrol edebilirsiniz:

library(MASS)
# set the seed to reproduce data generation in the future
seed <- 123456
set.seed(seed)

# generate two classes means
Sigma <- matrix(c(1,0,0,1),nrow = 2, ncol = 2)
means_1 <- mvrnorm(n = 10, mu = c(1,0), Sigma)
means_2 <- mvrnorm(n = 10, mu = c(0,1), Sigma)

# pick an m_k at random with probability 1/10
# function to generate observations
genObs <- function(classMean, classSigma, size, ...)
{
  # check input
  if(!is.matrix(classMean)) stop("classMean should be a matrix")
  nc <- ncol(classMean)
  nr <- nrow(classMean)
  if(nc != 2) stop("classMean should be a matrix with 2 columns")
  if(ncol(classSigma) != 2) stop("the dimension of classSigma is wrong")

  # mean for each obs
    # pick an m_k at random
  meanObs <- classMean[sample(1:nr, size = size, replace = TRUE),]
  obs <- t(apply(meanObs, 1, function(x) mvrnorm(n = 1, mu = x, Sigma = classSigma )) )
  colnames(obs) <- c('x1','x2')
  return(obs)
}


obs100_1 <- genObs(classMean = means_1, classSigma = Sigma/5, size = 100)
obs100_2 <- genObs(classMean = means_2, classSigma = Sigma/5, size = 100)

# generate label
y <- rep(c(0,1), each = 100)

# training data matrix
trainMat <- as.data.frame(cbind(y, rbind(obs100_1, obs100_2)))

# plot them
library(lattice)
with(trainMat, xyplot(x2 ~ x1,groups = y, col=c('blue', 'orange')))

# now fit two models

# model 1: linear regression
lmfits <- lm(y ~ x1 + x2 , data = trainMat)

# get the slope and intercept for the decision boundary
intercept <- -(lmfits$coef[1] - 0.5) / lmfits$coef[3]
slope <- - lmfits$coef[2] / lmfits$coef[3]

# Figure 2.1
xyplot(x2 ~ x1, groups = y, col = c('blue', 'orange'), data = trainMat,
       panel = function(...)
       {
        panel.xyplot(...)
        panel.abline(intercept, slope)
        },
       main = 'Linear Regression of 0/1 Response')    

# model2: k nearest-neighbor methods
library(class)
# get the range of x1 and x2
rx1 <- range(trainMat$x1)
rx2 <- range(trainMat$x2)
# get lattice points in predictor space
px1 <- seq(from = rx1[1], to = rx1[2], by = 0.1 )
px2 <- seq(from = rx2[1], to = rx2[2], by = 0.1 )
xnew <- expand.grid(x1 = px1, x2 = px2)

# get the contour map
knn15 <- knn(train = trainMat[,2:3], test = xnew, cl = trainMat[,1], k = 15, prob = TRUE)
prob <- attr(knn15, "prob")
prob <- ifelse(knn15=="1", prob, 1-prob)
prob15 <- matrix(prob, nrow = length(px1), ncol = length(px2))

# Figure 2.2
par(mar = rep(2,4))
contour(px1, px2, prob15, levels=0.5, labels="", xlab="", ylab="", main=
    "15-nearest neighbour", axes=FALSE)
points(trainMat[,2:3], col=ifelse(trainMat[,1]==1, "coral", "cornflowerblue"))
points(xnew, pch=".", cex=1.2, col=ifelse(prob15>0.5, "coral", "cornflowerblue"))
box()

1
Bunu yapmadan buraya kod girmek için, kod olan metni vurgulayabilir ve ardından sayfanın üst kısmındaki "kod" düğmesini tıklayabilirsiniz. Bir dizi ikon / düğme içinde. Bir kod parantez gibi görünüyor.
Peter Flom - Monica'yı yeniden konumlandırın

Re: "bir R kodu bloğunun nasıl yapıştırılacağı". Yayınınızı düzenlerken küçük bir menü çubuğuna erişebilirsiniz .
chl

Ayrıca, kod bloklarını kolayca girintiye sokabilen bir düzenleyici kullanmıyorsanız, bir tanesine geçmekten mutlu olacağınızı düşünüyorum. Örneğin Rstudio yapabildiğiniz vim, kod seçme ve sekme girintiler bastırarak 5>>vb
Mark
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.