如何为“ flexclust :: distEuclidean”指定参数“ centers”?

时间:2018-07-10 14:31:59

标签: r matrix distance

我想使用flexclust::distEuclidean,但不确定如何指定centers?distance的文档中没有给出示例。

因此,我检查了此函数的来源(结果很简短):

function (x, centers) 
{
    if (ncol(x) != ncol(centers)) 
        stop(sQuote("x"), " and ", sQuote("centers"), " must have the same number of columns")
    z <- matrix(0, nrow = nrow(x), ncol = nrow(centers))
    for (k in 1:nrow(centers)) {
        z[, k] <- sqrt(colSums((t(x) - centers[k, ])^2))
    }
    z
}
<environment: namespace:flexclust>

如果p是我数据中的多个要素,而k是簇的数量,则centers应该是k x p矩阵,即连续的质心应位于行?

实际上,必须如此,因为此函数首先检查ncol(x) = ncol(centers)是否。但是我们有

   z[, k] <- sqrt(colSums((t(x) - centers[k, ])^2)) 

t(x) - centers[k,]甚至如何工作? t(x)p x n矩阵,而centers[k, ]1 x p向量,因此尺寸不匹配...

1 个答案:

答案 0 :(得分:1)

  

t(x)p x n矩阵,而centers[k, ]1 x p向量,因此尺寸不匹配...

否,centers[k, ]只是一个无量纲的向量。在t(x) - centers[k, ]中,R中的recycling rule将适用。

如果您执行t(x) - centers[k, ,drop = FALSE],将会得到预期的失败。


一个简单的示例供您消化:

x <- matrix(1:6, nrow = 3)
y <- x
x - y[, 1]  ## yeah!
x - y[, 1, drop = FALSE]  ## oops!