簡體   English   中英

K均值:初始中心並不明顯

[英]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,請參閱例如:

  1. Bashar Al-Shboul,Myaeng Sung-Hyon,“使用遺傳算法初始化K均值”,世界科學,工程與技術研究院,2009年6月,第30期,p。 114 ,(特別是第二節B); 要么
  2. BAIN KHUSUL KHOTIMAH,FIRLI IRHAMNI和TRI SUNDARWATI,“中小企業優化初始中心K-MEANS聚類的遺傳算法”,理論與應用信息技術期刊,2016,Vol。 90號,1號

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM