当一个值必须保持不变时,如何规范化浮点列表?
How to normalize a list of floats when one value has to stay the same?
我有一个包含这些标准化值的列表
list_a = [0.25, 0.25, 0.25, 0.25]
现在我想将一个条目的值更改为另一个数字,比方说 0.75
。这个数字是固定的,不应该再改变了。
list_a_changed = [0.25, 0.25, 0.75, 0.25]
仍要确保列表中所有值的总和为 1
,其余值需要为 0.0833
。所以我的列表必须是:
list_a_normalized = [0.083, 0.083, 0.75, 0.083]
这很容易判断所有值是否在初始列表中共享相同的百分比。我可以做 1 - 0.75 = 0.25
,然后将 0.25
分给剩余的数字,因为它们都占总和的相同百分比。
value_change = 0.75
remaining_value = 1 - value_change
divided_remaining_value = remaining_value / (len(list_a_changed) - 1)
list_a_normalized = [divided_remaining_value, divided_remaining_value, value_change, divided_remaining_value ]
但是如果原始列表是这样的,你会怎么做:
list_b = [0.25, 0.45, 0.20, 0.10]
然后我将一个值更改为 0.05
list_b_changed = [0.25, 0.45, 0.05, 0.10]
您将如何计算其他数字的值必须是多少,以便它们每个都包含剩余 0.95
的适当部分?
你可以
- 计算
remaining
- 计算没有变化值的总和,得到它们没有变化值的相对比例
- 将它们的值乘以剩余的值,然后除以相对总数,使其与总数成正比
def normalize(values, index_not_change):
remaining = 1 - values[index_not_change]
total_except_remaining = sum(values) - values[index_not_change]
return [(value * remaining / total_except_remaining if idx != index_not_change else value)
for idx, value in enumerate(values)]
print(normalize([0.25, 0.25, 0.75, 0.25], 2)) # [0.0833333333, 0.0833333333, 0.75, 0.0833333333]
print(normalize([0.25, 0.45, 0.05, 0.10], 2)) # [0.296875, 0.534375, 0.05, 0.11875000000000001]
理解 total_except_remaining
的目的,没有它就会是
normalize([0.25, 0.25, 0.75, 0.25], 2) -> [0.0625, 0.0625, 0.75, 0.0625]
因为您已经计算了剩余的四分之一 (0.25
) 但加上相对和是 0.75
而不是 1 的事实,您更新到它们的实际比例
同样的方法也可以修改
def normalize(values, position, new_value):
values[position] = new_value
remaining = 1 - new_value
total_except_remaining = sum(values) - new_value
return [(value * remaining / total_except_remaining if idx != position else value)
for idx, value in enumerate(values)]
print(normalize([0.25, 0.25, 0.25, 0.25], 2, 0.75))
使用 change_normalized
项并保持列表规范化:
re_normalize
通过乘以正确的因子(即 1 与没有更改项的总和之间的比率)来保持列表标准化:
def change_normalized(lst, index, value):
def touch(lst, index, value):
lst[index] = value
def re_normalize(lst, index, value):
multiply_factor = (1 - value) / (sum(lst) - value)
for j in range(len(lst)):
if i == j:
continue
lst[j] *= multiply_factor
touch(lst, i, value)
re_normalize(lst, i, value)
i = 2
value = 0.05
list_b = [0.25, 0.45, 0.20, 0.10]
# Change item at index to value and keep list normalized
change_normalized(list_b, i, value)
# 1.0
print(sum(list_b))
此代码可以缩减为:
def change_normalized(lst, index, value):
lst[index] = value
multiply_factor = (1 - value) / (sum(lst) - value)
lst[:] = [multiply_factor * x if i != j else x for j, x in enumerate(lst)
我有一个包含这些标准化值的列表
list_a = [0.25, 0.25, 0.25, 0.25]
现在我想将一个条目的值更改为另一个数字,比方说 0.75
。这个数字是固定的,不应该再改变了。
list_a_changed = [0.25, 0.25, 0.75, 0.25]
仍要确保列表中所有值的总和为 1
,其余值需要为 0.0833
。所以我的列表必须是:
list_a_normalized = [0.083, 0.083, 0.75, 0.083]
这很容易判断所有值是否在初始列表中共享相同的百分比。我可以做 1 - 0.75 = 0.25
,然后将 0.25
分给剩余的数字,因为它们都占总和的相同百分比。
value_change = 0.75
remaining_value = 1 - value_change
divided_remaining_value = remaining_value / (len(list_a_changed) - 1)
list_a_normalized = [divided_remaining_value, divided_remaining_value, value_change, divided_remaining_value ]
但是如果原始列表是这样的,你会怎么做:
list_b = [0.25, 0.45, 0.20, 0.10]
然后我将一个值更改为 0.05
list_b_changed = [0.25, 0.45, 0.05, 0.10]
您将如何计算其他数字的值必须是多少,以便它们每个都包含剩余 0.95
的适当部分?
你可以
- 计算
remaining
- 计算没有变化值的总和,得到它们没有变化值的相对比例
- 将它们的值乘以剩余的值,然后除以相对总数,使其与总数成正比
def normalize(values, index_not_change):
remaining = 1 - values[index_not_change]
total_except_remaining = sum(values) - values[index_not_change]
return [(value * remaining / total_except_remaining if idx != index_not_change else value)
for idx, value in enumerate(values)]
print(normalize([0.25, 0.25, 0.75, 0.25], 2)) # [0.0833333333, 0.0833333333, 0.75, 0.0833333333]
print(normalize([0.25, 0.45, 0.05, 0.10], 2)) # [0.296875, 0.534375, 0.05, 0.11875000000000001]
理解 total_except_remaining
的目的,没有它就会是
normalize([0.25, 0.25, 0.75, 0.25], 2) -> [0.0625, 0.0625, 0.75, 0.0625]
因为您已经计算了剩余的四分之一 (0.25
) 但加上相对和是 0.75
而不是 1 的事实,您更新到它们的实际比例
同样的方法也可以修改
def normalize(values, position, new_value):
values[position] = new_value
remaining = 1 - new_value
total_except_remaining = sum(values) - new_value
return [(value * remaining / total_except_remaining if idx != position else value)
for idx, value in enumerate(values)]
print(normalize([0.25, 0.25, 0.25, 0.25], 2, 0.75))
使用 change_normalized
项并保持列表规范化:
re_normalize
通过乘以正确的因子(即 1 与没有更改项的总和之间的比率)来保持列表标准化:
def change_normalized(lst, index, value):
def touch(lst, index, value):
lst[index] = value
def re_normalize(lst, index, value):
multiply_factor = (1 - value) / (sum(lst) - value)
for j in range(len(lst)):
if i == j:
continue
lst[j] *= multiply_factor
touch(lst, i, value)
re_normalize(lst, i, value)
i = 2
value = 0.05
list_b = [0.25, 0.45, 0.20, 0.10]
# Change item at index to value and keep list normalized
change_normalized(list_b, i, value)
# 1.0
print(sum(list_b))
此代码可以缩减为:
def change_normalized(lst, index, value):
lst[index] = value
multiply_factor = (1 - value) / (sum(lst) - value)
lst[:] = [multiply_factor * x if i != j else x for j, x in enumerate(lst)