我有一个正数值向量。我需要对其进行规范化,以使值的总和为 1(例如概率)。这很简单,只需使用 x_i/sum(x) 作为权重。但这里需要注意的是:我需要没有重量会小于某个最小截止值,并且重量不会大于某个最大截止值。现在,这意味着两件事:首先,这意味着存在没有解决方案的情况(例如,如果最大截止值为 0.2,则 3 个对象不能是权重)。其次,这意味着权重的“相对性”被打破了。也就是说,在标准归一化中(其中 w_i 是对所有 i 赋予 x_i 的权重),对于所有 i,j,w_i/w_j=x_i/x_j。有截止,这是无法做到的。更正式地,我想找到一个函数 w=rwc(x,min,max) 其中 x 是一个向量,它返回一个具有以下属性的相同长度的向量:
1) 总和(w)=1
2) min <= w_i <= max for all i
3) 如果 x_i <= x_j 那么 w_i<=w_j 对于所有 i,j
4) 如果 w_i 和 w_j 都不同于临界值(最小值和最大值),则它们保持相对性:即,如果 min < w_i < max 且 min < w_j < max 那么 w_i/w_j=x_i/x_j
如果没有解决方案,则应返回 NULL。
所以我的问题是:
a) 你如何建议这样做(用 R 或任何其他语言)?
b) 给定 x,是否有多个解(即至少有两个不同的向量 w 和 v,每个都符合上述形式要求)
这不是严格意义上的 R 问题,但我在 R 中做的一个项目中遇到了它,所以我将它作为 R 发布。欢迎任何关于更好分类的建议。
更新
在下面的讨论和更多的思考之后,似乎有必要在上面的 4 中添加第五个要求:5)在满足 1-4 的所有可能的权重分配中,W 是具有最小数量的极端权重(最小或最大)。
这是(希望)这样做的 my r 代码:
#
mwc = function(x,mxw=1,mnw=0) {
cake = 1
agnts = 1:length(x)
result = numeric(length(x))
while(cake>0 & length(agnts)>0) {
tmp = cake*x[agnts]/sum(x[agnts])
low = which(tmp<mnw)
high = which(tmp>mxw)
if(length(low)+length(high)==0 ) {
result[agnts] = tmp[agnts]
break;
}
if (length(low)>0) {
result[agnts[low]] = mnw
}
if (length(high)>0) {
result[agnts[high]] = mxw
}
cake = 1-sum(result)
agnts=agnts[-c(low,high)]
}
if (cake<0) return(NULL) #no solution
if (abs(sum(result)-1)>1e-17) return(NULL)
return(result)
}
# the end