2014-05-07 10 views
6

Spero che tu possa aiutarmi con il mio problema. Sto cercando di individuare i valori anomali con l'uso dell'algoritmo kmeans. Per prima cosa eseguo l'algoritmo e scelgo quegli oggetti come possibili valori anomali che hanno una grande distanza dal loro centro del cluster. Invece di utilizzare la distanza assoluta, voglio utilizzare la distanza relativa, vale a dire la razione della distanza assoluta dell'oggetto rispetto al centro del cluster e la distanza media di tutti gli oggetti del cluster rispetto al centro del cluster. Il codice per il rilevamento dei valori anomali in base alla distanza assoluta è la seguente:Rilevamento anomalie con algoritmo k-means

# remove species from the data to cluster 
iris2 <- iris[,1:4] 
kmeans.result <- kmeans(iris2, centers=3) 
# cluster centers 
kmeans.result$centers 
# calculate distances between objects and cluster centers 
centers <- kmeans.result$centers[kmeans.result$cluster, ] 
distances <- sqrt(rowSums((iris2 - centers)^2)) 
# pick top 5 largest distances 
outliers <- order(distances, decreasing=T)[1:5] 
# who are outliers 
print(outliers) 

Ma come posso utilizzare il relativo posto della distanza assoluta di trovare valori anomali?

+2

Questa domanda sembra essere fuori argomento, perché si tratta di statistiche – csgillespie

risposta

7

Hai solo bisogno di calcolare la distanza media ogni osservazione è dal suo cluster. Hai già queste distanze, quindi devi solo fare una media. Poi il resto è semplice divisione indicizzato:

# calculate mean distances by cluster: 
m <- tapply(distances, kmeans.result$cluster,mean) 

# divide each distance by the mean for its cluster: 
d <- distances/(m[kmeans.result$cluster]) 

I suoi valori erratici:

> d[order(d, decreasing=TRUE)][1:5] 
     2  3  3  1  3 
2.706694 2.485078 2.462511 2.388035 2.354807