如何选用可同时计算数值列与二进制列距离的距离函数?
混合数据(数值+二进制)的距离计算方法
你的数据集同时包含连续数值变量(V1)和二进制哑变量,且两类变量权重相同,直接用dist()的binary方法并不合适——因为这个方法仅针对二元数据,会忽略数值变量的实际差异。下面是两个实用的R解决方案:
1. 用cluster::daisy()(推荐)
daisy()是专门为混合类型数据设计的距离计算函数,默认的Gower距离能完美适配你的场景:它会自动识别变量类型,对连续变量计算标准化后的绝对差,对二进制变量计算匹配/不匹配的比例,且默认所有变量权重相等,刚好符合你“两类变量重要性相同”的要求。
示例代码:
library(cluster) # 先处理得到目标数据集 df_processed <- tibble( Observation = c(1:6), V1 = c(3, 5, 4, 6, 9, 5), V2 = c("a", "b", "a", "c", "b", "a"), label = c("Red", "Red", "Blue", "Blue", "Red", "Blue")) %>% select(2:4) %>% fastDummies::dummy_cols() %>% select(c(-V2, -label)) # 计算混合数据距离矩阵 dist_matrix <- daisy(df_processed, metric = "gower") # 可选:转换为常规dist对象,方便后续聚类等操作 dist_matrix <- as.dist(dist_matrix)
2. 自定义标准化+曼哈顿距离
如果你不想额外加载包,可以先把数值变量V1标准化到0-1区间(和二进制变量的取值范围对齐),再用曼哈顿距离计算——曼哈顿距离对0-1尺度的连续变量和二进制变量,默认权重是一致的。
示例代码:
library(scales) # 标准化V1到0-1范围 df_scaled <- df_processed %>% mutate(V1 = rescale(V1, to = c(0, 1))) # 计算曼哈顿距离 dist_matrix <- dist(df_scaled, method = "manhattan")
内容的提问来源于stack exchange,提问作者Rizzle
相关产品推荐
相关产品推荐

