线性代数(4)——矩阵进阶

矩阵——系统

矩阵看做是一个系统,使用矩阵可以表示一个线性系统。如使用矩阵表示一个方程组,
{ x i + 0.2 x j + 0.1 x k + 0.5 x l = 100 − 0.5 x i + x j + 0.2 x k + 0.1 x l = 50 − 0.4 x j − x k + 0.3 x l = 20 − 0.2 x i + x l = 666 \begin{cases}x_i+0.2x_j+0.1x_k+0.5x_l=100\\-0.5x_i+x_j+0.2x_k+0.1x_l=50\\-0.4x_j-x_k+0.3x_l=20\\-0.2x_i+x_l=666\\\end{cases} xi+0.2xj+0.1xk+0.5xl=1000.5xi+xj+0.2xk+0.1xl=500.4xjxk+0.3xl=200.2xi+xl=666
可以表示为,
( 1 − 0.2 0.1 0.5 − 0.5 − 1 0.2 0.1 0 − 0.4 − 1 0.3 − 0.2 0 0 1 ) ( 100 50 20 666 ) \begin{pmatrix}1&-0.2&0.1&0.5\\-0.5&-1&0.2&0.1\\0&-0.4&-1&0.3\\-0.2&0&0&1\end{pmatrix} \begin{pmatrix}100\\50\\20\\666\end{pmatrix} 10.500.20.210.400.10.2100.50.10.311005020666

矩阵乘法

矩阵和向量的乘法

上一节中的线型方程组可以使用矩阵和向量表示,
( 1 − 0.2 0.1 0.5 − 0.5 − 1 0.2 0.1 0 − 0.4 − 1 0.3 − 0.2 0 0 1 ) ( x i x j x k x l ) = ( 100 50 20 666 ) \begin{pmatrix}1&-0.2&0.1&0.5\\-0.5&-1&0.2&0.1\\0&-0.4&-1&0.3\\-0.2&0&0&1\end{pmatrix} \begin{pmatrix}x_i\\x_j\\x_k\\x_l\end{pmatrix} =\begin{pmatrix}100\\50\\20\\666\end{pmatrix} 10.500.20.210.400.10.2100.50.10.31xixjxkxl=1005020666
矩阵和向量相乘最终得到的是一个向量,
A ⋅ x ⃗ = b ⃗ A\cdot\vec{x}=\vec{b} Ax =b
*每次从矩阵中取出一个行向量与列向量进行点乘,可以简单表示为,
( a 11 a 12 . . . a 1 n a 21 a 22 . . . a 2 n . . . . . . . . . . . . a m 1 a m 2 . . . a m n ) ⋅ ( u 1 u 2 . . . u n ) = ( a 11 u 1 + a 12 u 2 + . . . + a 1 n u n a 21 u 1 + a 22 u 2 + . . . + a 2 n u n . . . a m 1 u 1 + a m 2 u 2 + . . . + a m n u n ) \begin{pmatrix}a_{11}&a_{12}&...&a_{1n}\\a_{21}&a_{22}&...&a_{2n}\\...&...&...&...\\a_{m1}&a_{m2}&...&a_{mn}\end{pmatrix}\cdot\begin{pmatrix}u_1\\u_2\\...\\u_n\end{pmatrix}=\begin{pmatrix}a_{11}u_1+a_{12}u_2+...+a_{1n}u_n\\a_{21}u_1+a_{22}u_2+...+a_{2n}u_n\\...\\a_{m1}u_1+a_{m2}u_2+...+a_{mn}u_n\end{pmatrix} a11a21...am1a12a22...am2............a1na2n...amnu1u2...un=a11u1+a12u2+...+a1nuna21u1+a22u2+...+a2nun...am1u1+am2u2+...+amnun
前提是矩阵的列数与向量的元素个数相同

对于矩阵的行数没有要求。矩阵与向量的点乘可以看做是矩阵将一个向量转换为另一个向量的过程,所以矩阵实际上可以看做是向量的函数(这一视角非常重要)。

矩阵和矩阵的乘法

矩阵 A A A和矩阵 B B B的乘法可以将第二个矩阵 B B B拆成多个列向量,进行矩阵 A A A和多个列向量的乘法。要求矩阵 A A A的列数与矩阵 B B B的行数一致
A ⋅ B = A ⋅ ( ∣ ∣ ∣ c 1 ⃗ c 2 ⃗ . . . c n ⃗ ∣ ∣ ∣ ) = ( ∣ ∣ ∣ A ⋅ c 1 ⃗ A ⋅ c 2 ⃗ . . . A ⋅ c n ⃗ ∣ ∣ ∣ ) A\cdot B=A\cdot \begin{pmatrix}|&|&&|\\\vec{c_1}&\vec{c_2}&...&\vec{c_n}\\|&|&&|\end{pmatrix}=\begin{pmatrix}|&|&&|\\ A\cdot \vec{c_1}&A\cdot \vec{c_2}&...&A\cdot \vec{c_n}\\|&|&&|\end{pmatrix} AB=Ac1 c2 ...cn =Ac1 Ac2 ...Acn
等同于,
A ⋅ B = ( − r 1 ⃗ − − r 2 ⃗ − . . . − r m ⃗ − ) ⋅ ( ∣ ∣ ∣ c 1 ⃗ c 2 ⃗ . . . c n ⃗ ∣ ∣ ∣ ) = ( r 1 ⃗ ⋅ c 1 ⃗ r 1 ⃗ ⋅ c 2 ⃗ . . . r 1 ⃗ ⋅ c n ⃗ r 2 ⃗ ⋅ c 1 ⃗ r 2 ⃗ ⋅ c 2 ⃗ . . . r 2 ⃗ ⋅ c n ⃗ . . . . . . . . . r m ⃗ ⋅ c 1 ⃗ r m ⃗ ⋅ c 2 ⃗ . . . r m ⃗ ⋅ c n ⃗ ) A\cdot B=\begin{pmatrix}-&\vec{r_1}&-\\-&\vec{r_2}&-\\&...\\-&\vec{r_m}&-\end{pmatrix} \cdot\begin{pmatrix}|&|&&|\\\vec{c_1}&\vec{c_2}&...&\vec{c_n}\\|&|&&|\end{pmatrix}=\begin{pmatrix}\vec{r_1}\cdot\vec{c_1}&\vec{r_1}\cdot\vec{c_2}&...&\vec{r_1}\cdot\vec{c_n}\\\vec{r_2}\cdot\vec{c_1}&\vec{r_2}\cdot\vec{c_2}&...&\vec{r_2}\cdot\vec{c_n}\\...&...&&...\\\vec{r_m}\cdot\vec{c_1}&\vec{r_m}\cdot\vec{c_2}&...&\vec{r_m}\cdot\vec{c_n}\\\end{pmatrix} AB=r1 r2 ...rm c1 c2 ...cn =r1 c1 r2 c1 ...rm c1 r1 c2 r2 c2 ...rm c2 .........r1 cn r2 cn ...rm cn
但是矩阵乘法不满足乘法交换律,即使是方阵,交换律得到的结果也是不相等的。这一点很重要。

矩阵乘法实现

接之前Matrix类代码,

	def dot(self, another):
		"""
		返回矩阵乘法结果
		:param another: Vector类或Matrix类对象
		"""
		if isinstance(another, Vector):
			# 保证矩阵的列数与向量的元素数目相同
			assert self.col_num() == len(another)
			return Vector([self.row_vector(i)*another] for i in range(self.row_num()))
			
		if isinstance(another, Matrix):
			assert self.col_num() == another.row_num()
			return Matrix([[self.row_vector(i).dot(another.col_vector(j)) for j in range(another.col_num())] for i in range(self.row_num())])

矩阵乘法的性质与矩阵的幂

  1. 矩阵乘法不遵守乘法交换律
    A ⋅ B ≠ B ⋅ A A\cdot B \neq B\cdot A AB̸=BA
  2. 矩阵乘法遵守结合律
    ( A ⋅ B ) ⋅ C = A ⋅ ( B ⋅ C ) (A\cdot B)\cdot C=A\cdot (B\cdot C) (AB)C=A(BC)
  3. 矩阵乘法遵守分配律
    A ⋅ ( B + C ) = A ⋅ B + A ⋅ C A\cdot(B+C)=A\cdot B+A\cdot C A(B+C)=AB+AC
    ( B + C ) ⋅ A = B ⋅ A + C ⋅ A (B+C)\cdot A=B\cdot A +C\cdot A (B+C)A=BA+CA
    注意,这两条不等价
  4. 对任意 r ⋅ c r\cdot c rc的矩阵 A A A,必存在 c ⋅ x c\cdot x cx的矩阵 O O O(零矩阵),满足
    A ⋅ O c x = O r x A \cdot O_{cx} = O_{rx} AOcx=Orx
  5. 对任意 r ⋅ c r\cdot c rc的矩阵 A A A,必存在 x ⋅ r x\cdot r xr的矩阵 O O O(零矩阵),满足
    O x r ⋅ A = O x c O_{xr}\cdot A = O_{xc} OxrA=Oxc

引入矩阵的幂,对于一个实数而言,其k次幂是k个该数相乘的结果。这对于矩阵也是同理的,
A k = A ⋅ A ⋅ . . . A ⎵ k 个 A A^k=\underbrace{A\cdot A\cdot ...A}_{k个A} Ak=kA AA...A
前提是 A A A是方阵,否则无法计算矩阵的幂。

矩阵的转置

矩阵的转置实际上就是将矩阵沿着主对角线旋转,将之前的矩阵的列变成新矩阵的行,之前矩阵的行变为新矩阵的列。矩阵转置满足如下性质,
( A T ) T = A (A^T)^T=A (AT)T=A
( A + B ) T = A T + B T (A+B)^T=A^T+B^T (A+B)T=AT+BT
( k ⋅ A ) T = k ⋅ A T (k\cdot A)^T=k\cdot A^T (kA)T=kAT
( A ⋅ B ) T = B T ⋅ A T (A\cdot B)^T=B^T\cdot A^T (AB)T=BTAT
最后一条性质的形式与其他三条不同,给出如下证明,
A 是 m ⋅ k 的 矩 阵 , B 是 k ⋅ n 的 矩 阵 A是m\cdot k的矩阵,B是k \cdot n的矩阵 AmkBkn
A ⋅ B 是 m ⋅ n 的 矩 阵 , A T ⋅ B T 是 n ⋅ m 的 矩 阵 , B T ⋅ A T 是 m ⋅ n 的 矩 阵 A\cdot B是m \cdot n的矩阵,A^T\cdot B^T是n\cdot m的矩阵,B^T\cdot A^T是m\cdot n的矩阵 ABmnATBTnmBTATmn
转置的实现,

    def T(self):
        """
        返回矩阵的转置矩阵
        """
        return Matrix([[e for e in self.col_vector(i)] for i in range(self.col_num())])

Numpy中的矩阵运算

import numpy as np


if __name__ == "__main__":
    # 矩阵的创建
    A = np.array([[1, 2], [3, 4]])
    # 矩阵形状
    print(A.shape)
    # 矩阵的转置
    print(A.T)
    # 获取矩阵元素
    print(A[1, 1])    # 返回4
    print(A[0])       # 返回第一行,或者写 A[0, :]
    print(A[:, 0])    # 返回第一列

    B = np.array([[5, 6], [7, 8]])
    # 矩阵加法
    print(A + B)      # 返回 [[6, 8], [10, 12]]
    # 矩阵数乘
    print(10 * B)

    # 矩阵与向量乘法
    p = np.array([10, 100])

    # 矩阵乘法
    print(A * B)      # 返回element-wise的结果 [[5, 12], [21, 32]]
    print(A.dot(B))   # 返回真正的矩阵乘法结果 [[19, 22], [43, 50]]

numpy中矩阵和矩阵、矩阵和向量之间的运算使用的都应使用 np.dot 方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python计算思维训练——数组进阶线性代数是一门关于使用Python语言进行线性代数计算的课程。该课程主要涵盖了向量、矩阵、线性方程组、矩阵分解、特征值与特征向量等内容。通过学习该课程,可以提高学生的线性代数计算能力,为日后从事相关领域的工作打下坚实的基础。 ### 回答2: Python计算思维训练——数组进阶线性代数是一门针对处理数学中线性代数问题的课程。这门课程主要涉及到了向量、矩阵矩阵运算、矩阵特征值等方面的概念和运算,同时也介绍了如何将这些概念以Python编程语言的形式来描述和实现解决问题。 在Python计算思维训练中,学习线性代数可以帮助我们更好地掌握有关数据分析和机器学习的相关知识,因为这些领域的很多概念和运算都与线性代数息息相关。线性代数中的向量、矩阵、特征值等概念可以帮助我们更好地理解和解决数据的问题。 在Python中,我们可以使用NumPy来实现线性代数中的矩阵运算,NumPy是Python中一个常用的数学计算库,它提供了大量的数学函数和运算符,可以帮助我们更高效地解决线性代数中的问题。 例如,我们可以利用NumPy中的dot函数来计算矩阵的乘积,使用linalg函数可以计算矩阵的特征值和特征向量。对于向量的范数,我们可以使用linalg.norm函数。 此外,在Python中还有一些有用的库,如SciPy和SymPy,这些库提供了更高级和更复杂的数学函数和运算,可以使我们更加轻松地解决涉及高级数学问题的任务。 总之,Python计算思维训练——数组进阶线性代数,让我们了解和掌握了处理线性代数问题的基本概念和运算,这些知识对于我们解决数据的问题是非常有帮助的,同时也为我们理解和使用各种机器学习算法提供了重要的基础。 ### 回答3: Python 的计算思维训练中,数组进阶线性代数是必不可少的一部分。线性代数是一门数学分支,旨在研究线性方程组、向量空间以及线性变换等内容。在 Python 中,NumPy 库便提供了很多用于实现线性代数操作的函数,使得 Python 也成为了进行线性代数计算的重要工具之一。 在 Python 中实现线性代数计算的关键是要了解如何使用 NumPy 数组来表示向量和矩阵。在 NumPy 中,可以使用一维数组来表示向量,使用二维数组来表示矩阵。同时,NumPy 还提供了很多用于实现线性代数计算的函数,比如矩阵加法、矩阵乘法、矩阵转置等。 通过使用 NumPy 中的函数,实现线性代数计算变得非常方便。例如,要对两个矩阵进行加法,可以使用 np.add() 函数来实现,如下所示: import numpy as np a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) c = np.add(a, b) print(c) 输出结果为: [[ 6 8] [10 12]] 同样的,要对两个矩阵进行乘法,可以使用 np.dot() 函数来实现,如下所示: a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) c = np.dot(a, b) print(c) 输出结果为: [[19 22] [43 50]] 可以看到,使用 NumPy 提供的函数,实现矩阵的加法和乘法变得非常简单。 除了基本的矩阵运算外,NumPy 还提供了很多用于实现更高级的线性代数计算的函数,比如矩阵求逆、矩阵行列式、特征值和特征向量等。这些函数可以帮助我们更方便的解决复杂的线性代数问题。 总之,Python 的计算思维训练中,数组进阶线性代数是非常重要的一部分。只有掌握了 NumPy 数组的基本操作和线性代数相关的函数,才能更好地发挥 Python 程序在实现复杂线性代数计算方面的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值