首页 > 解决方案 > 具有高尔距离的层次聚类 - hclust() 和 philentropy::distance()

问题描述

我有一个混合数据集(分类变量和连续变量),我想使用 Gower 距离进行层次聚类。

我的代码基于来自https://www.r-bloggers.com/hierarchical-clustering-in-r-2/的示例,该示例使用基数 Rdist()表示欧几里得距离。由于dist()不计算高尔距离,我尝试使用philentropy::distance()它来计算它,但它不起作用。

谢谢你的帮助!

# Data
data("mtcars")
mtcars$cyl <- as.factor(mtcars$cyl)

# Hierarchical clustering with Euclidean distance - works 
clusters <- hclust(dist(mtcars[, 1:2]))
plot(clusters)

# Hierarchical clustering with Gower distance - doesn't work
library(philentropy)
clusters <- hclust(distance(mtcars[, 1:2], method = "gower"))
plot(clusters)

标签: rcluster-analysis

解决方案


错误在于distance函数本身。

我不知道这是否是故意的,但是philentropy::distance“gower”方法的当前实现无法处理任何混合数据类型,因为第一个操作是转置 data.frame,生成一个字符矩阵,然后抛出输入传递给DistMatrixWithoutUnit函数时出错。

您可以尝试使用daisyfrom 函数cluster

library(cluster)

x <- mtcars[,1:2]

x$cyl <- as.factor(x$cyl)

dist <- daisy(x, metric = "gower")

cls <- hclust(dist)

plot(cls)

编辑:为了将来的参考,它似乎philentropy将被更新以在下一个版本中包含更好的类型处理。从小插曲

在 philentropy 的未来版本中,我将优化 distance() 函数,以便对数据类型正确性和正确输入数据的内部检查将比基本 dist() 函数花费更少的终止时间。


推荐阅读