2016-12-08 1 views
0

I, auf dem die folgenden PCA Daten haben tue ich Kmeans Clustering:Wie kann ich Clustering für verschiedene Cluster iterativ tun (k) -Werte

head(pcdffinal) 
     PC1   PC2  PC3  PC4   PC5  PC6 
1 -9.204228 -2.73517110 2.7975063 0.6794614 -0.84627095 0.4455297 
2 2.927245 0.05666389 0.5085896 0.1472800 0.18193152 0.1041490 
3 -4.667932 -1.98176361 2.2751862 0.5347725 -0.43314927 0.3222719 
4 -1.366505 -0.40858595 0.5005192 0.4507366 -0.54996933 0.5533013 
5 -4.689454 -2.77185636 2.4323856 0.7387788 0.49237229 -0.4817083 
6 -3.477046 -1.84904214 1.5539558 0.5463861 -0.03231143 0.2814843 

opt.cluster<-3 
set.seed(115) 
pccomp.km <- kmeans(pcdffinal,opt.cluster,nstart=25) 

head(pccomp.km$cluster) 
[1] 2 1 2 2 2 2 
barplot(table(pccomp.km$cluster), col="steelblue") 

enter image description here

pccomp.km$tot.withinss #For total within cluster sum of squares. 
[1] 13172.59 

Wir auch ein verwenden können Diagramm zur Veranschaulichung der Gruppen, in die die Daten eingeordnet wurden.

par(mfrow=c(1,1)) 
plot(pcdffinal[,1:2],col=(pccomp.km$cluster+1),main=paste('K-Means Clustering result with k = ', opt.cluster,sep=" "),pch=20,cex=2) 
points(pccomp.km$centers, pch=15,cex=2)#plotting the centres of the cluster as black squares 

enter image description here

library("factoextra") 
fviz_cluster(pccomp.km, data = pcdffinal, frame.type = "convex")+ theme_minimal() 

enter image description here

df.num_kmeans<-df.num 
df.num_kmeans$cluster.kmeans <- pccomp.km$cluster# is a vector of cluster assignment from kmeans() added as a column to the original dataset as 

diesem Datensatz zur weiteren Verwendung & KMeans Modell speichern

saveRDS(pccomp.km, "kmeans_model.RDS") 
write.csv(df.num_kmeans,"dfnum_kmeans.cluster.csv") 

library(cluster) 
clusplot(df.num_kmeans,pccomp.km$cluster,color = TRUE,shade=TRUE,labels = 2,lines = 0) 

enter image description here

library(ggfortify) 
autoplot(pccomp.km, data=pcdffinal, frame=TRUE,frame.type='norm') 

enter image description here

Ich möchte Kmeans für eine Reihe von Ks iterativ tun sagen k = 2: 6 jeweils Zeitdiagramme für den jeweiligen k sowie das Speichern der Modelle sowie die Daten zu machen als csv aber jeweils getrennt für verschiedene ks gemacht.

Benötigen Sie Hilfe bei der oben genannten Codes in einem iterativen mit dem Zähler konvertieren i von 2 bis 6.

Originaldaten gehen:

head(df.num_kmeans) 
    datausage  mou revenue calldrop handset2g handset3g smartphone 
1 896804.7 2854801 40830.404 27515  7930  19040  20810 
2 155932.1 419109 5512.498  5247  2325  2856  3257 
3 674983.3 2021183 25252.265 21068  6497  13056  14273 
4 522787.2 1303221 14547.380  8865  4693  9439  10746 
5 523465.7 1714641 24177.095 25441  8668  12605  14766 
6 527062.3 1651303 20153.482 18219  6822  11067  12994 
    rechargecount rechargesum  arpu subscribers 
1   4461  235430 197704.10  105822    
2   843  39820 34799.21  18210    
3   2944  157099 133842.38  71351    
4   2278  121697 104681.58  44975    
5   2802  144262 133190.55  75860    
6   2875  143333 119389.91  63740  

