社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

使用python使用下限规范化

user58925 • 5 年前 • 134 次点击  

我想规范化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
 
134 次点击  
文章 [ 1 ]  |  最新文章 5 年前
user58925
Reply   •   1 楼
user58925    6 年前

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

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"