给出两个列表,其中一个列表由一些因子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。
答案 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
的总和之比。 (alpha
,Sum(y.x)/Sum(x^2)
的最小二乘估计,或标准差的比率,可能是首选)