⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计8843字,阅读大概需要10分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
⏰个人网站:https://jerry-jy.co/
❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我
人工智能数学与代码实现--线性代数3
- 人工智能数学与代码实现--线性代数3
- 实验环境
- 实验目的
- 知识点
- 实验分析
- 任务实施过程
- 一、打开Jupyter,并新建python工程
- 二、矩阵的特征分解与奇异值分解
- 1. 特征值与特征向量
- 2. 奇异值分解
- 三、矩阵对角化和二次型
- 1. 矩阵对角化
- 2. 正交矩阵
- 3. 向量单位化
- 4. 正交向量
- 5. 对称矩阵的正交对角化
- 6. 二次型变换为标准型
- 四、解线性方程组
- 1. 齐次线性方程组
- 2. 非齐次线性方程组
- (1)唯一解情形
- (2)多解情形
- (3)无解情形
- 实验总结
- 说明
人工智能数学与代码实现–线性代数3
实验环境
- Oracle Linux 7.4
- Python 3
实验目的
- 基于Python实现求矩阵的特征值、特征向量以及奇异值分解
- 基于Python实现矩阵对角化和二次型变换为标准型
- 基于Python实现求解线性方程组
知识点
- 矩阵的特征分解与奇异值分解
- 矩阵正交对角化和二次型
- 解线性方程组
实验分析
任务实施过程
一、打开Jupyter,并新建python工程
1.桌面空白处右键,点击Konsole打开一个终端
2.切换至/experiment/jupyter目录
cd experiment/jupyter
3.启动Jupyter,root用户下运行需加--allow-root
jupyter notebook --ip=127.0.0.1 --allow-root
4.依次点击右上角的 New,Python 3新建python工程
5.点击Untitled,在弹出框中修改标题名,点击Rename确认
二、矩阵的特征分解与奇异值分解
1. 特征值与特征向量
import numpy as np A = np.matrix([[3, -1],[-1, 3]]) # 方法一 # eigvals(a)/eig(a) # a表示需要计算特征值的矩阵 print('矩阵A的特征值为:', np.linalg.eigvals(A)) # 方法二 A1,A2 = np.linalg.eig(A) print('矩阵A的特征值为:', A1) print('矩阵A的特征向量为:\n', A2) # 此处得到的特征向量是向量单位化之后的值
2. 奇异值分解
import numpy as np A = np.mat([[4,11,14],[8,7,-2]]) # svd(a, ...) # a表示需要进行奇异值分解的矩阵 U,X,V = np.linalg.svd(A) print('矩阵A的左奇异向量为:\n', U) print('矩阵A的奇异值为:', X) print('矩阵A的右奇异向量为:\n', V) # 验证 # 构建矩阵D 矩阵D与矩阵A的行列数相同 D = np.column_stack((np.diag(X), [0,0])) # 验证 注意这里得到的右奇异值向量V是转置以后的结果,验证直接相乘 print('验证U*D*V.T:\n',U*D*V) print('验证U*D*V.T:',np.allclose(U*D*V,A))
三、矩阵对角化和二次型
1. 矩阵对角化
import numpy as np A = np.mat([[1,3,3],[-3,-5,-3],[3,3,1]]) A1,A2 = np.linalg.eig(A) print('矩阵A的特征值为:', A1) print('矩阵A的特征向量为:\n', A2) # 构建矩阵P P = np.mat(A2) print('矩阵P为:\n', P) # 构建矩阵D D = np.diag(A1) print('矩阵D为:\n', D)
# 验证 # np.allclose()检测两个矩阵是否相同 print('验证P^(-1) AP=D:\n',np.allclose(np.dot(P**(-1),A).dot(P),D)) # 第二种写法 print('验证P^(-1) AP=D:\n',np.allclose(P**(-1)*A*P,D))
2. 正交矩阵
import numpy as np sq2 = np.sqrt(2)/2 A = np.mat([[sq2,sq2],[-sq2,sq2]]) print('矩阵A.T*A的结果为:\n', A.T*A) print(' A.T*A =E:',np.allclose(A.T*A, np.eye(2)))
3. 向量单位化
import numpy as np v = np.array([1,-2,2,0]) # 求v的模长 vv = np.linalg.norm(v) # 向量单位化后的向量等于向量除以模长 u = (1/vv)*(v) print('向量v的长度为:', vv) print('单位向量u为:', u)
4. 正交向量
import numpy as np a = np.array([5,6,-1]) b = np.array([4/3,-1,2/3]) # 方法一 print("a点乘b=", a.dot(b)) # 方法二 print('向量a*b的结果为:', np.sum(a*b))
由于计算机解决该类问题的时候使用的是数值计算的方法,所求出的结果是一个无限接近精确解的近似解,所以在此处所求取的结果是一个非常接近0的数.
5. 对称矩阵的正交对角化
import numpy as np A = np.mat([[3,-2,4],[-2,6,2],[4,2,3]]) A1,A2 = np.linalg.eig(A) print('矩阵A的特征值为:', A1) print('矩阵A的特征向量为:\n', A2)
# 特征向量正交化 # 对称矩阵不同特征值特征向量正交,所以只要让特征值为7的两个特征向量正交化 # vdot()两个向量的点积 B3 = A2[:,2]-np.float(np.vdot(A2[:,2],A2[:,0]))/np.float(np.vdot(A2[:,0],A2[:,0]))*A2[:,0] # 特征向量单位化 P1 = A2[:,0]/np.linalg.norm(A2[:,0]) P2 = A2[:,1]/np.linalg.norm(A2[:,1]) P3 = B3/np.linalg.norm(B3) # 使用bmat函数合并矩阵 P = np.bmat("P1 P2 P3") print('矩阵P为:\n',P) # 构建矩阵D D = np.diag(A1) print('矩阵D为:\n', D)
# 验证 print('验证P^(-1) AP=D:\n',np.allclose(P**(-1)*A*P,D)) print('验证P.T*P=E:\n', np.allclose(P.T*P,np.eye(3)))
6. 二次型变换为标准型
from numpy import array,mat,diag,allclose from numpy.linalg import eig from sympy import symbols,factor x1,x2,x3= symbols('x1 x2 x3') A=array([[1,0,2],[0,2,0], [2,0,-2]]) x = array([x1,x2,x3]) # 检验 f = (x.T.dot(A)).dot(x) print(factor(f)) A1,A2 = eig(A) print('矩阵A的特征值为:', A1) # 构建矩阵Q Q =mat(A2) print('矩阵Q为:\n', Q) # 构建矩阵D D =diag(A1) # 验证Q.TAQ=D print('Q.TAQ=D',allclose((Q.T.dot(A)).dot(Q),D))
四、解线性方程组
1. 齐次线性方程组
方法一:
import sympy as sp # 创建系数矩阵 A=sp.Matrix([[1, -5, 2, -3],[5, 3, 6, -1], [2, 4, 2, 1]]) # 查看系数矩阵的秩 print("A秩为:\n",A.rank()) # 系数矩阵的秩小于n=4有非零解,基础解系有4-2=2个向量 print("A的零空间(即基础解系)为:\n",A.nullspace())
方法二:
import numpy as np from scipy.linalg import null_space A=np.mat([[1, -5, 2, -3],[5, 3, 6, -1], [2, 4, 2, 1]]) print("A的零空间(即基础解系)为:\n",null_space(A))
2. 非齐次线性方程组
(1)唯一解情形
方法一:(根据Cramer法则)
import numpy as np # 创建分母的二维数组 arr = np.array([[1, 1],[30, 20]]) # 创建分子的二维数组 arr1 = np.array([[80, 1],[2050, 20]]) arr2 = np.array([[1, 80],[30, 2050]]) # 求解行列式 D = np.linalg.det(arr) if D==0: print('不可使用Cramer法则求解') D1 = np.linalg.det(arr1) D2 = np.linalg.det(arr2) print('方程组的解x1为:', D1 / D) print('方程组的解x2为:', D2 / D)
方法二:
from numpy import array,c_ from numpy.linalg import matrix_rank,solve,inv # 创建系数矩阵 A = array([[1, 1],[30, 20]]) b =array([80, 2050]) # 构造增广矩阵 # np.c_[]添加矩阵的列 C = c_[A,b] print('增广矩阵的秩为{},系数矩阵的秩为{}'.format(matrix_rank(A),matrix_rank(C))) # 增广矩阵的秩=系数矩阵的秩=2 有唯一解 # 方法一:(使用solve函数) # solve(a, b) # a,b分别表示需要进行求解方程组的系数矩阵和“因变量”的值 x = solve(A, b) print('方程组的解为:', x) # 方法二: print('方程组的唯一解为:', inv(A).dot(b))
from numpy import array,c_ from numpy.linalg import matrix_rank from scipy.sparse.linalg import cg A=array([[4,-1,1],[-1,4.25,2.75], [1,2.75,3.5]]) b=array([6,-0.5,1.25]) # 构造增广矩阵 C = c_[A,b] print('增广矩阵的秩为{},系数矩阵的秩为{}'.format(matrix_rank(A),matrix_rank(C))) # info 是关于迭代收敛的信息,int # 这里的系数矩阵A必须是对称正定矩阵 x, info = cg(A, b) print('方程的唯一解为:',x)
(2)多解情形
方法一:(求通解)
import sympy as sp A=sp.Matrix([[1, 1, -3, -1],[3, -1, -3, 4], [1, 5, -9, -8]]) b=sp.Matrix([1, 4, 0]) # 构造增广矩阵 C=A.row_join(b) print('增广矩阵的秩为{},系数矩阵的秩为{}'.format(A.rank(),C.rank())) # 增广矩阵的秩=系数矩阵的秩=2 有无穷多解 print("增广阵的行最简形为:\n",C.rref())
通过上述返回值可以看出,增广阵的列向量组的最大无关组由第1列、第2列组成,对应的行最简形的列是单位坐标向量。
方法二:(求最小范数解)
from numpy import array,c_ from numpy.linalg import pinv,matrix_rank A=array([[1, 1, -3, -1],[3, -1, -3, 4], [1, 5, -9, -8]]) b=array([1, 4, 0]) # 构造增广矩阵 C = c_[A,b] print('增广矩阵的秩为{},系数矩阵的秩为{}'.format(matrix_rank(A),matrix_rank(C))) # 求最小范数解 # pinv()计算矩阵的伪逆 x=pinv(A).dot(b) print("最小范数解为:\n",x)
(3)无解情形
from numpy import array from numpy.linalg import pinv A=array([[1, 1],[2, 2], [1, 2]]) b=array([1, 3, 2]) C = c_[A,b] print('增广矩阵的秩为{},系数矩阵的秩为{}'.format(matrix_rank(A),matrix_rank(C))) #求最小二乘解 x=pinv(A).dot(b) print("最小二乘解为:",x)
实验总结
本实验主要通过使用Python的NumPy工具库,实现了基于Python实现求矩阵的特征值、特征向量、奇异值分解、矩阵对角化、二次型变换为标准型、求解线性方程组。
–end–
说明
本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我