2017-07-11 5 views
1

Ich bin ein Neuling im Bereich Partikelschwarmoptimierung. Ich habe eine Forschungsarbeit über Clustering gelesen, die auf PSO und K-Means basiert, aber ich habe kein funktionierendes Beispiel dafür gefunden. Jede Art von Hilfe wird sehr geschätzt. Danke im Voraus!PSO- und K-basiertes Textdokument-Clustering in R

Ich möchte Textdokument-Clustering mit PSO und K-Mittel in R durchführen. Ich habe die Grundidee, dass erste PSO mir die optimierten Werte der Clusterschwerpunkte geben wird, dann muss ich diese optimierten Wert der Clusterschwerpunkte verwenden von PSO als anfänglichem Clusterschwerpunkt für k - bedeutet, Cluster von Dokumenten zu erhalten.

Unten sind die Codes, die beschreiben, was ich bisher gemacht habe!

#Import library 
library(pdist) 
library(hydroPSO) 

#Create matrix and suppose it is our document term matrix which we get after 
the cleaning of corpus 

(In meinem aktuellen Daten habe ich 20 Dokumente mit 951 Begriffen heißt dim (dtm) = 20 * 951)

matri <- matrix(data = seq(1, 20, 1), nrow = 4, ncol = 7, byrow = TRUE) 
matri 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
[1,] 1 2 3 4 5 6 7 
[2,] 8 9 10 11 12 13 14 
[3,] 15 16 17 18 19 20 1 
[4,] 2 3 4 5 6 7 8 

#Initially select first and second row as centroids 
cj <- matri[1:2,] 

#Calculate Euclidean Distance of each data point from centroids 
vm <- as.data.frame(t(as.matrix(pdist(matri, cj)))) 
vm 
    V1  V2  V3  V4 
1 0.00000 18.52026 34.81379 2.645751 
2 18.52026 0.00000 21.51744 15.874508 

#Create binary matrix S in which 1 means Instance Ii is allocated to the cluster Cj otherwise 0. 
S <- matrix(data = NA, nrow = nrow(vm), ncol = ncol(vm)) 

for(i in 1:nrow(vm)){ 
    for(j in 1:ncol(vm)){ 
     cd <- which.min(vm[, j]) 
     ifelse(cd==i, S[i,j] <-1, S[i,j] <-0) 

    } 
    } 

S 
     [,1] [,2] [,3] [,4] 
[1,] 1 0 0 1 
[2,] 0 1 1 0 

#Apply `hydroPSO()` to get optimised values of centroids. 
set.seed(5486) 
D <- 4 # Dimension 
lower <- rep(0, D) 
upper <- rep(10, D) 
m_s <- matrix(data = NA, nrow = nrow(S), ncol = ncol(matri)) 
Fn= function(y) { #Objective Function which has to be minimised 

for(j in 1:ncol(matri)){ 
    for(i in 1:nrow(matri)){ 
     for(k in 1:nrow(y)){ 
      for(l in 1:ncol(y)){ 
       m_s[k,] <- colSums(matri[y[k,]==1,])/sum(y[k,]) 
      } 
     } 
    } 
} 

    sm <- sum(m_s)/ nrow(S) 
    return(sm) 

    } 

hh1 <- hydroPSO(S,fn=Fn, lower=lower, upper=upper, 
       control=list(write2disk=FALSE, npart=3)) 

Aber die oben hydroPSO() Funktion nicht funktioniert. Es gibt Fehler Fehler in 1: nrow (y): Argument der Länge 0. Ich habe danach gesucht, aber keine Lösung gefunden, die für mich funktioniert.

Ich habe auch einige Änderungen in meiner Zielfunktion und dieses Mal hydroPSO() gearbeitet, aber ich denke nicht richtig. Ich übergebe meine anfängliche Zentroidmatrix als einen Parameter, dessen Dimension 2 * 7 ist, aber die Funktion gibt nur 1 * 7 optimierte Werte zurück. Ich verstehe seinen Grund nicht.

set.seed(5486) 
D <- 7# Dimension 
lower <- rep(0, D) 
upper <- rep(10, D) 

Fn = function(x){ 
vm <- as.data.frame(t(as.matrix(pdist(matri, x)))) 

S <- matrix(data = NA, nrow = nrow(vm), ncol = ncol(vm)) 

for(i in 1:nrow(vm)){ 
    for(j in 1:ncol(vm)){ 
     cd <- which.min(vm[, j]) 
     ifelse(cd==i, S[i,j] <-1, S[i,j] <-0) 

    } 
    } 

    m_s <- matrix(data = NA, nrow = nrow(S), ncol = ncol(matri)) 

for(j in 1:ncol(matri)){ 
    for(i in 1:nrow(matri)){ 
     for(k in 1:nrow(S)){ 
      for(l in 1:ncol(S)){ 
       m_s[k,] <- colSums(matri[S[k,]==1,])/sum(S[k,]) 
      } 
     } 
    } 
    } 

sm <- sum(m_s)/ nrow(S) 
return(sm) 

} 
hh1 <- hydroPSO(cj,fn=Fn, lower=lower, upper=upper, 
        control=list(write2disk=FALSE, npart=2, K=2)) 

Ausgabe der obigen Funktion.

## $par 
## Param1 Param2 Param3 Param4 Param5 Param6 Param7 
## 8.6996174 2.1952303 5.6903588 0.4471795 3.7103161 1.6605425 8.2717574 
## 
## $value 
## [1] 61.5 
## 
## $best.particle 
## [1] 1 
## 
## $counts 
## function.calls  iterations regroupings 
##   2000   1000    0 
## 
## $convergence 
## [1] 3 
## 
## $message 
## [1] "Maximum number of iterations reached" 

Ich glaube, ich Parameter in einer falschen Weise zum hydroPSO() bin vorbei. Bitte korrigieren Sie mich, wo ich es falsch mache.

Vielen Dank!

Antwort

0

Statt cj-hydroPSO() der Weitergabe verwendete ich as.vector (t (cj)) in meinem zweiten Ansatz und es funktionierte gut für mich. Ich habe 14 optimierte Werte