如何基于与数值n的相对接近度为一组数字加权?
问题分析与解决方案
你的核心问题是混淆了「基于距离的权重」和「原数乘以权重后的结果」:
- 你期望距离n相同的数(如7和9、6和10)拥有相同权重,实际上你的
weight_vec已经满足这个要求——7和9的权重都是1/abs(8-7)=1、1/abs(8-9)=1,6和10的权重都是1/abs(8-6)=0.5、1/abs(8-10)=0.5。 - 你看到的不同结果是
vec * weight_vec的计算值,这是原数与权重的乘积,自然会因为原数不同而有差异,这不是权重本身的问题。
根据你的实际需求,分两种情况给出修正方案:
情况1:需要输出「基于距离的权重」
直接返回权重向量即可,可选归一化(让权重总和为1):
test.2 <- function(vec, n) { # 处理与n相等的元素,避免除以0 dist <- abs(n - vec) weight_vec <- ifelse(dist == 0, Inf, 1 / dist) # 可选:归一化权重,使总和为1 # weight_vec <- weight_vec / sum(weight_vec, na.rm = TRUE) return(weight_vec) }
测试结果:
test.2(c(1, 3, 4, 4, 6, 7, 9, 10), 8) # 输出:[1] 0.125 0.200 0.250 0.250 0.500 1.000 1.000 0.500
可以看到7和9、6和10的权重完全相同。
情况2:需要输出「距离相同则结果相同」的加权得分
如果你希望距离n相同的数,最终输出结果一致,需要让得分仅依赖于距离,而非原数。比如用「接近度得分」的逻辑:
proximity_score <- function(vec, n) { dist <- abs(n - vec) # 用1/(1+dist)避免除以0,同时让得分在0-1之间 score <- 1 / (1 + dist) return(score) }
测试结果:
proximity_score(c(1, 3, 4, 4, 6, 7, 9, 10), 8) # 输出:[1] 0.1111111 0.2000000 0.2500000 0.2500000 0.3333333 0.5000000 0.5000000 0.3333333
此时7和9的得分都是0.5,6和10的得分都是0.333,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Duckman Duck
相关产品推荐
相关产品推荐

