归一化向量,使总和等于 1,同时满足下限

Posted

技术标签:

【中文标题】归一化向量,使总和等于 1,同时满足下限【英文标题】:Normalize vector such that sum equals 1, while satisfying a lower bound 【发布时间】:2021-11-22 15:37:58 【问题描述】:

给定下限 0.025,我想要一个由总和为 1 并满足该下限的权重组成的向量。从任意长度的向量开始,取值范围从 0.025(下限)到 1。

例如,

[0.025, 0.8, 0.7]

然后,除以数字之和的归一化大致得出以下结果:

[0.016, 0.524, 0.459]

现在这不满足下限,关于如何让它工作的任何想法?

【问题讨论】:

当您说“然后是规范化”时,您的确切意思是什么?现在好像你说你想将每个元素除以所有元素的总和,这对我来说真的没有意义。 目标是在满足下限的同时获得总和为 1 的权重。标准化方法对此不起作用。权重最终总和为 1,但不满足下限。 【参考方案1】:

如果您希望权重(数组中的值)总和为 1,则可以将每个值除以所有值的总和(即除以总和进行归一化)。这个过程保持每对值的相对大小,我的意思是:在这一步之前和之后,第二项将是第四项的 5 倍。

另一方面,您希望所有值都大于 0.025。想象一下,如果一个项目在归一化之前是另一个项目的 50 倍,并且最小值必须是 0.025,那么另一个项目需要是 1.25,这已经大于总和。

你可以发现你不能(给定任何数组)只是平等地缩放所有值,以便它们总和为 1 AND 最小值为 0.025。

那么问题是你想在过程中保持值之间的什么关系?

另一方面,你不能有超过 40 个项目,都大于 0.025,总和为 1。所以“任意长度”也行不通。

【讨论】:

【参考方案2】:

将下限添加到被除数和除数:

为了便于阅读,我使用了numpy

import numpy as np

v = np.array([0.025, 0.8, 0.7])

v2 = (v + min(v)) / sum(v + min(v))

输出:

>>> v2
array([0.03125 , 0.515625, 0.453125])

>>> sum(v2)
1.0

【讨论】:

对于这个例子,它似乎工作。但是,在评估以下代码时,我确实获得了低于 min_weight 的值,该值设置为 0.025; weights = np.random.rand(len(assets)), normalized_weights = (weights + min_weight) / sum(weights + min_weight), print(normalized_weights),其中 len(assets) 为 33。

以上是关于归一化向量,使总和等于 1,同时满足下限的主要内容,如果未能解决你的问题,请参考以下文章

将数组归一化以使总和为 1.0 的两种方法

如何在 C++ 中快速计算向量的归一化 l1 和 l2 范数?

怎样用matlab进行列向量归一化?

归一化指数函数:softmax loss function

归一化输入向量

如何通过 Hive 中数组的总和对数组进行归一化?