Mit Random Forest für Genauigkeit Vergleich

dfnum.kmeans <- read.csv("dfnum_kmeans.cluster.csv") 
table(dfnum.kmeans$cluster.kmeans) # size of each cluster 

konvertieren Cluster var in einen Faktor

dfnum.kmeans$cluster.kmeans <- as.factor(dfnum.kmeans$cluster.kmeans) 
is.factor(dfnum.kmeans$cluster.kmeans) 
Unter der Annahme, dass Ihre ursprüngliche Datenrahmen df.num ist, könnte die folgende speichern Sie alle Dateien (für verschiedene k-Werte)

Trainings- und Testsätze (75:25 split) mit ‚caret‘ Paket

set.seed(128) # for reproducibility 
inTrain_kmeans <- caret::createDataPartition(y = dfnum.kmeans$cluster.kmeans, p = 0.75, list = FALSE) 

training_kmeans <- dfnum.kmeans[inTrain_kmeans, ] 
testing_kmeans <- dfnum.kmeans[-inTrain_kmeans, ] 

set.seed(122) 
control <- trainControl(method = "repeatedcv", number = 10,allowParallel = TRUE)  
modFit.rfcaret_kmeans <- caret::train(cluster.kmeans~ ., method = "rf",data = training_kmeans, trControl = control, number = 25) 
modFit.rfcaret_kmeans$finalModel 
pred.test_kmeans = predict(modFit.rfcaret_kmeans, testing_kmeans); confusionMatrix(pred.test_kmeans, testing_kmeans$cluster.kmeans) 
confusionMatrix(pred.test_kmeans, testing_kmeans$cluster.kmeans)$overall[1] 
+0

können Sie Ihre Daten teilen? –

+0

@sandipan ... angehängt t Originaldaten - nur einige Zeilen ..... aber ich will kmeans auf PCA-Daten nach getan haben Feature-Reduktion – Nishant

Antwort

0

schaffen, in Ihr Arbeitsverzeichnis:

for (k in 2:6) { 
    set.seed(115) 
    pccomp.km <- kmeans(pcdffinal,k,nstart=25) 
    head(pccomp.km$cluster) 
    print(paste(k, pccomp.km$tot.withinss)) #For total within cluster sum of squares. 
    png(paste0('kmeans_proj_',k, '.png')) 
    par(mfrow=c(1,1)) 
    plot(pcdffinal[,1:2],col=(pccomp.km$cluster+1),main=paste('K-Means Clustering result with k = ', k,sep=" "),pch=20,cex=2) 
    points(pccomp.km$centers, pch=15,cex=2)#plotting the centres of the cluster as black squares 
    dev.off() 
    png(paste0('kmeans_fviz_',k, '.png')) 
    print(fviz_cluster(pccomp.km, data = pcdffinal, frame.type = "convex")+ theme_minimal()) 
    dev.off() 
    df.num_kmeans<-df.num 
    df.num_kmeans$cluster.kmeans <- pccomp.km$cluster# is a vector of cluster assignment from kmeans() added as a column to the original dataset as 
    saveRDS(pccomp.km, paste0("kmeans_model_", k, ".RDS")) 
    write.csv(df.num_kmeans,paste0("dfnum_kmeans_", k, ".cluster.csv")) 
    png(paste0('clusplot_',k, '.png')) 
    clusplot(df.num_kmeans,pccomp.km$cluster,color = TRUE,shade=TRUE,labels = 2,lines = 0) 
    dev.off() 
    png(paste0('autoplot_',k, '.png')) 
    print(autoplot(pccomp.km, data=pcdffinal, frame=TRUE,frame.type='norm')) 
    dev.off() 
} 
+0

@sandipan ...... Ich habe zusätzlich zufällige Wald laufen und herausgefunden die Genauigkeit für ein einzelnes k. (addierte Codes oben) ..... brauche einige Eingaben, wie ich es für k = 2: 6 ...... – Nishant