2012-03-28 204 views
0

優化後,我使用Python和C++來計算具有最優參數的殘差。結果的差距是巨大的。下面是我如何更精確地進行:Python/C++ - 精度差異

我根據Python中的參數化模型生成數據。我將X和Y存儲在Excel文件中。我在我的C++程序中加載這個文件並運行優化。我想出了最佳參數,這些參數非常接近用於生成系列的參數。然後,我用Python和C++計算殘差(Y和模型輸出之差的平方和)。結果很大,對於參數變化非常敏感的模型,差異可達10^3。這些差異是否可以用不同的方法來處理Python和C++中的精度問題,或者可能會出現其他問題?一旦優化完成,殘差計算就是一個簡單的計算,我不知道問題可能出在哪裏,如果不是精度問題。

非常感謝您的任何建議或參考。

編輯---我可以很容易地顯示生成數據和計算平方殘差總和的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 2012-03-28 08:12:06

+1

是的,與使用finiti-precision浮點器完成的不同計算方法可能會有很大的差異。顯示您的代碼 – 2012-03-28 08:12:25

+0

您將值存儲在_Excel_文件中?那將是我最懷疑造成你的麻煩的原因。如果將它們存儲在二進制IEEE754中會發生什麼? – leftaroundabout 2012-03-28 09:35:37

回答

4

Python和C++都使用機器原生格式; Python的float是 相當於C++的double。任何差異 將是由於在該算法的實現方式的差異, ,如果hardward具有用於 中間值的擴展格式(英特爾的情況下),在何時何地語言 存儲值回到內存—值可能會更多地存儲在 內存在Python比在C + +。在沒有看到確切代碼的情況下,不可能說更多(但是根據元素的順序和相對大小 ,大量元素 的總和可以顯着偏離)。

+0

謝謝!任何參考或額外的輸入? – octoback 2012-03-28 14:27:45

+1

該參考文獻是http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html。但這只是解釋了這個問題。對於像大序列求和這樣的事情,你必須找到一個關於數值處理的參考。 – 2012-03-28 15:29:28