将比率序列限制在一个范围内,同时保持它们正在乘以的值的总体增加/减少



对不起,我的数学不是很好,所以你必须忍受我。

假设我的比率限制为 3。我有一个要乘以比率的 numpy 大小数组和一个比率的 numpy 数组,其中一些在限制范围内,其中一些不在限制范围内。

我需要将高于限制的比率设置为限制,并将低于限制的比率增加到限制,

以考虑超过限制的比率的减少。结果将是大小的总和仍然相同,但单个大小的更改没有超过限制

In [1]: import numpy as np
In [2]: sizes = np.array([2.0,4.0,6.0,8.0,10.0])
In [3]: ratios = np.array([0.5, 0.5, 5.0, 4.0, 0.5])
In [4]: print np.sum(sizes * ratios)
70.0
#result after limiting ratios would still be 70

编辑:因此,在上面的例子中,结果比率将是:

np.array([1.75, 1.75, 3.0, 3.0, 1.75])
In [4]: print np.sum(sizes * ratios)
70.0

以前高于限额的比率已降低,低于限制的比率已提高以补偿。

我想你正在寻找这样的东西:

import numpy as np
def Spread_Ratios(ratios,sizes):
    if np.dot(ratios,sizes)/np.sum(sizes)>3.:
        print 'There is no solution!n'
        return None
    if np.any(ratios>3.):
        score = np.dot(sizes,ratios)
        ratios_reduced = np.where(ratios>3.,3.,ratios)
        score_reduced = np.dot(sizes,ratios_reduced)
        delta_ratios = (score - score_reduced) / np.sum(sizes[ratios<3.])
        new_ratios = ratios_reduced + np.where(ratios<3.,delta_ratios,0.)
        return Spread_Ratios(new_ratios,sizes)
    else:
        return ratios,sizes

递归定义是必要的,因为低于 3(但接近)的权重可能会提升到 3 以上。

此外,可能根本不存在解决方案。这种情况以第一个if条件处理。

最新更新