我正在使用GA Package,我的目標是找到k-means聚類算法的最佳初始質心位置。我的數據是在TF-IDF得分的話稀疏矩陣和可下載here.下面是一些我已經實現了階段:K-means:初始中心並不明顯
0庫和數據集
library(clusterSim) ## for index.DB()
library(GA) ## for ga()
corpus <- read.csv("Corpus_EnglishMalay_tfidf.csv") ## a dataset of 5000 x 1168
1.二進制編碼並生成初始種羣。
k_min <- 15
initial_population <- function(object) {
## generate a population to turn-on 15 cluster bits
init <- t(replicate([email protected], sample(rep(c(1, 0), c(k_min, [email protected] - k_min))), TRUE))
return(init)
}
2.健身功能最大限度地減少戴維斯 - 爾丁(DB)指數。我在哪裏評估從
initial_population
生成的每個解決方案的DBI。
DBI2 <- function(x) {
## x is a vector of solution of nBits
## exclude first column of corpus
initial_centroid <- corpus[x==1, -1]
cl <- kmeans(corpus[-1], initial_centroid)
dbi <- index.DB(corpus[-1], cl=cl$cluster, centrotypes = "centroids")
score <- -dbi$DB
return(score)
}
3.運行GA。使用這些設置。
g2<- ga(type = "binary",
fitness = DBI2,
population = initial_population,
selection = ga_rwSelection,
crossover = gabin_spCrossover,
pcrossover = 0.8,
pmutation = 0.1,
popSize = 100,
nBits = nrow(corpus),
seed = 123)
4.問題。 kmeans(語料庫[-1],initial_centroid)中的錯誤:初始中心不明確。
我發現了一個類似的問題here,其中用戶還必須使用一個參數動態傳遞要使用的簇數。這是通過硬編碼簇的數量來解決的。但是對於我的情況,我確實需要動態傳遞簇的數量,因爲它是從隨機生成的二進制向量中進入的,其中那些1's
將表示初始質心。
與kmeans()
code檢查,我注意到,錯誤是由重複的中心造成的:
if(any(duplicated(centers)))
stop("initial centers are not distinct")
我編輯的kmeans
功能與trace
打印出複製中心。輸出:
[1] "206" "520" "564" "1803" "2059" "2163" "2652" "2702" "3195" "3206" "3254" "3362" "3375"
[14] "4063" "4186"
這都說明在隨機選擇initial_centroids
沒有重複,我不知道爲什麼這個錯誤持續發生。還有什麼會導致這個錯誤?
P/S:我明白有些人可能會建議GA + K-means並不是一個好主意。但我希望能完成我已經開始的工作。最好把這個問題看作K均值問題(至少在解決initial centers are not distinct
錯誤時)。
我在這個問題總初學者,你能解釋更多關於「初始化種子互動太多」?這是什麼造成了「初始中心不明顯」的問題?並感謝您就如何消除不良染色體的建議,這對我來說是新的! –