2012-03-28 27 views
0

最適化の後、私はPythonとC++の両方で最適なパラメータで残差を計算します。結果の差は大きい。ここで私はより正確に進める方法です:Python/C++ - 精度の差

私はPythonでパラメトリックモデルに従ってデータを生成します。 XとYをExcelファイルに保存します。このファイルを私のC++プログラムにロードし、最適化を実行します。私は最適なパラメータを思いつきました。それは、そのシリーズを生成するために使用されたパラメータにかなり近いものです。次に、PythonとC++で残差(Yとモデル出力の最適なパラメータの差の二乗和)を計算します。結果は膨大で、パラメータの変化に非常に敏感なモデルでは最大10^3の差があります。これらの違いは、PythonやC++の精度を扱う異なる方法に帰することができますか、それとも何か間違っている可能性がありますか?最適化が終了すると、残差計算は単純な計算であり、問​​題がどこにあるのかが問題ではないかと思います。

アドバイスや参考に感謝します。

EDIT ---データを生成し、残差の二乗和を計算するためのPythonコードを簡単に表示できますが、計算はインタープリタを介して実行されるため、C++コードではありません。コメントありがとうございます。

P1 = 5.21 
P2 = 0.22 

X_= list(range(0,100,1)) 
X=[float(x)/float(10) for x in X_] 
Y = [P1*numpy.exp(-1*P2*x) for x in X] 

##plt.plot(X,Y) 
##plt.show() 

##for j in range(len(Y)): 
## Y[j]+=rg.normal(0,0.01) 

#build some input files 
X1f = open('F:\WORK\SOLVEUR\ALGOCODE\PYTHON_\DataSets\exponential1X.txt', 'w') 
for i in range(len(X)): 
    X1f.write(str(X[i])+'\n') 
X1f.close() 

Yf = open('F:\WORK\SOLVEUR\ALGOCODE\PYTHON_\DataSets\exponential1Y.txt', 'w') 
for i in range(len(Y)): 
    Yf.write(str(Y[i])+'\n') 
Yf.close() 


def func_exp_1(param, x1, y): 
    p1, p2 = param 
    res = sum((y_i - p1*numpy.exp(-1*p2*x))**2 for x1_i, y_i in zip(x1, y)) 
    return res 
print func_exp_1([5.2132,0.2202],x1,y) 
+4

いくつかのコードを見ることなく、できることはあまりありません。 – Mysticial

+1

はい、finiti-precision floatで実行される計算方法には大きな違いがあります。コードを表示 –

+0

値を_Excel_ファイルに保存しますか?それが、私があなたのトラブルの原因を最も疑っているところです。それらをバイナリIEEE754に保存するとどうなりますか? – leftaroundabout

答えて

4

PythonとC++の両方でマシンのネイティブフォーマットを使用します。 Pythonのfloatは、 で、C++のdoubleに相当します。 の違いは、 には、 の中間値(Intelの場合)に使用される拡張形式がハードウェアにある場合、アルゴリズムが実装される方法の違い( または)が原因です。値をメモリに戻す—の値は、PythonではC++よりも頻繁に メモリに格納されます。正確なコードが表示されていないと、 はそれ以上のことは言いません(しかし、多くの要素の合計が は要素の順序と相対的な大きさに応じて大きく外れる可能性があります)。

+0

ありがとう!参照または追加入力はありますか? – octoback

+1

参照はhttp://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.htmlです。しかしそれは問題を説明するだけです。大きなシーケンスを合計するなどの場合は、数値処理に関する参照を見つける必要があります。 –