Exercice 2.2 des éléments de l'apprentissage statistique

10

Le manuel génère d'abord des données à 2 classes via:

entrez la description de l'image ici entrez la description de l'image ici

qui donne:

entrez la description de l'image ici

puis il demande:

entrez la description de l'image ici

J'essaie de résoudre cela en modélisant d'abord cela avec ce modèle graphique:

entrez la description de l'image ici

où est l'étiquette, est l'indice de la moyenne sélectionnée , et est le point de données. Cela donnerach(1h10)mhcx

Pr(xmhc)=N(mhc,I/5)Pr(mhch,c=blue)=N((1,0)T,I)Pr(mhch,c=orange)=N((0,1)T,I)Pr(h)=110Pr(c)=12

D'un autre côté, la frontière est . Avec la règle bayésienne, nous avons{x:Pr(c=bluex)=Pr(c=orangex)}

Pr(cX)=Pr(Xc)Pr(c)cPr(Xc)Pr(c)Pr(Xc)=hmhcPr(h)Pr(mhch,c)Pr(Xmhc)

Mais plus tard, j'ai trouvé que le réglage du problème est symétrique, ce qui peut donner comme limite. Si le problème consiste à demander la frontière lorsque sont conditionnés, l'équation comprendra paramètres qui, je pense, ne sont probablement pas le but de l'exercice.X=ymhc40

Alors, est-ce que je comprends mal quelque chose? Je vous remercie.

ziyuang
la source

Réponses:

8

Je ne pense pas que vous soyez censé trouver une expression analytique pour la limite de décision de Bayes, pour une réalisation donnée des . De même, je doute que vous soyez censé obtenir la frontière sur la distribution du , car ce n'est que par symétrie comme vous l'avez noté.mkmkX=y

Je pense que ce dont vous avez besoin est de montrer est un programme qui peut calculer la frontière de décision pour une réalisation donnée des . Cela peut être fait en établissant une grille de valeurs et , en calculant les densités conditionnelles de classe et en trouvant les points où elles sont égales.mkXy

Ce code est un coup de couteau. IIRC il y a en fait du code pour calculer la frontière de décision dans Modern Applied Statistics avec S , mais je n'ai pas encore cette information à portée de main.

# for dmvnorm/rmvnorm: multivariate normal distribution
library(mvtnorm)

# class-conditional density given mixture centers
f <- function(x, m)
{
    out <- numeric(nrow(x))
    for(i in seq_len(nrow(m)))
        out <- out + dmvnorm(x, m[i, ], diag(0.2, 2))
    out
}

# generate the class mixture centers
m1 <- rmvnorm(10, c(1,0), diag(2))
m2 <- rmvnorm(10, c(0,1), diag(2))
# and plot them
plot(m1, xlim=c(-2, 3), ylim=c(-2, 3), col="blue")
points(m2, col="red")

# display contours of the class-conditional densities
dens <- local({
    x <- y <- seq(-3, 4, len=701)
    f1 <- outer(x, y, function(x, y) f(cbind(x, y), m1))
    f2 <- outer(x, y, function(x, y) f(cbind(x, y), m2))
    list(x=x, y=y, f1=f1, f2=f2)
})

contour(dens$x, dens$y, dens$f1, col="lightblue", lty=2, levels=seq(.3, 3, len=10),
        labels="", add=TRUE)

contour(dens$x, dens$y, dens$f2, col="pink", lty=2, levels=seq(.3, 3, len=10),
        labels="", add=TRUE)

# find which points are on the Bayes decision boundary
eq <- local({
    f1 <- dens$f1
    f2 <- dens$f2
    pts <- seq(-3, 4, len=701)
    eq <- which(abs((dens$f1 - dens$f2)/(dens$f1 + dens$f2)) < 5e-3, arr.ind=TRUE)
    eq[,1] <- pts[eq[,1]]
    eq[,2] <- pts[eq[,2]]
    eq
})
points(eq, pch=16, cex=0.5, col="grey")


Résultat:

entrez la description de l'image ici

Hong Ooi
la source
3

En fait, le livre ne demande de fournir une solution analytique à ce problème. Et oui, il faut conditionner la frontière, mais pas sur les 40 moyens: on ne les connaît jamais précisément. Au lieu de cela, vous devez conditionner les 200 points de données que vous voyez. Vous aurez donc besoin de 200 paramètres, mais en raison de l'utilisation de la sommation, la réponse ne semble pas trop compliquée.

Je ne serais jamais en mesure de dériver cette formule, donc je ne prends que le mérite de réaliser que la solution analytique n'a pas à être laide et de la rechercher ensuite sur Google. Heureusement, il est fourni par les auteurs de belles personnes, pages 6-7 .

max
la source
2

Je souhaite que je suis tombé sur le code ci-dessus plus tôt; vient de créer un code alternatif ci-dessous ... pour ce que ça vaut

set.seed(1)
library(MASS)

#create original 10 center points/means for each class 
I.mat=diag(2)
mu1=c(1,0);mu2=c(0,1)
mv.dist1=mvrnorm(n = 10, mu1, I.mat)
mv.dist2=mvrnorm(n = 10, mu2, I.mat)

values1=NULL;values2=NULL

#create 100 observations for each class, after random sampling of a center point, based on an assumed bivariate probability distribution around each center point  
for(i in 1:10){
  mv.values1=mv.dist1[sample(nrow(mv.dist1),size=1,replace=TRUE),]
  sub.mv.dist1=mvrnorm(n = 10, mv.values1, I.mat/5)
  values1=rbind(sub.mv.dist1,values1)
}
values1

#similar as per above, for second class
for(i in 1:10){
  mv.values2=mv.dist2[sample(nrow(mv.dist2),size=1,replace=TRUE),]
  sub.mv.dist2=mvrnorm(n = 10, mv.values2, I.mat/5)
  values2=rbind(sub.mv.dist2,values2)
}
values2

#did not find probability function in MASS, so used mnormt
library(mnormt)

#create grid of points
grid.vector1=seq(-2,2,0.1)
grid.vector2=seq(-2,2,0.1)
length(grid.vector1)*length(grid.vector2)
grid=expand.grid(grid.vector1,grid.vector2)



#calculate density for each point on grid for each of the 100 multivariates distributions
prob.1=matrix(0:0,nrow=1681,ncol=10) #initialize grid
for (i in 1:1681){
  for (j in 1:10){
    prob.1[i,j]=dmnorm(grid[i,], mv.dist1[j,], I.mat/5)  
  }
}
prob.1
prob1.max=apply(prob.1,1,max)

#second class - as per above
prob.2=matrix(0:0,nrow=1681,ncol=10) #initialize grid
for (i in 1:1681){
  for (j in 1:10){
    prob.2[i,j]=dmnorm(grid[i,], mv.dist2[j,], I.mat/5)  
  }
}
prob.2
prob2.max=apply(prob.2,1,max)

#bind
prob.total=cbind(prob1.max,prob2.max)
class=rep(1,1681)
class[prob1.max<prob2.max]=2
cbind(prob.total,class)

#plot points
plot(grid[,1], grid[,2],pch=".", cex=3,col=ifelse(class==1, "coral", "cornflowerblue"))

points(values1,col="coral")
points(values2,col="cornflowerblue")

#check - original centers
# points(mv.dist1,col="coral")
# points(mv.dist2,col="cornflowerblue")
user1885116
la source