繁体   English   中英

R 中 k-means 的 nstart

[英]nstart for k-means in R

许多地方的搜索结果报告说,R 的 function kmeans中的参数nstart设置了算法的多次迭代并选择“最好的”,例如https://datascience.stackexchange.com/questions/11485/k-means-在-r-usage-of-nstart-parameter 任何人都可以提供任何关于它是如何做到这一点的明确说明,即它通过什么措施来定义最好?

其次:R的kmeans function 需要一个参数centers 在这里,与 k-means 中的典型情况一样,可以在算法开始期望最大化之前初始化质心,方法是从数据集中选择初始质心行(数据点)。 (您也可以以矢量形式提供数据集中存在的点,付出更大的努力。在这种情况下,理论上您可以选择全局最优值作为您的质心。这不是我想要的。 )当nstart或种子随机初始化初始化时,我很确定它是通过从您的数据集中随机选择质心并从这些(不仅仅是空间内的一组随机点)开始。

因此,总的来说,我正在寻找一种方法来从数据集中获得一组好的(例如,最好的 $n$ 试验,或最好的nstart )作为初始质心的起始数据实例 有什么方法可以从nstart中提取“获胜”(=最佳)初始质心集(然后我可以在centers参数中使用它)? 任何其他简化和快速的方法来获得一组非常好的起始质心(大概,合理地接近集群中心最终的位置)?

至少,是否有一种方法可以从给定的kmeans运行中提取它选择开始的初始质心?

kmeans 试图最小化的标准是内部散布矩阵的踪迹,即(不幸的是,本论坛不支持 LaTeX,但希望您仍然可以阅读):

$$ 轨迹(S_w) = \sum_{k=1}^K \sum{x \in C_k} ||x - \mu_k||^2 $$

关于最佳起点:显然,“最佳”起点将是kmeans最终选择的聚类中心。 这些在属性中心返回:

km <- kmeans(iris[,-5], 3)
print(km$centers)

如果您正在寻找最佳随机起点,您可以自己创建随机起点(使用runif ),执行nstart次并评估哪个初始配置导致最小的km$tot.withinss

nstart <- 10
K <- 3 # number of clusters
D <- 4 # data point dimension

# select possible range
r.min <- apply(iris[,-5], MARGIN=2, FUN=min)
r.max <- apply(iris[,-5], MARGIN=2, FUN=max)

for (i in 1:nstart) {
  centers <- data.frame(runif(K, r.min[d], r.max[d]))
  for (d in 2:D) {
    centers <- cbind(centers, data.frame(runif(K, r.min[d], r.max[d])))
  }
  names(centers) <- names(iris[,-5])

  # call kmeans with centers and compare tot.withinss
  # ...
}  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM