我想使用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
向量,因此尺寸不匹配...
答案 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!