基本上我正在编写的算法将List L作为输入,并希望找到一个数字x,使得L,i,减去x平方和求和的所有项目都被最小化。找到abs(L[i]-x)**2
之和的最小x。到目前为止,我的算法正在做它应该做的事情,而不是在浮动的情况下。我不确定如何实现浮动。例如,[2, 2, 3, 4]
理想情况下会产生结果2.75
,但我的算法目前无法产生浮动整数。
def minimize_square(L):
sumsqdiff = 0
sumsqdiffs = {}
for j in range(min(L), max(L)):
for i in range(len(L)-1):
sumsqdiff += abs(L[i]-j)**2
sumsqdiffs[j]=sumsqdiff
sumsqdiff = 0
return min(sumsqdiffs, key=sumsqdiffs.get)
答案 0 :(得分:11)
很容易证明[*]最小化平方差之和的数字是L
的算术mean。这提供了以下简单的解决方案:
In [26]: L = [2, 2, 3, 4]
In [27]: sum(L) / float(len(L))
Out[27]: 2.75
或使用NumPy:
In [28]: numpy.mean(L)
Out[28]: 2.75
[*]以下是证明的概要:
我们需要找到最小化x
f(x) = sum((x - L[i])**2)
的{{1}},其中总和取i=0..n-1
。
取f(x)
和set it to zero的衍生物:
2*sum(x - L[i]) = 0
使用简单代数,上面的内容可以转换为
x = sum(L[i]) / n
这是L
的算术平均值。 QED。
答案 1 :(得分:0)
我不是100%确定这是最有效的方法,但你可以做的是保留你拥有的相同算法并修改return语句。
min_int = min(sumsqdiffs, key=sumsqdiffs.get)
return bisection(L,min_int-1,min_int+1)
其中bisection
实施以下方法:Bisection Method
如果在分析的时间间隔内该函数只有一个最小值,则此方法有效。