找到差的最小平方和的算法

时间:2012-12-05 15:56:23

标签: python algorithm

基本上我正在编写的算法将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)

2 个答案:

答案 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

如果在分析的时间间隔内该函数只有一个最小值,则此方法有效。