最小化两个列表之间的增量

时间:2014-03-26 22:33:47

标签: python optimization scipy

给出两个列表,其中一个列表由一些因子alpha缩放:

from random import randint

alpha = 1.2
x = [randint(1, 100) for x in range(1000)]
y = [int(alpha * i) for i in x]

我想过滤某个阈值下的值的两个列表,从而最小化两个列表中返回的元素数量的增量。因此,如果x的阈值为40,那么len([i for i in x if i < 40]) ~ 400我想知道当y未知时alpha的阈值应该是多少,因此元素返回的数量为〜 400,即这个例子是48。

2 个答案:

答案 0 :(得分:0)

您可以将平均alpha计算为:

alpha = sum((yn / float(xn)) for xn, yn in zip(x, y)) / len(x)

然后:

y_threshold = int(alpha * x_threshold)

如果最小化abs(len(filtered_x) - len(filtered_y))至关重要,则可以围绕y_threshold执行本地搜索。

答案 1 :(得分:0)

您的x_threshold可让您知道其下方有多少x(此处为400)。因此,您只需要在y中找到排名为400的元素,并将其用作y_threshold

你可以通过排序y(这是过度杀伤)或选择第N(可以在O(N)中完成)来做到这一点。这种方法总是达到delta=0

对于更简单和近似的解决方案,请将alpha估算为两个列表的总和与y_threshold = alpha . x_threshold的总和之比。 (alphaSum(y.x)/Sum(x^2)的最小二乘估计,或标准差的比率,可能是首选)