正の数値のベクトルがあります。値の合計が1になるように正規化する必要があります(たとえば、確率)。これは単純で、重みとしてx_i / sum(x)を使用するだけです。ただし、ここに注意点があります。重量が最小カットオフを下回らないようにする必要があります。また、重量が最大カットオフを超えないようにする必要があります。さて、これは2つのことを意味します。1つは、解決策がない場合があることを意味します(たとえば、最大カットオフが0.2の場合、3つのオブジェクトを重みにすることはできません)。第二に、それは重みの「相対性理論」が壊れていることを意味します。つまり、標準の正規化(w_iはすべてのiのx_iに与えられる重み)では、すべてのi、jのw_i / w_j = x_i/x_jです。カットオフがあると、これはできません。more正式には、関数w = rwc(x、min、max)を見つけたいと思います。ここで、xはベクトルであり、次のプロパティを持つ同じ長さのベクトルを返します。
1)sum(w)= 1
2)すべてのiについて最小<=w_i<=最大
3)x_i <= x_jの場合、すべてのi、jに対してw_i <=w_j
4)w_iとw_jが両方ともカットオフ(最小と最大)と異なる場合、それらは相対性を維持します。つまり、最小<w_i<最大および最小<w_j<最大の場合、w_i / w_j = x_i / x_j
解決策がない場合は、NULLを返す必要があります。
だから私の質問は:
a)それを(Rまたは他の言語で)どのように提案しますか?
b)xが与えられた場合、複数の解が存在する可能性があります(つまり、それぞれが上記の正式な要件に準拠する、少なくとも2つの異なるベクトルwとv)
これは厳密にはRの問題ではありませんが、Rで行っているプロジェクト内で発生したので、Rとして投稿します。より適切な分類の提案を歓迎します。
アップデート
以下の説明に続いて、さらに検討した後、上記の4つに5番目の要件を追加する必要があるようです。5)1〜4を満たすすべての可能な重みの割り当てのうち、Wは極端な重みの数が最小(最小または最大)の要件です。 )。
これが(うまくいけば)それを行う私の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