安徽思成儀器技術(shù)有限公司
暫無(wú)信息 |
閱讀:22發(fā)布時(shí)間:2024-11-23
摘要:將線性代數(shù)概念應(yīng)用到實(shí)際問(wèn)題中scipy.linalg 使用 Python 和 NumPy處理向量和矩陣 使用線性系統(tǒng)模擬實(shí)際問(wèn)題 使用求解線性系統(tǒng) scipy.linalg
本文分享自華為云社區(qū)《使用scipy.linalg在Python中使用線性系統(tǒng)》,作者:Yuchuan。
線性代數(shù)廣泛應(yīng)用于各種學(xué)科,一旦您使用向量和線性方程等概念組織信息,您就可以用它來(lái)解決許多問(wèn)題。在Python中,與該主題相關(guān)的大多數(shù)例程都在中實(shí)現(xiàn)scipy.linalgpython創(chuàng)建矩陣,它提供了非??焖俚木€性代數(shù)功能。
尤其是,線性系統(tǒng)在模擬各種現(xiàn)實(shí)世界問(wèn)題中發(fā)揮著重要作用,并scipy.linalg提供了以有效方式研究和解決這些問(wèn)題的工具。
在本教程中,您將學(xué)習(xí)如何:
讓我們開(kāi)始吧!
入門(mén)scipy.linalg
SciPy是一個(gè)用于科學(xué)計(jì)算的開(kāi)源Python庫(kù),包括用于科學(xué)和工程中常見(jiàn)任務(wù)的幾個(gè)模塊,例如線性代數(shù)、優(yōu)化、積分、插值和信號(hào)處理。它是SciPy堆棧的一部分,其中包括其他幾個(gè)用于科學(xué)計(jì)算的包,例如NumPy、Matplotlib、SymPy、IPython和pandas。
線性代數(shù)是數(shù)學(xué)的一個(gè)分支,涉及線性方程及其使用向量和矩陣的表示。它是用于多個(gè)工程領(lǐng)域的基礎(chǔ)學(xué)科,也是深入了解機(jī)器學(xué)習(xí)的先決條件。
scipy.linalg包括用于處理線性代數(shù)問(wèn)題的多種工具,包括用于執(zhí)行矩陣計(jì)算的函數(shù),例如行列式、逆矩陣、特征值、特征向量和奇異值分解。
在本教程中,您將使用from的一些函數(shù)scipy.linalg來(lái)解決涉及線性系統(tǒng)的實(shí)際問(wèn)題。為了使用scipy.linalg,您必須安裝和設(shè)置SciPy庫(kù),您可以使用AnacondaPython發(fā)行版和conda包和環(huán)境管理系統(tǒng)來(lái)完成。
注意:要了解有關(guān)Anaconda和conda的更多信息,請(qǐng)查看在Windows上設(shè)置Python進(jìn)行機(jī)器學(xué)習(xí)。
首先,創(chuàng)建一個(gè)conda環(huán)境并激活它:
$condacreate--namelinalg$condaactivatelinalg
激活conda環(huán)境后,您的提示將顯示其名稱(chēng)linalg.然后你可以在環(huán)境中安裝必要的包:
(linalg)$condainstallscipyjupyter
執(zhí)行此命令后,系統(tǒng)應(yīng)該需要一段時(shí)間才能確定依賴(lài)項(xiàng)并繼續(xù)安裝。
注意:除了SciPy,您還將使用JupyterNotebook在交互式環(huán)境中運(yùn)行代碼。這樣做不是強(qiáng)制性的,但它有助于處理數(shù)值和科學(xué)應(yīng)用程序。
有關(guān)使用JupyterNotebooks的復(fù)習(xí),請(qǐng)查看JupyterNotebook:簡(jiǎn)介。
如果您更喜歡使用不同的Python發(fā)行版和pip包管理器來(lái)閱讀本文,請(qǐng)展開(kāi)下面的可折疊部分以了解如何設(shè)置您的環(huán)境。
設(shè)置環(huán)境使用pip顯示隱藏
在打開(kāi)JupyterNotebook之前,您需要注冊(cè)condalinalg環(huán)境,以便您可以使用它作為內(nèi)核來(lái)創(chuàng)建Notebook。為此,在linalg激活環(huán)境的情況下,運(yùn)行以下命令:
(linalg)$python-mipykernelinstall--user--namelinalg
現(xiàn)在您可以通過(guò)運(yùn)行以下命令打開(kāi)JupyterNotebook:
$jupyternotebook
在瀏覽器中加載Jupyter后,通過(guò)點(diǎn)擊創(chuàng)建一個(gè)新的筆記本電腦新→linalg,如下圖所示:
內(nèi)的筆記本電腦,你可以測(cè)試是否安裝成功通過(guò)導(dǎo)入的scipy包:
>>>
In[1]:importscipy
現(xiàn)在您已經(jīng)完成了環(huán)境的設(shè)置,您將看到如何在Python中使用向量和矩陣,這是使用scipy.linalg線性代數(shù)應(yīng)用程序的基礎(chǔ)。
使用NumPy處理向量和矩陣
甲矢量是用來(lái)表示物理量同時(shí)具有大小和方向的數(shù)學(xué)實(shí)體。它是解決工程和機(jī)器學(xué)習(xí)問(wèn)題的基本工具,就像矩陣一樣,用于表示向量變換等應(yīng)用程序。
NumPy是Python中處理矩陣和向量的庫(kù),用于處理scipy.linalg線性代數(shù)應(yīng)用程序。在本節(jié)中,您將了解使用它創(chuàng)建矩陣和向量并對(duì)其執(zhí)行操作的基礎(chǔ)知識(shí)。
要開(kāi)始處理矩陣和向量,您需要在JupyterNotebook中做的件事是導(dǎo)入numpy.通常的方法是使用別名np:
>>>
In[2]:importnumpyasnp
為了表示矩陣和向量,NumPy使用一種稱(chēng)為ndarray.
要?jiǎng)?chuàng)建ndarray對(duì)象,您可以使用np.array(),它需要一個(gè)類(lèi)似數(shù)組的對(duì)象,例如列表或嵌套列表。
例如,假設(shè)您需要?jiǎng)?chuàng)建以下矩陣:
要使用NumPy創(chuàng)建它,您可以使用np.array(),提供一個(gè)包含矩陣每一行元素的嵌套列表:
>>>
In[3]:A=np.array([[1,2],[3,4],[5,6]])...:AOut[3]:
array([[1,2],[3,4],[5,6]])
您可能會(huì)注意到,NumPy提供了矩陣的可視化表示,您可以在其中識(shí)別其列和行。
值得注意的是,NumPy數(shù)組的元素必須是相同類(lèi)型的。您可以使用以下方法檢查NumPy數(shù)組的類(lèi)型.dtype:
>>>
In[4]:A.dtypeOut[4]:dtype('int64')
由于的所有元素A都是整數(shù),因此數(shù)組是用type創(chuàng)建的int64。如果元素之一是float,則將使用type創(chuàng)建數(shù)組float64:
In[5]:A=np.array([[1.0,2],[3,4],[5,6]])...:AOut[5]:array([[1.,2.],[3.,4.],[5.,6.]])In[6]:A.dtypeOut[6]:dtype('float64')
要檢查ndarray對(duì)象的尺寸,您可以使用.shape.例如,要檢查的尺寸A,您可以使用A.shape:
>>>
In[7]:A.shapeOut[7]:(3,2)
正如預(yù)期的那樣,A矩陣的維度是3×2因?yàn)锳有三行和兩列。
在處理涉及矩陣的問(wèn)題時(shí),您通常需要使用轉(zhuǎn)置操作,它交換矩陣的列和行。
要轉(zhuǎn)置由ndarray對(duì)象表示的向量或矩陣,您可以使用.transpose()或.T。例如,你可以得到的轉(zhuǎn)A用A.T:
In[8]:A.TOut[8]:array([[1.,3.,5.],[2.,4.,6.]])
通過(guò)換位,列A變成了行,A.T行變成了列。
要?jiǎng)?chuàng)建向量,您可以使用np.array(),提供包含向量元素的列表:
>>>
In[9]:v=np.array([1,2,3])...:vOut[9]:array([1,2,3])
要檢查向量的維度,您可以.shape像以前一樣使用:
>>>
In[10]:v.shapeOut[10]:(3,)
請(qǐng)注意,此向量的形狀是(3,)andnot(3,1)or(1,3)。這是一個(gè)NumPy功能,適用于那些習(xí)慣使用MATLAB的人。在NumPy中,可以創(chuàng)建一維數(shù)組,例如v,這在執(zhí)行矩陣和向量之間的操作時(shí)可能會(huì)導(dǎo)致問(wèn)題。例如,轉(zhuǎn)置操作對(duì)一維數(shù)組沒(méi)有影響。
每當(dāng)您向提供類(lèi)似一維數(shù)組的參數(shù)時(shí)np.array(),生成的數(shù)組將是一維數(shù)組。要?jiǎng)?chuàng)建二維數(shù)組,您必須提供類(lèi)似二維數(shù)組的參數(shù),例如嵌套列表:
>>>
In[11]:v=np.array([[1,2,3]])...:v.shapeOut[11]:(1,3)
在上述例子中,尺寸v是1×3,其對(duì)應(yīng)于一個(gè)兩維的線矢量的尺寸。要?jiǎng)?chuàng)建列向量,您可以使用嵌套列表:
>>>
In[12]:v=np.array([[1],[2],[3]])...:v.shapeOut[12]:(3,1)
在這種情況下,尺寸v為3×1,其對(duì)應(yīng)于一個(gè)兩維列向量的尺寸。
使用嵌套列表創(chuàng)建向量可能很費(fèi)力,尤其是對(duì)于使用最多的列向量。作為替代方案,您可以創(chuàng)建一個(gè)一維向量,為提供一個(gè)平面列表np.array,并用于.reshape()更改ndarray對(duì)象的維度:
In[13]:v=np.array([1,2,3]).reshape(3,1)...:v.shapeOut[13]:(3,1)
在上面的示例中,您使用從.reshape()形狀(3,1)為的一維向量獲取形狀的列向量(3,)。值得一提的是,.reshape()期望新數(shù)組的元素?cái)?shù)與原數(shù)組的元素?cái)?shù)兼容。換句話說(shuō),具有新形狀的數(shù)組中的元素?cái)?shù)必須等于原始數(shù)組中的元素?cái)?shù)。
在這個(gè)例子中,你也可以在.reshape()不明確定義數(shù)組行數(shù)的情況下使用:
>>>
In[14]:v=np.array([1,2,3]).reshape(-1,1)...:v.shapeOut[14]:(3,1)
在這里,-1您提供的參數(shù).reshape()表示新數(shù)組只有一列所需的行數(shù),如第二個(gè)參數(shù)所。在這種情況下,由于原始數(shù)組具有三個(gè)元素,因此新數(shù)組的行數(shù)將為3。
在實(shí)際應(yīng)用中,您經(jīng)常需要?jiǎng)?chuàng)建零、一或隨機(jī)元素的矩陣。為此,NumPy提供了一些方便的函數(shù),接下來(lái)您將看到這些函數(shù)。
使用便捷函數(shù)創(chuàng)建數(shù)組
NumPy還提供了一些方便的函數(shù)來(lái)創(chuàng)建數(shù)組。例如,要?jiǎng)?chuàng)建一個(gè)填充零的數(shù)組,您可以使用np.zeros():
>>>
In[15]:A=np.zeros((3,2))...:AOut[15]:array([[0.,0.],[0.,0.],[0.,0.]])
作為它的個(gè)參數(shù),np.zeros()需要一個(gè)元組來(lái)指示您要?jiǎng)?chuàng)建的數(shù)組的形狀,它返回一個(gè)類(lèi)型為的數(shù)組float64。
同樣,要?jiǎng)?chuàng)建填充數(shù)組,您可以使用np.ones():
>>>
In[16]:A=np.ones((2,3))...:AOut[16]:array([[1.,1.,1.],[1.,1.,1.]])
值得注意的是,np.ones()它還返回一個(gè)類(lèi)型為的數(shù)組float64。
要?jiǎng)?chuàng)建具有隨機(jī)元素的數(shù)組,您可以使用np.random.rand():
In[17]:A=np.random.rand(3,2)...:AOut[17]:array([[0.8206045,0.],[0.9490381,0.],[0.,0.4709059]])
np.random.rand()返回一個(gè)包含從0到的隨機(jī)元素的數(shù)組1,取自均勻分布。請(qǐng)注意,與np.zeros()and不同np.ones(),np.random.rand()它不期望元組作為其參數(shù)。
同樣,要從均值和單位方差為零的正態(tài)分布中獲取隨機(jī)元素的數(shù)組,您可以使用np.random.randn():
>>>
In[18]:A=np.random.randn(3,2)...:AOut[18]:array([[-1.,-1.],[-0.,-0.],[0.,-2.]])
現(xiàn)在您已經(jīng)創(chuàng)建了數(shù)組,您將看到如何使用它們執(zhí)行操作。
對(duì)NumPy數(shù)組執(zhí)行操作
在數(shù)組上使用加法(+)、減法(-)、乘法(*)、除法(/)和指數(shù)(**)運(yùn)算符的常見(jiàn)Python運(yùn)算始終按元素執(zhí)行。如果操作數(shù)之一是標(biāo)量,則將在標(biāo)量和數(shù)組的每個(gè)元素之間執(zhí)行操作。
例如,為了創(chuàng)建填充元素的矩陣等于10,則可以使用np.ones()由和乘法的輸出10使用*:
>>>
In[19]:A=10*np.ones((2,2))...:AOut[19]:array([[10.,10.],[10.,10.]])
如果兩個(gè)操作數(shù)都是相同形狀的數(shù)組,則將在數(shù)組的對(duì)應(yīng)元素之間執(zhí)行操作:
>>>
In[20]:A=10*np.ones((2,2))...:B=np.array([[2,2],[5,5]])...:C=A*B...:COut[20]:array([[20.,20.],[50.,50.]])
在這里,您將matrixA的每個(gè)元素乘以matrix的相應(yīng)元素B。
要根據(jù)線性代數(shù)規(guī)則執(zhí)行矩陣乘法,您可以使用np.dot():
>>>
In[21]:A=np.array([[1,2],[3,4]])...:v=np.array([[5],[6]])...:x=np.dot(A,v)...:xOut[21]:array([[17],[39]])
在這里,您乘以一個(gè)2×2矩陣A,該矩陣由一個(gè)名為的2×1向量命名v。
您可以使用@運(yùn)算符獲得相同的結(jié)果,從PEP465和Python3.5開(kāi)始,NumPy和本機(jī)Python都支持該運(yùn)算符:
>>>
In[22]:A=np.array([[1,2],[3,4]])...:v=np.array([[5],[6]])...:x=A@v...:xOut[22]:array([[17],[39]])
除了處理矩陣和向量的基本操作外,NumPy還提供了一些特定的函數(shù)來(lái)處理numpy.linalg.但是,對(duì)于這些應(yīng)用程序,它scipy.linalg具有一些優(yōu)勢(shì),您將在下面看到。
比較scipy.linalg用numpy.linalg
NumPy在numpy.linalg模塊中包含一些用于處理線性代數(shù)應(yīng)用程序的工具。但是,除非您不想將SciPy作為依賴(lài)項(xiàng)添加到項(xiàng)目中,否則通常使用scipy.linalg,原因如下:
總之,考慮到科學(xué)和技術(shù)應(yīng)用一般沒(méi)有關(guān)于限制的依賴(lài),它通常是一個(gè)好主意,安裝SciPy的和使用scipy.linalg代替numpy.linalg。
在下一節(jié)中,您將使用scipy.linalg工具來(lái)處理線性系統(tǒng)。您將首先通過(guò)一個(gè)簡(jiǎn)單的示例了解基礎(chǔ)知識(shí),然后將這些概念應(yīng)用于實(shí)際問(wèn)題。
使用scipy.linalg.solve()求解線性系統(tǒng)
線性系統(tǒng)可以成為解決幾個(gè)實(shí)際和重要問(wèn)題的有用工具,包括與車(chē)輛交通、平衡化學(xué)方程式、電路和多項(xiàng)式插值相關(guān)的問(wèn)題。
在本節(jié)中,您將學(xué)習(xí)如何使用scipy.linalg.solve()來(lái)求解線性系統(tǒng)。但是在開(kāi)始編寫(xiě)代碼之前,了解基礎(chǔ)知識(shí)很重要。
了解線性系統(tǒng)
甲線性系統(tǒng),或者更精確地說(shuō),線性方程系統(tǒng),是一組直線與一組變量方程。以下是與變量x?、x?和x?相關(guān)的線性系統(tǒng)示例:
這里有涉及三個(gè)變量的三個(gè)方程。為了有一個(gè)線性系統(tǒng),值??...??和b?...b?必須是常數(shù)。
當(dāng)只有兩個(gè)或三個(gè)方程和變量時(shí),可以手動(dòng)執(zhí)行計(jì)算、組合方程并找到變量的值。但是,對(duì)于四個(gè)或更多變量,手動(dòng)求解線性系統(tǒng)需要相當(dāng)長(zhǎng)的時(shí)間,并且經(jīng)常會(huì)出錯(cuò)。
實(shí)際應(yīng)用通常涉及大量變量,這使得手動(dòng)求解線性系統(tǒng)是不可行的。幸運(yùn)的是,有一些工具可以完成這項(xiàng)艱巨的工作,例如scipy.linalg.solve().
使用scipy.linalg.solve()
SciPy提供scipy.linalg.solve()快速且可靠的方式求解線性系統(tǒng)。要了解它是如何工作的,請(qǐng)考慮以下系統(tǒng):
為了使用scipy.linalg.solve(),您首先需要將線性系統(tǒng)寫(xiě)為矩陣乘積,如下面的等式所示:
請(qǐng)注意,您將在計(jì)算矩陣乘積后得出系統(tǒng)的原始方程。scipy.linalg.solve()期望求解的輸入是matrixA和vectorb,您可以使用NumPy數(shù)組定義它們。這樣,您可以使用以下代碼解決系統(tǒng)問(wèn)題:
>>>
1In[1]:importnumpyasnp2...:fromscipy.linalgimportsolve34In[2]:A=np.array(5...:[6...:[3,2],7...:[2,-1],8...:]9...:)1011In[3]:b=np.array([12,1]).reshape((2,1))1213In[4]:x=solve(A,b)14...:x
15Out[4]:16array([[2.],17[3.]])
以下是正在發(fā)生的事情的細(xì)分:
如果將原始方程中的x?=2和x?=3替換,則可以驗(yàn)證這是系統(tǒng)的解。
現(xiàn)在您已經(jīng)了解了使用的基礎(chǔ)知識(shí)scipy.linalg.solve(),是時(shí)候了解線性系統(tǒng)的實(shí)際應(yīng)用了。
解決實(shí)際問(wèn)題:BuildingaMealPlan
通常使用線性系統(tǒng)解決的一類(lèi)問(wèn)題是當(dāng)您需要找到獲得某種混合物所需的組件比例時(shí)。下面,您將使用這個(gè)想法來(lái)制定膳食計(jì)劃,混合不同的食物以獲得均衡的飲食。
為此python創(chuàng)建矩陣,請(qǐng)考慮均衡飲食應(yīng)包括以下內(nèi)容:
你的任務(wù)是找出每種不同食物的數(shù)量,以獲得數(shù)量的維生素。在下表中,您可以根據(jù)每種維生素的單位分析1克每種食物的結(jié)果:
你的任務(wù)是找出每種不同食物的數(shù)量,以獲得數(shù)量的維生素。在下表中,您可以根據(jù)每種維生素的單位分析1克每種食物的結(jié)果:
通過(guò)將食物1表示為x?等,并考慮到您將混合x(chóng)?單位的食物1、x2單位的食物2等等,您可以寫(xiě)出您所攝入的量的表達(dá)式d進(jìn)入組合??紤]到均衡飲食應(yīng)包含170個(gè)單位的,您??可以使用列中的數(shù)據(jù)寫(xiě)出以下等式:
對(duì)、C、D和E重復(fù)相同的過(guò)程,您會(huì)得到以下線性系統(tǒng):
要使用scipy.linalg.solve(),您必須獲得系數(shù)矩陣A和獨(dú)立項(xiàng)向量b,它們由以下給出:
現(xiàn)在您只需使用scipy.linalg.solve()來(lái)找出數(shù)量x?,…,x?:
>>>
In[1]:importnumpyasnp...:fromscipy.linalgimportsolveIn[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)...:xOut[4]:array([[10.],[10.],[20.],[20.],[10.]])
這表明均衡飲食應(yīng)包括10食物單位1、食物10單位2、20食物20單位3、食物單位4和10食物單位5。
結(jié)論
恭喜!您已經(jīng)學(xué)習(xí)了如何使用一些線性代數(shù)概念以及如何使用scipy.linalg來(lái)解決涉及線性系統(tǒng)的問(wèn)題。您已經(jīng)看到向量和矩陣可用于表示數(shù)據(jù),并且通過(guò)使用線性代數(shù)概念,您可以對(duì)實(shí)際問(wèn)題進(jìn)行建模并以有效的方式解決它們。
在本教程中,您學(xué)習(xí)了如何:
點(diǎn)擊關(guān)注,時(shí)間了解華為云新鮮技術(shù)~
儀表網(wǎng) 設(shè)計(jì)制作,未經(jīng)允許翻錄必究 .? ? ?
請(qǐng)輸入賬號(hào)
請(qǐng)輸入密碼
請(qǐng)輸驗(yàn)證碼
請(qǐng)輸入你感興趣的產(chǎn)品
請(qǐng)簡(jiǎn)單描述您的需求
請(qǐng)選擇省份