当前位置: 首页 > 后端技术 > Python

UsingLinearSystemsinPythonwithscipy.linalg

时间:2023-03-26 17:51:36 Python

总结:将线性代数概念应用于实际问题来自华为云社区《使用scipy.linalg在Python中使用线性系统》,作者:雨川。线性代数用于各种学科,一旦您使用向量和线性方程等概念组织信息,就可以使用它来解决许多问题。在Python中,与该主题相关的大部分例程都是在scipy.linalg中实现的,它提供了非常快速的线性代数函数。特别是,线性系统在对各种现实世界问题进行建模方面发挥着重要作用,而scipy.linalg提供了以有效方式研究和解决这些问题的工具。在本教程中,您将学习如何:使用scipy.linalg将线性代数概念应用于实际问题使用Python和NumPy处理向量和矩阵使用线性系统模拟实际问题如何使用线性系统解决scipy.linalg让我们开始吧!开始使用scipy.linalgSciPy是一个用于科学计算的开源Python库,它包括几个用于科学和工程中常见任务的模块,例如线性代数、优化、积分、插值和信号处理。它是SciPy堆栈的一部分,SciPy堆栈包括其他几个用于科学计算的软件包,例如NumPy、Matplotlib、SymPy、IPython和pandas。线性代数是数学的一个分支,涉及线性方程及其使用向量和矩阵的表示。它是用于多个工程领域的基础学科,也是深入理解机器学习的先决条件。scipy.linalg包括各种用于处理线性代数问题的工具,包括用于执行矩阵计算的函数,例如行列式、逆矩阵、特征值、特征向量和奇异值分解。在本教程中,您将使用scipy.linalg中的一些函数来解决涉及线性系统的实际问题。为了使用scipy.linalg,您必须安装和设置SciPy库,您可以使用AnacondaPython发行版和conda包和环境管理系统来完成。注意:要了解有关Anaconda和conda的更多信息,请查看在Windows上为机器学习设置Python。首先,创建一个conda环境并激活它:$condacreate--namelinalg$condaactivatelinalg激活conda环境后,您的提示符将显示其名称linalg。然后你可以在环境中安装必要的包:(linalg)$condainstallscipyjupyter执行这个命令之后,系统应该需要一段时间来确定依赖关系并继续安装。注意:除了SciPy之外,您还将使用JupyterNotebook在交互式环境中运行代码。这样做不是强制性的,但它有助于数值和科学应用。有关使用JupyterNotebook的复习,请查看JupyterNotebook:简介。如果您更喜欢使用不同的Python发行版和pip包管理器阅读本文,请展开下面的可折叠部分以了解如何设置您的环境。设置环境Showhideusingpip在打开JupyterNotebook之前,需要先注册condalinalg环境,这样才能将其作为内核来创建Notebooks。为此,使用linalg激活环境,运行以下命令:(linalg)$python-mipykernelinstall--user--namelinalg现在您可以通过运行以下命令打开JupyterNotebook:$jupyternotebook在浏览器中加载Jupyter后,单击创建新笔记本新建→linalg,如下图:在notebook里面,可以通过导入scipy包来测试是否安装成功:In[1]:importscipy环境搭建完成,接下来看看vectors的使用方法和Python中的矩阵,这是使用scipy.linalg的线性代数应用程序的基础。使用NumPy处理向量和矩阵向量是一种数学实体,用于表示具有大小和方向的物理量。它是解决工程和机器学习问题的基本工具,与矩阵一样,它用于表示向量变换等应用。NumPy是Python中最常用的用于处理矩阵和向量的库,用于scipy.linalg线性代数应用程序。在本节中,您将学习使用它创建矩阵和向量并对其执行运算的基础知识。要开始使用矩阵和向量,您需要在JupyterNotebook中做的第一件事是导入numpy。通常的方法是使用别名np:In[2]:importnumpyasnp来表示矩阵和向量,NumPy使用一个名为ndarray的类。要创建ndarray对象,您可以使用np.array(),它采用类似数组的对象,例如列表或嵌套列表。例如,假设您需要创建以下矩阵:要使用NumPy创建它,您可以使用np.array(),为矩阵的每一行提供包含元素的嵌套列表:In[3]:A=np.array([[1,2],[3,4],[5,6]])...:AOut[3]:array([[1,2],[3,4],[5,6]])你可能会注意到NumPy提供了矩阵的可视化表示,你可以在其中识别它的列和行。值得注意的是,NumPy数组的元素必须是同一类型。您可以使用.dtype检查NumPy数组的类型:In[4]:A.dtypeOut[4]:dtype('int64')由于A的所有元素都是整数,因此创建的数组类型为int64。如果其中一个元素是float,则将创建类型为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对象的尺寸,您可以使用.shape。例如,要检查A的维度,可以使用A.shape:In[7]:A.shapeOut[7]:(3,2)正如预期的那样,矩阵A的维度是3×2,因为A有三个行和两列。在处理涉及矩阵的问题时,经常需要用到转置运算,即交换矩阵的列和行。要转置由ndarray对象表示的向量或矩阵,您可以使用.transpose()或.T。例如,您可以使用A.T获取A的传输:In[8]:A.TOut[8]:array([[1.,3.,5.],[2.,4.,6.]])通过换位,A列变成行,A.T行变成列。要创建向量,可以使用np.array(),提供包含向量元素的列表:In[9]:v=np.array([1,2,3])...:vOut[9]:array([1,2,3])要检查向量的维数,可以像以前一样使用.shape:In[10]:v.shapeOut[10]:(3,)注意这个的形状矢量是(3,)而不是(3,1)或(1,3)。对于那些习惯使用MATLAB的人来说,这是一个NumPy函数。在NumPy中,可以创建一维数组,例如v,这在执行矩阵和向量之间的运算时会导致问题。例如,转置操作对一维数组没有影响。每当您向np.array()提供类似一维数组的参数时,生成的数组将是一维数组。要创建二维数组,您必须提供类似二维数组的参数,例如嵌套列表:In[11]:v=np.array([[1,2,3]])...:v.shapeOut[11]:(1,3)上例中,维度v为1×3,对应二维线向量的维度。要创建列向量,您可以使用嵌套列表:In[12]:v=np.array([[1],[2],[3]])...:v.shapeOut[12]:(3,1)此时,维度v为3×1,对应二维列向量的维度。使用嵌套列表创建向量可能很费力,尤其是对于最常用的列向量。作为替代方案,您可以创建一维向量,为np.array提供平面列表,并使用.reshape()更改ndarray对象的维度:In[13]:v=np.array([1,2,3]).reshape(3,1)...:v.shapeOut[13]:(3,1)在上面的示例中,您使用从.reshape()获得的一维向量,形状为(3,1)作为形状(3,)的列向量。值得一提的是,.reshape()期望新数组中的元素数量与原始数组中的元素数量兼容。换句话说,具有新形状的数组中的元素数必须等于原始数组中的元素数。在此示例中,您还可以使用.reshape()而无需显式定义数组行数:In[14]:v=np.array([1,2,3]).reshape(-1,1)...:v.shapeOut[14]:(3,1)在这里,您提供给.reshape()的-1参数意味着新数组只有一列和所需的行数,由第二个参数指定。在这种情况下,由于原始数组有三个元素,因此新数组的行数将为3。在实际应用中,您经常需要创建零、一或随机元素的矩阵。为此,NumPy提供了一些方便的函数,您将在接下来看到这些函数。使用便利函数创建数组NumPy还提供了一些用于创建数组的便利函数。例如,要创建一个用零填充的数组,您可以使用np.zeros():In[15]:A=np.zeros((3,2))...:AOut[15]:array([[0.,0.],[0.,0.],[0.,0.]])作为它的第一个参数,np.zeros()需要一个元组来指示你想要创建的数组的形状,它返回float64类型的数组。同样,要创建一个填充数组,您可以使用np.ones():In[16]:A=np.ones((2,3))...:AOut[16]:array([[1.,1.,1.],[1.,1.,1.]])值得注意的是,np.ones()也返回一个float64类型的数组。要创建具有随机元素的数组,可以使用np.random.rand():In[17]:A=np.random.rand(3,2)...:AOut[17]:array([[0.8206045,0.54470809],[0.9490381,0.05677859],[0.71148476,0.4709059]])np.random.rand()返回一个包含从0到1的随机元素的数组,取自均匀分布。请注意,与np.zeros()和np.ones()不同,np.random.rand()不期望元组作为其参数。同样,要从具有零均值和单位方差的正态分布中获取随机元素数组,您可以使用np.random.randn():In[18]:A=np.random.randn(3,2)。..:AOut[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))...:AOut[19]:array([[10.,10.],[10.,10.]])如果两个操作数都是相同形状的数组,则操作将在相应的元素之间进行数组: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.]])在这里,您将矩阵A的每个元素乘以矩阵B的相应元素。到根据线性代数的规则进行矩阵乘法,可以使用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]])在这里,您将名为v的2×2矩阵A乘以名为v的2×1向量。您可以使用@运算符获得相同的结果,从PEP465和Python3.5开始,NumPy和本机Python都支持它:在[22]:A=np.array([[1,2],[3,4]])...:v=np.array([[5],[6]])...:x=A@v...:xOut[22]:array([[17],[39]])除了处理矩阵和向量的基本操作外,NumPy还提供了一些特定的函数来处理numpy.linalg。然而,对于这些应用程序,scipy.linalg有一些优势,您将在下面看到。比较scipy.linalg和numpy.linalgNumPy在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?、x2和x?相关的线性系统的示例:这里是涉及三个变量的三个方程。为了有一个线性系统,值k?...k?和b?...b?必须是常数。当只有两个或三个方程和变量时,可以手动进行计算,组合方程,求变量的值。然而,对于四个或更多变量,手动求解线性系统需要相当长的时间并且通常容易出错。实际应用中通常涉及大量的变量,这使得手工求解线性系统变得不可行。幸运的是,有工具可以完成这项艰巨的工作,例如scipy.linalg.solve()。使用scipy.linalg.solve()SciPy提供scipy.linalg.solve()以快速可靠的方式求解线性系统。要了解它是如何工作的,请考虑以下系统:为了使用scipy.linalg.solve(),您首先需要将线性系统写成矩阵乘积,如以下等式所示:请注意,您将计算矩阵相乘后得到系统的原方程。scipy.linalg.solve()期望要求解的输入是您使用NumPy数组定义的matrixA和vectorb。这样,您可以使用以下代码解决系统问题: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...:x15Out[4]:16array([[2.],17[3.]])以下是对发生的事情的细分:部分第1行和第2行从scipy.linalg导入NumPynp和solve()。第4到9行使用名为的NumPy数组创建系数矩阵A。第11行使用名为b的NumPy数组创建单独的术语向量b。要使其成为具有两行的列向量,请使用.reshape((2,1))。第13、14行调用solve()求解以A、b为特征的线性系统,结果存入x,并打印出来。请注意,即使原始数组的所有元素都是整数,solve()也会返回具有浮点分量的解。如果将原方程中的x?=2和x?=3替换掉,就可以验证这是系统的解。现在您了解了使用scipy.linalg.solve()的基础知识,是时候了解线性系统的实际应用了。解决实际问题:BuildingaMealPlan通常使用线性系统解决的一类问题是当您需要找到获得特定混合物所需的成分比例时。下面,您将使用这个想法来制定膳食计划,混合不同的食物以获得均衡的膳食。为此,请考虑均衡饮食应包含以下内容:170单位的维生素A180单位的维生素B140单位的维生素C180单位的维生素D350单位的维生素E你的任务是找出每种不同成分的数量食物获取规定量的维生素。在下表中,您根据每种维生素的单位分析了1克每种食物的结果:您的任务是找出每种不同食物的数量以获得指定量的维生素。在下表中,您可以根据每种维生素的单位来分析1克每种食物的结果:将食物1表示为x?等,并考虑到您将混合x?单位的食物1、x2单位的食物2等,你可以写出你摄入的维生素A量的表达式。考虑到均衡饮食应包含170单位的维生素A,您??可以使用维生素A列中的数据写出以下等式:对维生素B、C、D和E重复相同的过程,您得到以下线性系统:使用scipy.linalg.solve(),您必须获得系数矩阵A和独立项向量b,它们由下式给出:[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.]])这表明均衡的饮食应该包括10个食物单位1、10个食物单位2、20个食物单位20个食物单位3、食物单位4和10个食物单位5。结论恭喜!您已经学习了如何使用一些线性代数概念以及如何使用scipy.linalg来解决涉及线性系统的问题。您已经看到向量和矩阵可用于表示数据,并且通过使用线性代数概念,您可以对实际问题建模并以高效的方式解决它们。在本教程中,您学习了如何:将线性代数概念应用于实际问题scipy.linalg使用Python和NumPy处理向量和矩阵使用线性系统模拟实际问题使用scipy.linalg解决线性系统点击关注并成为第一个了解华为云新鲜科技~