Нормализовать с нижней границей, используя Python - PullRequest
0 голосов
/ 24 сентября 2018

Я хотел бы нормализовать значения словаря 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

И некоторые значения меньше, чем нижняя граница после нормализации.Проблема в том, что если я установлю значения меньше фунта на фунт, сумма значений станет больше единицы.Следующий подход не работает

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-способ решил эту проблему?

1 Ответ

0 голосов
/ 24 сентября 2018

Приведенный ниже код решает проблему, но я не уверен, что это самый быстрый или самый чистый метод.Буду признателен за улучшение скорости кода ниже.

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...