2014-03-26 44 views
0

给出,其中一个是由一些缩放两个列表分解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我想知道阈值应该是什么yalpha是不明所以的元件回流的数量〜400,即48的这个例子。

+0

如果'alpha'未知,您甚至会如何计算'y'?如果你想在相同数量的各列表项的,用于'y'门槛只是'门槛* alpha'。或者过滤'x' *然后*创建'y'。 – jonrsharpe

+0

我只设置阿尔法的问题,我有两个列表,一个是另一个的近似缩放版本,我有对于x固定的阈值,我想y的阈值。很明显,当你知道列表之间的关系时,答案是很清楚的。 –

+0

所以,你有'x','y'和'x_threshold',并且要计算'y_threshold'? – jonrsharpe

回答

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

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)或标准偏差比率的最小二乘估计量可能是首选)