[英]What is the difference between numpy.linalg.lstsq and scipy.linalg.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()
用於double
而sgels()
用於float
。 精度有所不同... dgels()
使用矩陣A的QR因式分解,並假定A具有最高等級。 矩陣的條件編號必須合理才能獲得明顯的結果。 請參閱本課程以獲取方法的邏輯。 另一方面, dgelsd()
利用A的奇異值分解。特別地,A可以是秩不明確的,並且可以根據附加參數rcond
或機器精度來確定較小的奇異值。 注意,numpy對於rcond
的默認值為-1
:負值表示機器精度。 有關邏輯,請參見本課程 。 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.