我想知道如何在层次聚类分析中在 R 中输入自定义距离。R 只实现了一些默认距离度量,例如“欧几里得”、“曼哈顿”等。假设我想输入一个自定义距离 '1-cos(xy)'。那我该怎么办?
写一个函数显然是一个解决方案。但是,它会很复杂,也很难写。请帮我。我无法编写代码。
我想知道如何在层次聚类分析中在 R 中输入自定义距离。R 只实现了一些默认距离度量,例如“欧几里得”、“曼哈顿”等。假设我想输入一个自定义距离 '1-cos(xy)'。那我该怎么办?
写一个函数显然是一个解决方案。但是,它会很复杂,也很难写。请帮我。我无法编写代码。
hclust() 采用一个距离矩阵,您可以自己构建它,在 R 中进行计算或从其他地方读取它们。as.dist() 可用于将任意矩阵转换为“dist”对象,这是 hclust() 理解的距离矩阵的方便表示。显然,您自己的距离是否有意义是另一个问题,但很容易尝试。
如果您想对所有 X 和 Y 对应用任意函数以获得矩阵,请查看 outer()
看看proxy,它从任何自定义函数创建距离矩阵。
set.seed(1)
mat <- matrix(runif(5))
fn <- function(x, y) 1 - cos(x - y)
proxy::dist(mat, method = fn)
1 2 3 4
2 0.005678023
3 0.046859766 0.020078605
4 0.199519068 0.140284488 0.055706274
5 0.002036234 0.014490103 0.068096902 0.239378143
我的方法是为两个向量编写距离函数,并使用 apply 函数计算到向量对的距离(例如,存储在数据框中)。使用 as.dist() 将此对称矩阵转换为 dist 对象。
hclust() 将 dist 对象作为参数。
如果您正在绘制热图或其他内容,则将自定义函数提供给 distfun 参数会覆盖默认值。