人工智能数学与代码实现--线性代数3

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计8843字,阅读大概需要10分钟

🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿

⏰个人网站:https://jerry-jy.co/

❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我

人工智能数学与代码实现--线性代数3

  • 人工智能数学与代码实现--线性代数3
    • 实验环境
    • 实验目的
    • 知识点
    • 实验分析
    • 任务实施过程
      • 一、打开Jupyter,并新建python工程
      • 二、矩阵的特征分解与奇异值分解
        • 1. 特征值与特征向量
        • 2. 奇异值分解
        • 三、矩阵对角化和二次型
          • 1. 矩阵对角化
          • 2. 正交矩阵
          • 3. 向量单位化
          • 4. 正交向量
          • 5. 对称矩阵的正交对角化
          • 6. 二次型变换为标准型
          • 四、解线性方程组
            • 1. 齐次线性方程组
            • 2. 非齐次线性方程组
              • (1)唯一解情形
              • (2)多解情形
              • (3)无解情形
              • 实验总结
              • 说明

                人工智能数学与代码实现–线性代数3


                实验环境

                1. Oracle Linux 7.4
                2. Python 3

                实验目的

                1. 基于Python实现求矩阵的特征值、特征向量以及奇异值分解
                2. 基于Python实现矩阵对角化和二次型变换为标准型
                3. 基于Python实现求解线性方程组

                知识点

                1. 矩阵的特征分解与奇异值分解
                2. 矩阵正交对角化和二次型
                3. 解线性方程组

                实验分析

                任务实施过程

                一、打开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–

                说明

                本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我