3

基本上,我正在编写的这个算法将 List L 作为输入,并希望找到一个数字 x,使得 L、i、减去 x 的平方和求和中的所有项目都最小化。求 的总和的最小 x abs(L[i]-x)**2。到目前为止,我的算法正在做它应该做的事情,而不是在浮动的情况下。我不确定如何实现浮动。例如,[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)
4

2 回答 2

11

很容易证明 [*] 使差平方和最小的数是 的算术平均值L这给出了以下简单的解决方案:

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)总和被接管的地方i=0..n-1

取 的导数f(x)并将其设置为零

2*sum(x - L[i]) = 0

使用简单的代数,上面可以转化为

x = sum(L[i]) / n

这就是 的算术平均值L。QED。

于 2012-12-05T16:10:33.717 回答
0

我不是 100% 确定这是执行此操作的最有效方法,但您可以做的是维护您拥有的相同算法并修改 return 语句。

min_int = min(sumsqdiffs, key=sumsqdiffs.get)
return bisection(L,min_int-1,min_int+1)

在哪里bisection实现以下方法:二分法

如果在分析的区间内函数存在一个最小值,则此方法有效。

于 2012-12-05T16:10:49.657 回答