r - K-means:初始中心不明显

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

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

0. Libraries and dataset


library(clusterSim)           ## for index.DB()
library(GA)                   ## for ga() 

corpus <- read.csv("Corpus_EnglishMalay_tfidf.csv")     ## a dataset of 5000 x 1168

1. Binary encoding and generate initial population.


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. Fitness Function Minimizes Davies-Bouldin (DB) Index. Where I evaluate DBI for each solution generated from initial_population.


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. Running GA. With these settings.


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. The problem. Error in kmeans(corpus[-1], initial_centroid) : initial centers are not distinct`.



我发现了一个类似的问题 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 错误时如此)。

最佳答案

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

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

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

关于r - K-means:初始中心不明显,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42250899/

相关文章:

r - 模型使用 glm 但不是 bigglm

c# - CLR 中的数组边界检查消除?

php - CakePHP 2.2.0 多树重新排序性能

c++ - 内存交换或文件写入/读取

algorithm - 压缩稀疏行 (CSR) : How do you store empty rows?

r - 如何使用 R quanteda 以 LIWC 字典格式导出字典

r - 在执行过程中显示函数的实际参数列表

R:应用函数中 as.POSIXct() 的最佳方法

python - Scikit-learn (sklearn) PCA 在稀疏矩阵上抛出类型错误

java - K-means 聚类算法运行时间和复杂度