Py学习  »  Python

使用python使用下限规范化

user58925 • 4 年前 • 115 次点击  

我想规范化python字典的值,同时为每个值保持一个下限,其中下限由1/(10*n)给出,其中n是字典中的值数。

字典d的值可以规范化如下。

from __future__ import division
d = {1:0.5, 2: 1.5, 3: 2.0, 4: 0.02, 5: 3.1}
total = sum(d.values())
d = {k: v / total for k, v in d.iteritems()}
print d

这种情况下的下限是0.02

lb = 1 / (10 * len(d.keys()))
print lb

有些值小于标准化后的下限。问题是,如果我将值设置为小于lb到lb,则值之和将大于1。以下方法不起作用

D = dict(zip(d.keys(),[lb if i/total < lb else i/total for i in d.values()]))
print sum(D.values())

我们需要一种方法来反复规范化和设置lb,直到所有值都大于lb并且值之和为1。Python的方法可以解决这个问题吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38126
 
115 次点击  
文章 [ 1 ]  |  最新文章 4 年前
user58925
Reply   •   1 楼
user58925    5 年前

下面的代码解决了这个问题,但我不确定它是最快或最干净的方法。如果代码速度有任何改进,我将不胜感激。

from __future__ import division

Z = {1: 0.5, 2: 1.5, 3: 2.0, 4: 0.02, 5: 3.1}

total = sum(Z.values())

lb = 1 / (10 * len(Z.keys()))
print lb, "lower bound"

U = []
for k in Z.keys():
    if Z[k] > lb:
        U.append(k)
B = []
for k in Z.keys():
    if Z[k] <= lb:
        U.append(k)

def setBound():
    count = 0
    for k in U:
        w = Z[k]
        if w < lb:
            Z[k] = lb
            U.remove(k)
            B.append(k)
            count += 1
    return count

def normalize():
    bounded_sum = lb * len(B)
    unbounded_sum = 0
    for k in U:
        unbounded_sum += Z[k]
    multiple = (1-bounded_sum) / unbounded_sum
    for k in U:
        Z[k] *= multiple



def adjust():
    normalize()
    count = setBound()
    if count > 0:
        normalize()
        return adjust()
    else:
        return

adjust()
print Z
print sum(Z.values()), "sum of all values"