Pythonでは、値の辞書に1.0の合計があります。特定の範囲(0〜1.0)内の値を配布する方法
weights = {u'obj_1': 0.018564743024138134, u'obj_2': 0.012814665648003992,
u'obj_3': 0.38978992409415425, u'obj_4': 0.0594938403597285,
u'obj_5': 0.41613932145700294, u'obj_6': 0.10319750541697208}
私はそのうちの1つに新しい値を設定したいと思っています。その差は残りの部分に均等に分配されます。すべての値の合計は常に1.0にする必要があります。
私はこれを行うためにこれを書いています。
obj_3 : 0.221688692166
obj_2 : -0.15528656628
obj_1 : -0.149536488904
obj_6 : -0.0649037265111
obj_5 : 0.248038089529
obj_4 : 0.9
Total sum: 1.0
obj_4は私が必要な値を設定して、その合計は1.0に等しい:出力
set_inf = "obj_4"
set_weight = 0.9
rest = set_weight-weights[set_inf]
distribute_count = len(weights)-1
distribute_weight = rest/distribute_count
for inf, val in weights.items():
if inf == set_inf:
weights[inf] = set_weight
else:
new_val = val-distribute_weight
weights[inf] = new_val
print "%s : %s" % (inf, weights[inf])
。問題は、各値が決して0より小さく決して1.0より大きくないことを確かめたいということです。
これは混乱の原因です。私はそれを処理する最良の方法は不明です。値を制限すると、他の値を補正する必要があります。そうでなければ、合計は1.0になりません。このようなことをどうすれば実現できますか?
set_weight
は、0〜1.0の間の任意の値にすることができます。
数学的には、この問題には無限の数の解があります。'obj_3'を設定すると、他のすべてのオブジェクトの合計は1 - obj_3に等しくなければなりません。あなたがすべてに非負条件を課しても、それを行う無限の方法があります。長いストーリーソートでは、より多くの条件を思いついたり、偶然に物事を残す必要があります。 –
私はパーセンテージに基づいて差を分配したいと思う。それは理にかなっていますか? –