月度归档:2019年09月

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)