簡體   English   中英

C ++(LAPACK,sgels)和Python(Numpy,lstsq)結果之間的差異

[英]The difference between C++ (LAPACK, sgels) and Python (Numpy, lstsq) results

我正在比較C ++和Python計算的數值結果。 在C ++中,我利用LAPACK的sgels函數來計算線性回歸問題的系數。 在Python中,我將Numpy的linalg.lstsq函數用於類似的任務。

sgels和linalg.lstsq使用的方法之間的數學區別是什么?

在數值上比較結果(即回歸系數)時,預期誤差是多少(例如6個有效數字)?

僅供參考:我絕不是C ++或Python專家,這使得很難理解函數內部發生了什么。

看一下numpy的源代碼,在linalg.py文件中,lstsq依賴於LAPACK的zgelsd()表示復雜,而dgelsd()表示真實。 這是與sgels()的區別:

  • dgelsd()用於doublesgels()用於float 精度有所不同...
  • dgels()使用矩陣A的QR因式分解,並假定A具有最高等級。 矩陣的條件編號必須合理才能獲得明顯的結果。 請參閱本課程以獲取方法的邏輯。 另一方面, dgelsd()利用A的奇異值分解。特別地,A可以是秩不明確的,並且可以根據附加參數rcond或機器精度來確定較小的奇異值。 注意,numpy對於rcond的默認值為-1 :負值表示機器精度。 有關邏輯,請參見本課程
  • 根據LAPACK基准 ,可以預期dgels()dgelsd()快5倍。

如果矩陣條件不佳,您可能會發現sgels()dgelsd()的結果之間存在顯着差異。 實際上,線性回歸的誤差有一個界限,該誤差取決於算法和所使用的rcond()的值。 有關錯誤的估計,請參見LAPACK的用戶指南,有關線性最小二乘法問題的誤差范圍,以及更多詳細信息:有關線性最小二乘問題的誤差范圍,請參見技術詳細信息。

結論是,如果b中的度量准確且易於與解釋變量相關,則可以使用sgels()dgels() 例如,如果將傳感器放置在排氣管的出口處,則很容易猜測哪些電機正在運行。 但是有時,源和度量之間的線性聯系並不確定(根據A項的不確定性),或者基於度量的歧視性污染者變得更加困難(某些污染者遠離傳感器組,並且A病-有條件的)。 在這種情況下, dgelsd()和調整rcond參數可以提供幫助。 如有疑問,請使用dgelsd()並根據LAPACK的用戶指南估算x上的誤差。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM