提到线性代数,又不得不吐槽国内教材了,学起来真的是实力劝退。有多少跟着国内教材学完线性代数课程后,知道线性代数是什么,它到底是干什么的?
事实上如果你后面想做科研、想研究机器学习、深度学习,你会发现处处是线性代数。这么抽象又重要的课程,一本书里基本看不到几张图,就好比是没有注释的代码,大概以为我的脑子就是记公式的机器吧…
如果你还未开始学习线性代数,那么强烈建议你把学校发的紫色教材放在一边,找几本国外的线性代数教材看看。然后在B站里搜一下麻省理工公开课Gilbert Strang老爷子的线性代数视频,相信你会打开新世界的大门(文末有彩蛋)——
吐槽就到这,我们先来看一个涉及线性代数本质问题的式子:
y = A x y=Ax y=Ax
可以说,线性代数的很多问题都是从这个式子出发的。那么在线性代数中,如何理解这个式子呢?
直观上看,这个式子跟我们熟悉的一次函数 y = kx比较像。对于y=kx,我们可以理解为将标量x经过 某种线性变换,得到另一个标量y。
这里,我们把x和y换成向量,对于y = Ax,我们可以理解为将矩阵A(线性变换)作用于向量x ,得到另一个向量y。
由于向量就是空间中的一个点,这个种线性变换的作用就是将空间中的一个点变为空间中的另一个点。
对于函数y=kx,如果我们知道y和k,就能够求解出x。对于y=Ax也一样,如果y和A已知,我们同样可以求出x,这就是求解线性方程组的问题了。
其他知识点都是从这些基本的概念衍生出来的,这里就不一一列举了。任何新知识都不是凭空出来的,都是建立在以前的理论基础之上。在学习数学的时候,可以多联系以前的知识,类比着学习。
线性代数概念较多,计划在另一篇总结基本概念,这里仅总结线性代数里一些重要概念的python程序。
1 矩阵基本操作
注:向量操作与矩阵类似。
1.1 创建矩阵
(1)通过列表创建矩阵
#通过列表创建矩阵
import numpy as np
m = [[1,2,3],[4,5,6],[7,8,9]]
a1 = np.array(m)
print("a1:",a1)
print("a1的大小:" ,a1.shape)
print("a1的类型:",type(a1))
(2)通过元组创建矩阵
#通过元组创建矩阵
t = ((1,2,3),(4,5,6),(7,8,9))
a2 = np.array(t)
print("a2:",t)
print("a2的大小:" ,a2.shape)
print("a2的类型:",type(a2))
(3)使用random()和randint()函数
random()函数随机生成矩阵中指定范围的浮点数:
import numpy as np
a1 = np.random.random((3,4)) #3×4阶,取值范围为0~1
print(a1)
randint()函数随机生成矩阵中指定范围的整数:
a2 = np.random.randint(1,10,size=[3,4]) #3×4阶,取值范围为1~10(不包括10)
print(a2)
1.2 改变矩阵的大小
import numpy as np
m = [1,2,3,4,5,6,7,8,9,10,11,12]
a = np.array(m)
a1 = a.reshape(3,4)
a2 = a.reshape(4,3)
print("原矩阵a: \n",a)
print("转换为3行4列矩阵a1:\n",a1)
print("转换为4行3列矩阵a2:\n",a2)
1.3 获取矩阵元素
print("a2的第0行元素a2[0]: \n",a2[0])
print("a2的前2行元素a2[0:2]: \n",a2[0:2])
print("a2的第0行和第2行元素a2[[0,2]]: \n",a2[[0,2]])
print("a2的第0列元素a2[:,1]: \n",a2[:,1])
print("a2的前2行元素a2[:,0:2]: \n",a2[:,0:2])
print("a2的第0列和第2列元素a2[:,[0,2]]: \n",a2[:,[0,2]])
print("a2的第2行第2列元素a2[2,2]: \n",a2[2,2])
1.4 特殊矩阵生成
(1)单位矩阵
import numpy as np
e1 = np.eye(5)
e2 = np.identity(5)
print("通过eye()创建五阶单位矩阵e1: \n",e1)
print("通过identity()创建五阶单位矩阵e2: \n",e2)
(2)零矩阵
import numpy as np
a = np.zeros((3,4))
print("3×4阶零矩阵a: \n",a