标签归档:线性代数

Python与线性代数基本概念

在Python中使用Numpy创建向量:

 x = np.array([1, 2, 3, 4])

创建3 x 3矩阵

 B = np.array([[1, 2],[3, 4],[5, 6]])

Shape形状,也可称为维度,表示矩阵中每个维度的具体数值;

 B.shape 3 x 2

转置

行向量可转置为列向量,列向量转置为行向量
如为方阵转置后行数列数不变,对于非方阵,2 x 3矩阵转置后为3 x 2矩阵

 B_t = A.T

检查转置后形状shape

 B_t.shape

矩阵加法

矩阵相加为两个矩阵对应的元素相加;

 A = np.array([1,2],[3,4])
 B = np.array([4,5],[5,6])
 C = A + B = [[5, 7],[8, 10]]

如标量与矩阵相加规则为:标量与矩阵中对应的每个元素相加;

广播

  广播为Numpy的机制,使得Numpy可以处理各个不同形状(shape)之间的操作,较小的阵列将会被扩充以匹配较大的阵列形状;
  就如上面使用标量与矩阵做相加元素,实际上Numpy把标量转成了与矩阵相同维度的矩阵与该矩阵进行相加;
  比如一个3 x 2 矩阵与一个3 x 1矩阵相加,Numpy会自动把3 x 1矩阵复制一列形成3 x2矩阵与该3 x 2矩阵相加,使得两个矩阵的shape能够匹配;

矩阵乘法

  矩阵乘法与矩阵加法规则并不一样,不是两个矩阵对应的元素相乘,而是计算矩阵行与列对应元素乘积之和;也称为点积;
  矩阵乘法是否有定义,前一个矩阵的列数必须等于后一个矩阵的行数;如n x p与p x m两个矩阵相乘结果为n x m矩阵;
  两个矩阵相乘可以看作是第一个矩阵的每一行与第二个矩阵的每一列之间的点积;
可以使用Numpy的dot()函数计算两个矩阵的乘积;

 A = [[2, 3],[3, 4]]
 B = [[1, 1],[3, 4]]
 C = np.dot(A, B)
 也可以使用 C =A.dot(B)

线性方程组

线性方程组为线性代数用来解决的重要问题之一,

 x1 – 2*x2+x3 = 0
 2*x2 - 8*x3 = 8
    -4*x1 + 5*x2 + 9*x3 = -9

矩阵B每行为上述方程的常数,A矩阵每行为方程组中的每个方程系数;

 A = np.array([[1 ,-2 ,1],[0 ,2 ,-8],[-4 ,5 9]])
 B = np.array([0 ,8 ,-9])

 Y= np.linalg.solve(A,B)= [29. 16.  3.]

单位矩阵

任何向量与单位矩阵相乘结果为他本身,单位矩阵:所有沿主对角线元素都是1,而其他所有位置元素都为0;

 np.identity(5)

逆矩阵

A为方阵,存在矩阵B使得AB=BA=I,I为单位矩阵,则称B为的逆矩阵;

对于Ax=b有

 A = np.array([[2, 3], [4,5]])

 A逆矩阵A_inv= np.linalg.inv( A )
 I = A_inv.dot( A )

行列式

 A = np.array([1 ,2 ],[4 ,5 ])
 D = np.linalg.det(A)

范数

0范数 向量中非零元素个数

 x = np.array([1, 0, -5])
 n = np.linalg.norm(x, ord = 0)

1范数 向量中所有元素绝对值之和

 x = np.array([3, 0, -4])
 n1 = np.linalg.norm(x, ord = 1)

2范数 向量各个元素平方和求平凡根

 x = np.array([3, 0, -4])
 n2 = np.linalg.norm(x, ord = 2)

矩阵的范数

1范数 又称列范数,矩阵列向量中绝对值之和的最大值;

 x = np.array([[-1, 1, 0],[-4, 3, 0],[1, 0, 1]])
 n1 = np.linalg.norm(x, ord = 1)

