所謂線性最小平方法,可以理解為是解方程式的延續,差異在於,當未知量遠小於方程式數的時候,將會得到一個無解的問題。最小平方法的實質,是保證誤差最小的情況下對未知數進行賦值。
最小平方法是非常經典的演算法,而且這個名字我們在高中的時候就已經接觸了,屬於極為常用的演算法。先前曾經寫過線性最小平方法的原理,並用Python實現:最小二乘法及其Python實現;以及scipy中非線性最小二乘法的調用方式:非線性最小二乘法(文末補充內容);還有稀疏矩陣的最小平方法:稀疏矩陣最小平方法。
下面講對numpy和scipy中實現的線性最小平方法進行說明,並比較二者的速度。
numpy實作
numpy中便實現了最小二乘法,即lstsq(a,b)用於求解類似於a@x=b中的x,其中,a為M× N的矩陣;則當b為M行的向量時,剛好相當於解線性方程組。對於Ax=b這樣的方程組,如果A是滿秩仿真,那麼可以表示為x=A−1b,否則可以表示為x=(ATA)−1ATb。
當b為M×K的矩陣時,則對每一列,都會計算一組x。
其回傳值共有4個,分別是擬合得到的x、擬合誤差、矩陣a的秩、以及矩陣a的單值形式。
import numpy as np np.random.seed(42) M = np.random.rand(4,4) x = np.arange(4) y = M@x xhat = np.linalg.lstsq(M,y) print(xhat[0]) #[0. 1. 2. 3.]
scipy封裝
scipy.linalg同樣提供了最小平方法函數,函數名稱同樣是lstsq,其參數列表為
lstsq(a, b, cond=None, overwrite_a=False, overwrite_b=False, check_finite=True, lapack_driver=None)
其中a, b即Ax= b,二者皆提供可覆寫開關,設為True可以節省運行時間,此外,函數也支援有限性檢查,這是linalg中許多函數都具備的選項。其傳回值與numpy中的最小平方法函數相同。
cond為浮點型參數,表示奇異值閾值,當奇異值小於cond時將捨棄。
lapack_driver為字串選項,表示選用何種LAPACK中的演算法引擎,可選'gelsd', 'gelsy', 'gelss'。
import scipy.linalg as sl xhat1 = sl.lstsq(M, y) print(xhat1[0]) # [0. 1. 2. 3.]
速度對比
最後,對著兩組最小二乘函數做一個速度上的對比
from timeit import timeit N = 100 A = np.random.rand(N,N) b = np.arange(N) timeit(lambda:np.linalg.lstsq(A, b), number=10) # 0.015487500000745058 timeit(lambda:sl.lstsq(A, b), number=10) # 0.011151800004881807
這一次,二者並沒有拉開太大的差距,即使將矩陣維度放大到500,二者也是半斤八兩。
N = 500 A = np.random.rand(N,N) b = np.arange(N) timeit(lambda:np.linalg.lstsq(A, b), number=10) 0.389679799991427 timeit(lambda:sl.lstsq(A, b), number=10) 0.35642060000100173
補充
Python呼叫非線性最小平方法
簡介與建構子
在在scipy中,非線性最小二乘法的目的是找到一組函數,使得誤差函數的平方和最小,可以表示為如下公式
其中ρ表示損失函數,可以理解為對fi(x)的一次預處理。
scipy.optimize中封裝了非線性最小二乘法函數least_squares,其定義為
least_squares(fun, x0, jac, bounds, method, ftol, xtol, gtol, x_scale, f_scale, loss, jac_sparsity, max_nfev, verbose, args, kwargs)
其中,func和x0為必選參數,func為待求解函數,x0為函數輸入的初值,這兩者無預設值,為必須輸入的參數。
bound為求解區間,預設(−∞,∞),verbose為1時,會有終止輸出,為2時會print更多的運算過程中的資訊。另外下面幾個參數用來控制誤差,比較簡單。
預設值 | #備註 | |
---|---|---|
ftol | 10-8 | 函數容忍度 |
#xtol | 10-8 | 自變數容忍度 |
gtol | 10-8 | 梯度容忍度 |
x_scale | 1.0 | 變數的特徵尺度 |
1.0 | 殘差邊際值 |
以上是Python怎麼呼叫實作最小平方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

選擇Python還是C 取決於項目需求:1)如果需要快速開發、數據處理和原型設計,選擇Python;2)如果需要高性能、低延遲和接近硬件的控制,選擇C 。

通過每天投入2小時的Python學習,可以有效提升編程技能。 1.學習新知識:閱讀文檔或觀看教程。 2.實踐:編寫代碼和完成練習。 3.複習:鞏固所學內容。 4.項目實踐:應用所學於實際項目中。這樣的結構化學習計劃能幫助你係統掌握Python並實現職業目標。

在兩小時內高效學習Python的方法包括:1.回顧基礎知識,確保熟悉Python的安裝和基本語法;2.理解Python的核心概念,如變量、列表、函數等;3.通過使用示例掌握基本和高級用法;4.學習常見錯誤與調試技巧;5.應用性能優化與最佳實踐,如使用列表推導式和遵循PEP8風格指南。

Python適合初學者和數據科學,C 適用於系統編程和遊戲開發。 1.Python簡潔易用,適用於數據科學和Web開發。 2.C 提供高性能和控制力,適用於遊戲開發和系統編程。選擇應基於項目需求和個人興趣。

Python更適合數據科學和快速開發,C 更適合高性能和系統編程。 1.Python語法簡潔,易於學習,適用於數據處理和科學計算。 2.C 語法複雜,但性能優越,常用於遊戲開發和系統編程。

每天投入兩小時學習Python是可行的。 1.學習新知識:用一小時學習新概念,如列表和字典。 2.實踐和練習:用一小時進行編程練習,如編寫小程序。通過合理規劃和堅持不懈,你可以在短時間內掌握Python的核心概念。

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

禪工作室 13.0.1
強大的PHP整合開發環境