[英]K-means: Initial centers are not distinct
我正在使用GA包 ,我的目標是找到k-means聚類算法的最佳初始質心位置。 我的數據是TF-IDF得分中的稀疏矩陣,可以在這里下載。 以下是我實施的一些階段:
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(object@popSize, sample(rep(c(1, 0), c(k_min, object@nBits - k_min))), TRUE))
return(init)
}
2.健身功能最小化Davies-Bouldin(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):初始中心不是明顯的。
我在這里發現了類似的問題,用戶還必須使用參數動態傳遞要使用的簇數。 它通過硬編碼簇的數量來解決。 但是對於我的情況,我真的需要動態傳遞簇的數量,因為它來自隨機生成的二進制向量,其中那些1's
將代表初始質心。
檢查kmeans()
代碼 ,我注意到錯誤是由重復的中心引起的:
if(any(duplicated(centers)))
stop("initial centers are not distinct")
我用trace
編輯了kmeans
函數來打印出重復的中心。 輸出:
[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
錯誤)。
遺傳算法不適合根據問題的性質優化k均值 - 初始化種子相互作用太多,ga不會比采用所有可能種子的隨機樣本更好。
所以我的主要建議是不要在這里使用遺傳算法!
如果你堅持,你需要做的是檢測不良參數,然后只是為壞初始化返回一個壞分數,這樣他們就不會“活下來”。
要回答你的問題,請:
any(corpus[520, -1] != corpus[564, -1])
您的520和564行corpus
是相同的,唯一的區別在於row.names
屬性,請參閱:
identical(colnames(corpus[520, -1]), colnames(corpus[564, -1])) # just to be sure
rownames(corpus[520, -1])
rownames(corpus[564, -1])
關於GA和k-means,請參閱例如:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.