使用 scipy.linalg 在 Python 中使用線性系統(使用驅動器u盤之前需要格式化)
目錄
scipy.linalg 入門
使用 NumPy 處理向量和矩陣
使用便捷函數創建數組
對 NumPy 數組執行操作
將 scipy.linalg 與 numpy.linalg 進行比較
使用 scipy.linalg.solve() 求解線性系統
了解線性系統
使用 scipy.linalg.solve()
解決實際問題:Building a Meal Plan
結論
線性代數廣泛應用于各種學科,一旦您使用向量和線性方程等概念組織信息,您就可以用它來解決許多問題。在 Python 中,與該主題相關的大多數例程都在 中實現scipy.linalg,它提供了非常快速的線性代數功能。
尤其是,線性系統在模擬各種現實世界問題中發揮著重要作用,并scipy.linalg提供了以有效方式研究和解決這些問題的工具。
在本教程中,您將學習如何:
將線性代數概念應用到實際問題中scipy.linalg
使用 Python 和 NumPy處理向量和矩陣
使用線性系統模擬實際問題
如何使用線性系統求解?scipy.linalg
讓我們開始吧!
入門?scipy.linalg
SciPy是一個用于科學計算的開源 Python 庫,包括用于科學和工程中常見任務的幾個模塊,例如線性代數、優化、積分、插值和信號處理。它是SciPy 堆棧的一部分,其中包括其他幾個用于科學計算的包,例如NumPy、Matplotlib、SymPy、IPython和pandas。
線性代數是數學的一個分支,涉及線性方程及其使用向量和矩陣的表示。它是用于多個工程領域的基礎學科,也是深入了解機器學習的先決條件。
scipy.linalg包括用于處理線性代數問題的多種工具,包括用于執行矩陣計算的函數,例如行列式、逆矩陣、特征值、特征向量和奇異值分解。
在本教程中,您將使用 from 的一些函數scipy.linalg來解決涉及線性系統的實際問題。為了使用scipy.linalg,您必須安裝和設置 SciPy 庫,您可以使用Anaconda?Python 發行版和conda包和環境管理系統來完成。
注意:要了解有關 Anaconda 和 conda 的更多信息,請查看在 Windows 上設置 Python 進行機器學習。
首先,創建一個 conda 環境并激活它:
$ conda create --name linalg $ conda activate linalg
激活 conda 環境后,您的提示將顯示其名稱linalg.?然后你可以在環境中安裝必要的包:
(linalg) $ conda install scipy jupyter
執行此命令后,系統應該需要一段時間才能確定依賴項并繼續安裝。
注意:除了 SciPy,您還將使用Jupyter Notebook在交互式環境中運行代碼。這樣做不是強制性的,但它有助于處理數值和科學應用程序。
有關使用 Jupyter Notebooks 的復習,請查看Jupyter Notebook:簡介。
如果您更喜歡使用不同的 Python 發行版和pip包管理器來閱讀本文,請展開下面的可折疊部分以了解如何設置您的環境。
設置環境使用?pip顯示隱藏
在打開 Jupyter Notebook 之前,您需要注冊 condalinalg環境,以便您可以使用它作為內核來創建 Notebook。為此,在linalg激活環境的情況下,運行以下命令:
(linalg) $ python -m ipykernel install --user --name linalg
現在您可以通過運行以下命令打開 Jupyter Notebook:
$ jupyter notebook
在瀏覽器中加載Jupyter后,通過點擊創建一個新的筆記本電腦新→?linalg,如下圖所示:
內的筆記本電腦,你可以測試是否安裝成功通過導入的scipy包:
>>>
In [1]: import scipy
現在您已經完成了環境的設置,您將看到如何在 Python 中使用向量和矩陣,這是使用scipy.linalg線性代數應用程序的基礎。
使用 NumPy 處理向量和矩陣
甲矢量是用來表示物理量同時具有大小和方向的數學實體。它是解決工程和機器學習問題的基本工具,就像矩陣一樣,用于表示向量變換等應用程序。
NumPy是Python 中處理矩陣和向量最常用的庫,用于處理scipy.linalg線性代數應用程序。在本節中,您將了解使用它創建矩陣和向量并對其執行操作的基礎知識。
要開始處理矩陣和向量,您需要在 Jupyter Notebook 中做的第一件事是導入numpy.?通常的方法是使用別名np:
>>>
In [2]: import numpy as np
為了表示矩陣和向量,NumPy 使用一種稱為ndarray.
要創建ndarray對象,您可以使用np.array(),它需要一個類似數組的對象,例如列表或嵌套列表。
例如,假設您需要創建以下矩陣:
要使用 NumPy 創建它,您可以使用np.array(),提供一個包含矩陣每一行元素的嵌套列表:
>>>
In [3]: A = np.array([[1, 2], [3, 4], [5, 6]]) ...: A Out[3]: array([[1, 2], [3, 4], [5, 6]])
您可能會注意到,NumPy 提供了矩陣的可視化表示,您可以在其中識別其列和行。
值得注意的是,NumPy 數組的元素必須是相同類型的。您可以使用以下方法檢查 NumPy 數組的類型.dtype:
>>>
In [4]: A.dtype Out[4]: dtype('int64')
由于 的所有元素A都是整數,因此數組是用 type 創建的int64。如果元素之一是float,則將使用 type 創建數組float64:
In [5]: A = np.array([[1.0, 2], [3, 4], [5, 6]]) ...: A Out[5]: array([[1., 2.], [3., 4.], [5., 6.]]) In [6]: A.dtype Out[6]: dtype('float64')
要檢查ndarray對象的尺寸,您可以使用.shape.?例如,要檢查 的尺寸A,您可以使用A.shape:
>>>
In [7]: A.shape Out[7]: (3, 2)
正如預期的那樣,A矩陣的維度是3×2因為A有三行和兩列。
在處理涉及矩陣的問題時,您通常需要使用轉置操作,它交換矩陣的列和行。
要轉置由ndarray對象表示的向量或矩陣,您可以使用.transpose()或.T。例如,你可以得到的轉A用A.T:
In [8]: A.T Out[8]: array([[1., 3., 5.], [2., 4., 6.]])
通過換位,列A變成了行,A.T行變成了列。
要創建向量,您可以使用np.array(),提供包含向量元素的列表:
>>>
In [9]: v = np.array([1, 2, 3]) ...: v Out[9]: array([1, 2, 3])
要檢查向量的維度,您可以.shape像以前一樣使用:
>>>
In [10]: v.shape Out[10]: (3,)
請注意,此向量的形狀是(3,)and not?(3, 1)or?(1, 3)。這是一個 NumPy 功能,適用于那些習慣使用MATLAB 的人。在 NumPy 中,可以創建一維數組,例如v,這在執行矩陣和向量之間的操作時可能會導致問題。例如,轉置操作對一維數組沒有影響。
每當您向 提供類似一維數組的參數時np.array(),生成的數組將是一維數組。要創建二維數組,您必須提供類似二維數組的參數,例如嵌套列表:
>>>
In [11]: v = np.array([[1, 2, 3]]) ...: v.shape Out[11]: (1, 3)
在上述例子中,尺寸v是1×?3,其對應于一個兩維的線矢量的尺寸。要創建列向量,您可以使用嵌套列表:
>>>
In [12]: v = np.array([[1], [2], [3]]) ...: v.shape Out[12]: (3, 1)
在這種情況下,尺寸v為3×?1,其對應于一個兩維列向量的尺寸。
使用嵌套列表創建向量可能很費力,尤其是對于使用最多的列向量。作為替代方案,您可以創建一個一維向量,為 提供一個平面列表np.array,并用于.reshape()更改ndarray對象的維度:
In [13]: v = np.array([1, 2, 3]).reshape(3, 1) ...: v.shape Out[13]: (3, 1)
在上面的示例中,您使用從.reshape()形狀(3, 1)為 的一維向量獲取形狀的列向量(3,)。值得一提的是,.reshape()期望新數組的元素數與原數組的元素數兼容。換句話說,具有新形狀的數組中的元素數必須等于原始數組中的元素數。
在這個例子中,你也可以在.reshape()不明確定義數組行數的情況下使用:
>>>
In [14]: v = np.array([1, 2, 3]).reshape(-1, 1) ...: v.shape Out[14]: (3, 1)
在這里,-1您提供的參數.reshape()表示新數組只有一列所需的行數,如第二個參數所指定。在這種情況下,由于原始數組具有三個元素,因此新數組的行數將為3。
在實際應用中,您經常需要創建零、一或隨機元素的矩陣。為此,NumPy 提供了一些方便的函數,接下來您將看到這些函數。
使用便捷函數創建數組
NumPy 還提供了一些方便的函數來創建數組。例如,要創建一個填充零的數組,您可以使用np.zeros():
>>>
In [15]: A = np.zeros((3, 2)) ...: A Out[15]: array([[0., 0.], [0., 0.], [0., 0.]])
作為它的第一個參數,np.zeros()需要一個元組來指示您要創建的數組的形狀,它返回一個類型為 的數組float64。
同樣,要創建填充數組,您可以使用np.ones():
>>>
In [16]: A = np.ones((2, 3)) ...: A Out[16]: array([[1., 1., 1.], [1., 1., 1.]])
值得注意的是,np.ones()它還返回一個類型為 的數組float64。
要創建具有隨機元素的數組,您可以使用np.random.rand():
In [17]: A = np.random.rand(3, 2) ...: A Out[17]: array([[0.8206045 , 0.54470809], [0.9490381 , 0.05677859], [0.71148476, 0.4709059 ]])
np.random.rand()返回一個包含從0到 的隨機元素的數組1,取自均勻分布。請注意,與np.zeros()and不同np.ones(),np.random.rand()它不期望元組作為其參數。
同樣,要從均值和單位方差為零的正態分布中獲取隨機元素的數組,您可以使用np.random.randn():
>>>
In [18]: A = np.random.randn(3, 2) ...: A Out[18]: array([[-1.20019512, -1.78337814], [-0.22135221, -0.38805899], [ 0.17620202, -2.05176764]])
現在您已經創建了數組,您將看到如何使用它們執行操作。
對 NumPy 數組執行操作
在數組上使用加法 (?+)、減法 (?-)、乘法 (?*)、除法 (?/) 和指數 (?**) 運算符的常見 Python 運算始終按元素執行。如果操作數之一是標量,則將在標量和數組的每個元素之間執行操作。
例如,為了創建填充元素的矩陣等于10,則可以使用np.ones()由和乘法的輸出10使用*:
>>>
In [19]: A = 10 * np.ones((2, 2)) ...: A Out[19]: array([[10., 10.], [10., 10.]])
如果兩個操作數都是相同形狀的數組,則將在數組的對應元素之間執行操作:
>>>
In [20]: A = 10 * np.ones((2, 2)) ...: B = np.array([[2, 2], [5, 5]]) ...: C = A * B ...: C Out[20]: array([[20., 20.], [50., 50.]])
在這里,您將 matrixA的每個元素乘以 matrix的相應元素B。
要根據線性代數規則執行矩陣乘法,您可以使用np.dot():
>>>
In [21]: A = np.array([[1, 2], [3, 4]]) ...: v = np.array([[5], [6]]) ...: x = np.dot(A, v) ...: x Out[21]: array([[17], [39]])
在這里,您乘以一個 2 × 2 矩陣A,該矩陣由一個名為的 2 × 1 向量命名v。
您可以使用@運算符獲得相同的結果,從PEP 465 和 Python 3.5 開始,?NumPy 和本機 Python 都支持該運算符:
>>>
In [22]: A = np.array([[1, 2], [3, 4]]) ...: v = np.array([[5], [6]]) ...: x = A @ v ...: x Out[22]: array([[17], [39]])
除了處理矩陣和向量的基本操作外,NumPy 還提供了一些特定的函數來處理numpy.linalg.?但是,對于這些應用程序,它scipy.linalg具有一些優勢,您將在下面看到。
比較scipy.linalg用numpy.linalg
NumPy 在numpy.linalg模塊中包含一些用于處理線性代數應用程序的工具。但是,除非您不想將 SciPy 作為依賴項添加到項目中,否則通常最好使用scipy.linalg,原因如下:
由于在解釋官方文檔,scipy.linalg包含了所有的功能numpy.linalg再加上一些額外的高級功能,不包括在numpy.linalg。
scipy.linalg編譯時始終支持BLAS和LAPACK,這些庫包括用于以優化方式執行數值運算的例程。對于numpy.linalg,BLAS 和 LAPACK 的使用是可選的。因此,根據您安裝 NumPy 的方式,scipy.linalg函數可能比numpy.linalg.
總之,考慮到科學和技術應用一般沒有關于限制的依賴,它通常是一個好主意,安裝SciPy的和使用scipy.linalg代替numpy.linalg。
在下一節中,您將使用scipy.linalg工具來處理線性系統。您將首先通過一個簡單的示例了解基礎知識,然后將這些概念應用于實際問題。
使用scipy.linalg.solve()求解線性系統
線性系統可以成為解決幾個實際和重要問題的有用工具,包括與車輛交通、平衡化學方程式、電路和多項式插值相關的問題。
在本節中,您將學習如何使用scipy.linalg.solve()來求解線性系統。但是在開始編寫代碼之前,了解基礎知識很重要。
了解線性系統
甲線性系統,或者更精確地說,線性方程系統,是一組直線與一組變量方程。以下是與變量x??、x?? 和x??相關的線性系統示例:
這里有涉及三個變量的三個方程。為了有一個線性系統,值???...????和b??...?b??必須是常數。
當只有兩個或三個方程和變量時,可以手動執行計算、組合方程并找到變量的值。但是,對于四個或更多變量,手動求解線性系統需要相當長的時間,并且經常會出錯。
實際應用通常涉及大量變量,這使得手動求解線性系統是不可行的。幸運的是,有一些工具可以完成這項艱巨的工作,例如scipy.linalg.solve().
使用?scipy.linalg.solve()
SciPy 提供scipy.linalg.solve()快速且可靠的方式求解線性系統。要了解它是如何工作的,請考慮以下系統:
為了使用scipy.linalg.solve(),您首先需要將線性系統寫為矩陣乘積,如下面的等式所示:
請注意,您將在計算矩陣乘積后得出系統的原始方程。scipy.linalg.solve()期望求解的輸入是 matrixA和 vector?b,您可以使用 NumPy 數組定義它們。這樣,您可以使用以下代碼解決系統問題:
>>>
1In [1]: import numpy as np 2 ...: from scipy.linalg import solve 3 4In [2]: A = np.array( 5 ...: [ 6 ...: [3, 2], 7 ...: [2, -1], 8 ...: ] 9 ...: ) 10 11In [3]: b = np.array([12, 1]).reshape((2, 1)) 12 13In [4]: x = solve(A, b) 14 ...: x 15Out[4]: 16array([[2.], 17 [3.]])
以下是正在發生的事情的細分:
第 1 行和第 2 行導入 NumPynp以及solve()from?scipy.linalg。
第 4 到 9 行使用名為 的 NumPy 數組創建系數矩陣A。
第 11 行使用名為 的 NumPy 數組創建獨立項向量b。要使其成為具有兩行的列向量,請使用.reshape((2, 1)).
第 13 行和第 14 行調用solve()求解由A和表征的線性系統b,結果存儲在 中x,并打印出來。請注意solve(),即使原始數組的所有元素都是整數,也會返回帶有浮點分量的解。
如果將原始方程中的x??=2 和x??=3替換,則可以驗證這是系統的解。
現在您已經了解了使用的基礎知識scipy.linalg.solve(),是時候了解線性系統的實際應用了。
解決實際問題:Building a Meal Plan
通常使用線性系統解決的一類問題是當您需要找到獲得某種混合物所需的組件比例時。下面,您將使用這個想法來制定膳食計劃,混合不同的食物以獲得均衡的飲食。
為此,請考慮均衡飲食應包括以下內容:
170單位維生素A
180單位維生素B
140單位維生素C
180 單位維生素 D
350 單位維生素 E
你的任務是找出每種不同食物的數量,以獲得指定數量的維生素。在下表中,您可以根據每種維生素的單位分析 1 克每種食物的結果:
你的任務是找出每種不同食物的數量,以獲得指定數量的維生素。在下表中,您可以根據每種維生素的單位分析 1 克每種食物的結果:
通過將食物 1 表示為x?? 等,并考慮到您將混合x?? 單位的食物 1、x?2 單位的食物 2 等等,您可以寫出您所攝入的維生素 A 量的表達式d 進入組合。考慮到均衡飲食應包含 170 個單位的維生素 A,您 可以使用維生素 A 列中的數據寫出以下等式:
對維生素 B、C、D 和 E 重復相同的過程,您會得到以下線性系統:
要使用scipy.linalg.solve(),您必須獲得系數矩陣A和獨立項向量b,它們由以下給出:
現在您只需使用scipy.linalg.solve()來找出數量x??, …,?x??:
>>>
In [1]: import numpy as np ...: from scipy.linalg import solve In [2]: A = np.array( ...: [ ...: [1, 9, 2, 1, 1], ...: [10, 1, 2, 1, 1], ...: [1, 0, 5, 1, 1], ...: [2, 1, 1, 2, 9], ...: [2, 1, 2, 13, 2], ...: ] ...: ) In [3]: b = np.array([170, 180, 140, 180, 350]).reshape((5, 1)) In [4]: x = solve(A, b) ...: x Out[4]: array([[10.], [10.], [20.], [20.], [10.]])
這表明均衡飲食應包括10食物單位 1、食物10單位 2、20食物20單位3、食物單位 4 和10食物單位 5。
結論
恭喜!您已經學習了如何使用一些線性代數概念以及如何使用scipy.linalg來解決涉及線性系統的問題。您已經看到向量和矩陣可用于表示數據,并且通過使用線性代數概念,您可以對實際問題進行建模并以有效的方式解決它們。
在本教程中,您學習了如何:
將線性代數概念應用到實際問題中scipy.linalg
使用 Python 和 NumPy處理向量和矩陣
使用線性系統模擬實際問題
使用求解線性系統?scipy.linalg
線性代數是一個非常廣泛的話題。有關其他一些線性代數應用程序的更多信息,請查看以下資源:
科學 Python:使用 SciPy 進行優化
實踐線性規劃:使用 Python 進行優化
NumPy、SciPy 和 Pandas:與 Python 的相關性
繼續學習,隨時在下面留下任何問題或評論!
Python 數據結構 機器學習
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。