2范数 又称谱范数,A_t A 矩阵的最大特征值的开平方

 a = np.array([[-2, 1, 1],[-4, 3, 0],[1, 0, 2]])
 ata = np.matmul(a.T, a)
 print ("lambda  ", np.linalg.eigvals(ata))
 n2 = np.linalg.norm(a, ord = 2)
 print('norm_2  ', n2, np.sqrt(30.55403188))

F范数,Frobenius范数,计算方式为矩阵元素的绝对值的平方和再开方。

 x = np.array([[-1, 2, 0],[-4, 3, 0],[1, 0, 2]])
 nfro = np.linalg.norm(x, ord = 'fro')

∞范数,又称行和范数, 即矩阵行向量中绝对值之和的最大值。

 x = np.array([[-1, 2, 0],[-4, 3, 0],[1, 0, 2]])
 ninf = np.linalg.norm(x, ord = np.inf)

线性代数回头看——线性方程组

1、线性方程组概述

线性方程组:包含未知数x1,x2,x3….xn的线性方程

enter image description here

  其中b与系数a1,a2,a3…an是实数或复数,通常是已知的;下标n可以为任意数;线程方程组为由一个或几个包含相同变量x1,x2,x3….xn的线性方程组组成;
线性方程组的解分为相容、与不相容两种情况;
  相容: 1、唯一解;2、无穷解
  不相容: 无解

线性方程组矩阵表示
  可以使用矩阵来表示线性方程组:
  系数矩阵:只包含方程组系数的矩阵
  增广矩阵:在系数矩阵的基础上加上线性方程组右边的常数组成的矩阵

2、解线性方程组

  通过使用矩阵表示线性方程组,对矩阵使用行初等变换,把矩阵行化简为:行阶梯形矩阵或简化行阶梯形矩阵;

初等行变换:
  1、倍加变换——把某行换成它本身与另一行的倍数和
  2、对换变换——两行对换
  3、倍乘变换——某一行的所有元素乘以同一个非零数
行阶梯形矩阵:
  1、每一非零行在每一零行之上
  2、某一行的最左边非零元素所在列在上面一行非零元素的右边
  3、某一最左边非零元素所在列下方都是零
  简化阶梯形为在行阶梯形矩阵的基础上进一步简化:
  1、每一非零行最左边非零元素为1
  2、每一最左边非零元素1是该元素所在列的唯一非零元素
同一个矩阵使用不同的方法化简,存在不同的行阶梯形,但简化阶梯形只存在一个;

行阶梯形相关概念:

  主元位置:最左边非零元素位置
  主元列:主元所在列
  主元:主元位置的非零元素

  线性方程组行简化后不一定每个方程组都存在解,若存在解则称该线性方程组相容,线性方程组相容,当且仅当:化简后的增广矩阵最右列不是主元列;
  根据行简化得到行阶梯形矩阵或简化行阶梯形矩阵,我们可以把线性方程组中的变量称为:基本变量、自由变量;

  基本变量:主元列所在的变量
  自由变量:非主元列的变量

3、线性组合

  A为m*n矩阵,矩阵各列为:a1、a2、a3…、an,x为Rn中的向量,则A与x的乘积为Ax,为A的各列以x对应元素为权的线性组合;

enter image description here

线性方程Ax=b,有解当且仅当b为矩阵A各列的线性组合;

齐次线性方程组:

若线性方程组可以写成Ax=0的形式,则该线性方程组为齐次的;

  平凡解:若Ax=0仅有x=0一个解,也称为平凡解
  非平凡解:若Ax=0存在一个非x=0的解,即x为非零向量

Ax=0有非平凡解,当且仅当线性方程至少存在一个自由变量

4、线性无关

线性无关:矩阵的各列线性无关,仅当Ax=0仅存在平凡解时成立
线性相关: Ax=0存在非平凡解

一个或两个向量集合:
  存在其中一个向量是另一个向量的倍数时线性相关,否则线性无关;
两个或更多向量集合:
  1、向量集合中至少有一个向量是其他的线性组合
  2、向量组的个数超过每个向量元素的个数
  A为n*p矩阵,Ax=0方程有p个未知量,n个方程,若p>n,必定存在自由变量,Ax=0必存在非平凡解,所以A的各列线性相关;
  3、向量组包含零向量
满足这三个条件则线性相关;

参考资料:
线性代数及应用