将一系列比率限制在一个范围内,同时保持它们相乘的总体值 increase/decrease

Limiting a sequence of ratios to a range whilst maintaining overall increase/decrease of values they are multiplying

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

假设我的比率限制为 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 条件处理的。