r - 具有高尔距离的层次聚类 - 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)
解决方案
错误在于distance
函数本身。
我不知道这是否是故意的,但是philentropy::distance
“gower”方法的当前实现无法处理任何混合数据类型,因为第一个操作是转置 data.frame,生成一个字符矩阵,然后抛出输入传递给DistMatrixWithoutUnit
函数时出错。
您可以尝试使用daisy
from 函数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() 函数花费更少的终止时间。
推荐阅读
- ruby-on-rails - Rails 控制器中的模型方法
- python - 实际上,Python中带有参数的多重继承在没有指针的情况下不起作用
- node.js - 您可以使用 firebase-admin-node 创建一个 Firestore 时间戳吗?
- r - 从 Shinyproxy 内的 docker 容器连接到 Api
- php - 如何在 Laravel 中编辑 dingo/api auth 中间件?
- android - 如何从 Retrofit2.0 复制和修改 JSON 响应创建的 POJO 类对象
- postgresql - 使用 postgresql 批处理时出现内存不足错误
- performance - 对于参考数据的实例,我想让 getter 自己替换为返回值
- laravel - 如何将 Laravel Storage 中的图像显示到 vue 前端
- javascript - 使用 React 进行 Firebase 查询