3

基本的に、私が書いているこのアルゴリズムは、入力としてリストLを取り、L、i、マイナスxの2乗および合計のすべての項目が最小化されるような数値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、次のメソッドを実装します:二分法

これは、分析された間隔内に関数の最小値が 1 つある場合に機能します。

于 2012-12-05T16:10:49.657 に答える