深度学习之python实现线性代数基础

在进行深度学习的开发中,比如CV方面,经过会用到一些线性代数方面的知识,现在进行罗列一些,方便以后查阅。我们可以使用 help()查看相关方法的使用,比如help(np.allclose) 查看 allclose() 的用法。

1、矩阵创建
矩阵创建有两种方法,一是使用np.mat函数或者np.matrix函数,二是使用数组代替矩阵,实际上官方文档建议我们使用二维数组代替矩阵来进行矩阵运算;因为二维数组用得较多,而且基本可取代矩阵。

矩阵的创建还包括一些常用的特殊矩阵的创建:

import numpy as np
a = np.zeros((2,3),dtype=int) 
a = np.ones((2,3),dtype=int) 
a = np.eye(3)#3维单位矩阵
a = np.empty([2,3],dtype=int)
a = np.random.randint(0, 10, (4,3))

y = np.array([4, 5, 6])
np.diag(y)#以y为主对角线创建矩阵

a = np.arange(0, 30, 2)# start at 0 count up by 2, stop before 30
a = a.reshape(3, 5) # reshape array to be 3x5

二、矩阵乘法和加法
1、对于矩阵类型,在满足乘法规则的条件下可以直接相乘。

2、如果是使用数组代替矩阵进行运算则不可以直接使用乘号,应使用dot()函数。dot函数用于矩阵乘法,对于二维数组,它计算的是矩阵乘积,对于一维数组,它计算的是内积。

如何理解对于一维数组,它计算的是内积???
注意:在线性代数里面讲的维数和数组的维数不同,如线代中提到的n维行向量在Python中是一维数组,而线代中的n维列向量在Python中是一个shape为(n, 1)的二维数组!

3、有一点需要说明的是两个维度相同的np.array()矩阵直接使用*号,与使用np.dot()的区别?

*是两个矩阵的对应元素相乘;dot是行列相乘

4、矩阵的加法:#矩阵的加法对matrix类型和array类型是通用的

5、矩阵的数乘运算,#矩阵的数乘对matrix类型和array类型是通用的

三、矩阵的转秩

a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=np.array([[1,3,2],[4,6,5],[7,9,8]])
print(a)
print(a.T)#A的转置
print(a.T.T)#A的转置的转置还是A本身

 验证矩阵转置的性质:(A±B)'=A'±B'

print((a+b).T)
print((a.T+b.T))

验证矩阵转置的性质:(KA)'=KA'

print((10*a).T)
print(10*(a.T))

验证矩阵转置的性质:(A×B)'= B'×A'

print(a)
print(b)
print((a*b).T)#对应元素相乘
print(np.dot(a,b).T)#行列相称、
print(np.dot(b.T,a.T))
print(np.dot(a.T,b.T))

 四、方阵的迹
方阵的迹就是主对角元素之和,使用trace()函数获得方阵的迹:

# 和的迹 等于 迹的和

五、计算行列式

import numpy as np
a=np.array([[1,2],[3,4]])
print(a)

print(np.linalg.det(a))

 六、逆矩阵/伴随矩阵
若A存在逆矩阵(满足det(A) != 0,或者A满秩),使用linalg.inv求得方阵A的逆矩阵

七、解一元线性方程
使用np.linalg.solve()解一元线性方程组,

使用np.allclose()检测两个矩阵是否相同:

八、计算矩阵距离
矩阵的距离,这里是的是欧几里得距离,其他距离表示方法我们以后再谈,这里说一下如何计算两个形状相同矩阵之间的距离。

a = np.array([[0, 1], [1, 0]])#先创建两个矩阵
b = np.array([[1, 1], [1, 1]])
c = a - b       #计算距离矩阵C
d = np.dot(c, c)#距离矩阵的平方
e = np.trace(d) #计算矩阵D的迹
f=e ** 0.5        #将E开平方得到距离
print(a)
print(b)
print(c)
print(d)
print(e)
print(f)

九、矩阵的秩
numpy包中的linalg.matrix_rank方法计算矩阵的秩:

十、求方阵的特征值特征向量

import numpy as np
x = np.diag((1, 2, 3))#创建一个对角矩阵!
print(x)
a,b = np.linalg.eig(x)#特征值保存在a中,特征向量保存在b中
print(a)#特征值
print(b)#特征向量

 根据公式 Ax = λx 检验特征值与特征向量是否正确:

for i in range(3):#方法一
    if np.allclose(np.dot(a[i], b[:, i]), x[:, i]):#np.allclose()方法在第七节提到过
        print('Right')
    else:
        print('Error')
# 注意,如果写成 if np.dot(a[i], b[:, i]) == x[:, i]: 是错误的:(矩阵包含有多个值,应该使用a.any()或者a.all()判断)
for i in range(3):#方法二
    if (np.dot(a[i], b[:, i]) == x[:, i]).all():
        print('Right') 
    else:
        print('Error')

十一、判断正定矩阵
设M是n阶方阵,如果对任何非零向量z,都有z'Mz> 0,其中z' 表示z的转置,就称M正定矩阵。

判定定理1:对称阵A为正定的充分必要条件是:A的特征值全为正。
判定定理2:对称阵A为正定的充分必要条件是:A的各阶顺序主子式都为正。
判定定理3:任意阵A为正定的充分必要条件是:A合同于单位阵。

下面用定理1判断对称阵是否为正定阵

import numpy as np
a=np.arange(16).reshape(-1,4)
print(a)
b = a + a.T             #将方阵转换成对称阵
print(b)
c = np.linalg.eigvals(b)#求B的特征值,注意:eig()是求特征值特征向量
print(c)
if np.all(c>0):             #判断是不是所有的特征值都大于0,用到了all函数,显然对称阵A不是正定的
    print("yes")

创建一个对角元素都为正的对角阵,它一定是正定的:

a = np.diag((1, 2, 3))#创建对角阵,其特征值都为正
print(a)
b = np.linalg.eigvals(a)#求特征值
print(b)
if np.all(b>0):#判断特征值是否都大于0
    print("yes")

网上查到更简便的方法是对对称阵进行cholesky分解,如果像这样没有提示出错,就说明它是正定的。如果提示出错,就说明它不是正定矩阵,你可以使用try函数捕获错误值:当不能进行cholesky分解时,出现的异常是: LinAlgError: Matrix is not positive definite ,但是但是LinAlgError不是Python标准异常,因此不能使用这条语句。

# -*- coding: utf-8 -*-
import numpy as np

A = np.arange(16).reshape(4, 4)
A = A + A.T
print(A)
try:
    B = np.linalg.cholesky(A)
    print(B)
except :
    print ('不是正定矩阵,不能进行cholesky分解。')
# except LinAlgError as reason:
#     print ('不是正定矩阵,不能进行cholesky分解。\n出错原因是:' + str(reason))

 完整的全部代码见:https://github.com/lvxiaojie111/DL_MATHS/blob/master/python%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0.ipynb

如果觉得对你有帮助,不要忘了点个小星星哈。

 

 

 

你可能感兴趣的:(数学知识,python,numpy,线性代数)