Schleife for

Fragen, die sich auf kein spezielles Verfahren beziehen.

Schleife for

Beitragvon domos » Di 26. Jun 2012, 09:40

Hallo,
ich habe folgende Daten: (Bsp aus Wikipedia: http://en.wikipedia.org/wiki/Naive_Bayes_classifier)

data: Height, weight and foot size of 4 males and 4 females
Task: predict sex of new sample

C <- rep(c("male", "female"), each=4)
X <- data.frame(height= c(6, 5.92, 5.58, 5.92, 5, 5.5, 5.42, 5.75)
weight=c(180, 190, 170, 165, 100, 150, 130, 150)
foot =c(12, 11, 12, 10, 6, 8, 7, 9))

Jetzt möchte ich mithilfe einer Schleife immer sieben dieser Proben einlesen und anhand der achten soll R vorhersagen, ob es sich um einen Mann oder eine Frau handelt. Dies möchte ich mit allen 8 Proben machen, sodass 8 mal vorhergesagt wird, ob es sich um einen Mann oder eine Frau handelt.

Ich hatte mir das etwa so überlegt:

res <- character(8)
for (i in 1:8) {
res[i] <- predictNaiveBayes(X = X[-i,], C = C[-i], D = X[i, ])
predictNaiveBayes(X,C,prior = c(male = 0.5, female = 0.5),D=rbind(D))
}
dann kommt allerdings die Fehlermeldung: :(
Error in dnorm(x, mean, sd, log) :
Non-numeric argument to mathematical function

Kann mir jemand weiterhelfen und sagen wo mein Fehler liegt, bzw was ich verbessern muss?
Liebe Grüße
domos
domos
Grünschnabel
Grünschnabel
 
Beiträge: 2
Registriert: Di 26. Jun 2012, 09:14
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Schleife for

Beitragvon domos » Di 26. Jun 2012, 09:41

hier ist noch mein Code
Code: Alles auswählen
naiveLikelihood <− function(X,C,D)
{
nclass <− length(unique(C))
## compute mean and sd as a function of C
C.mean <− apply(X,2,function(x)tapply(x,C,mean))
C.sd <− apply(X,2,function(x)tapply(x,C,sd))
like.class <− numeric(nclass)
for(i in 1:nclass)
like.class[i] <− sum(dnorm(D, C.mean[i,],C.sd[i,], log = TRUE))
names(like.class) <− rownames(C.mean)
return(like.class)
}
predictNaiveBayes <− function(X,C,prior = table(C)/length(C),D)
{
## normalize prior and take log
prior <− prior/sum(prior)
logprior <− log(prior)
res <− character(nrow(D))
for(i in 1:nrow(D)){
## compute log−likelihoods
loglike <− naiveLikelihood(X,C,D[i,])
## compute log−posterior probabilities
logprior <− logprior[match(names(loglike), # same order as like
names(logprior))]
logpost <− loglike + logprior
## return class with highest posterior probability
res[i] <− names(loglike)[order(logpost,decreasing = TRUE)][1]
}
return(res)
}
domos
Grünschnabel
Grünschnabel
 
Beiträge: 2
Registriert: Di 26. Jun 2012, 09:14
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post


Zurück zu Allgemeine Fragen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste