我有一個正數值的向量。我需要對它進行歸一化,以使得這些值的總和爲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)sum(w )= 1
2)分鐘< = w_i < = MAX對所有的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。
所以我的問題是:
一)你如何建議這樣做(在讀或任何其他語言)?
b)中給定的x,可以有一個以上的溶液(即,至少兩個不同的載體,W和V中,每個符合上述的正式要求)
這不是嚴格的R的問題,但我在一個我在R做的項目中遇到了它,所以我將它作爲R.發佈,歡迎任何關於更好分類的建議。
更新
按照下面和經過思考討論,似乎有必要到第五需求增加上述4: 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
您的代碼過於貪婪。一個微不足道的反例:min是0.05,max是0.8; v是[1,1,1000000]。如果我正確理解了你的代碼,它將會失敗,因爲第一步將把最小/最大值分配給w中的所有元素,剩餘部分放在'cake'中。但是,[.1,.1,.8]是一個有效的解決方案。還有其他的情況下,算法會產生一個非最小的解決方案,根據您的標準5. – rici 2013-02-21 22:13:45
好的。真正。有什麼建議麼? – amit 2013-02-22 20:24:22