【问题标题】:R kmeans final distance to to centroidR kmmeans 到质心的最终距离
【发布时间】:2017-03-22 17:46:09
【问题描述】:

我使用命令kmeans_iris <- kmeans(iris[,1:4], centers=3)R 中的iris 数据集上运行了kmeans 算法。我现在想知道从iris 数据集中的给定观察到其相应集群质心的距离。我可以编写代码来手动计算从观察到与其集群对应的centers 的欧几里得距离,但是没有一种简单的内置方法可以做到这一点吗?

【问题讨论】:

  • 相关未回答的问题 - stackoverflow.com/questions/29397974/…
  • 我不完全确定计算结果,但您可以返回每个案例的中心,例如 fitted(kmeans_iris),这应该会让事情变得更容易。
  • 谢谢,这将有助于手动计算欧几里得距离。我只是希望有一种简单、自动化的方式来做到这一点。
  • 要结束这个问题,你需要sqrt(rowSums(iris[,1:4] - fitted(kmeans_iris)) ^ 2)吗?
  • 是的,这行得通。仍然感到惊讶的是,没有内置的方法可以看到这一点。

标签: r k-means


【解决方案1】:

据我所知,没有一种方法可以提取每个案例的距离。如果我正确理解您想要什么,您可以编写自己的代码:

sqrt(rowSums((iris[,1:4] - fitted(kmeans_iris))^ 2))
# [1] 0.14135063 0.44763825 0.41710910 0.52533799 0.18862662 0.67703767...

...对于欧几里得距离。

如果需要,您可以将其清理成一个函数,在其中指定原始的 data 和拟合的 k-means 输出。

kmdist <- function(data,km) {
  sqrt(rowSums((data[,colnames(km$centers)] - fitted(km))^ 2))
}
kmdist(iris, kmeans_iris)
# [1] 0.14135063 0.44763825 0.41710910 0.52533799 0.18862662 0.67703767...

【讨论】:

  • 很好的答案!有这个功能吗?
  • 我有一个疑问:让我们考虑 X=rowSums(data[colnames(km$centers)] - 拟合(km)) 然后 sqrt(rowSums(iris[,1:4] - 拟合(kmeans_iris) )) ^ 2) 可以写成 sqrt(X ^ 2),它总是与 X 相同,因为它在数学上是正确的。那么为什么我们要取 squire,然后再取它的根呢?是不是有什么问题?
  • @SankarNarayanMisra - 你是对的。奇怪的是,在过去的几年里,至少还有另外 2 个人发现了这个错误,但是他们都发布了 cmets 作为答案(被版主删除),所以我从来没有收到过修复它的通知。谢谢。 (现已修复)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 2017-04-11
  • 2021-09-23
  • 2021-01-14
相关资源
最近更新 更多