K-means:初始中心不明显

时间:2017-02-15 13:35:55

标签: r optimization sparse-matrix k-means genetic-algorithm

我正在使用GA Package,我的目标是找到k-means聚类算法的最佳初始质心位置。我的数据是TF-IDF得分中的稀疏矩阵,可以下载here.以下是我实施的一些阶段:

  

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):初始中心不是明显的。

我发现了类似的问题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-means问题(至少在解决initial centers are not distinct错误时)。

2 个答案:

答案 0 :(得分:4)

遗传算法不适合根据问题的性质来优化k均值 - 初始化种子相互作用太多,ga不会比随机取样所有可能的种子更好。

所以我的主要建议是不要在这里使用遗传算法!

如果你坚持,你需要做的是检测不良参数,然后简单地为坏初始化返回一个坏分数,这样他们就不会“活下来”。

答案 1 :(得分:2)

要回答您的问题,请执行以下操作:

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, "Initializing K-Means using Genetic Algorithms", World Academy of Science, Engineering & Technology, Jun2009, Issue 30, p. 114,(特别是第二节B);或
  2. BAIN KHUSUL KHOTIMAH, FIRLI IRHAMNI, AND TRI SUNDARWATI, "A GENETIC ALGORITHM FOR OPTIMIZED INITIAL CENTERS K-MEANS CLUSTERING IN SMEs", Journal of Theoretical and Applied Information Technology, 2016, Vol. 90, No. 1