美文网首页
数据分析学习笔记(四)-- numpy:线性代数

数据分析学习笔记(四)-- numpy:线性代数

作者: 小白进城 | 来源:发表于2018-04-23 18:57 被阅读41次

    常用的linalg函数

    函数 说明
    diag 以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0)
    dot 标准矩阵乘法
    trace 计算对角线元素的和
    det 计算矩阵行列式
    eigvals 计算矩阵的特征值
    eig 计算方阵的特征值和特征向量
    inv 计算方阵的逆
    pinv 计算矩阵的Moore-Penrose伪逆
    qr 计算QR分解
    svd 计算奇异值分解(SVD)
    solve 解线性方程组Ax=b,其中A为一个方阵
    lstsq 计算Ax=b的最小二乘解
    • diag
    # diag
    x = np.arange(9).reshape((3,3))
    print(x)
    '''
    [[0 1 2]
     [3 4 5]
     [6 7 8]]'''
    # 取对角线上的数据
    print(np.diag(x))
    '''[0 4 8]'''
    # k>0,主对角线之上
    print(np.diag(x, k=1))
    '''[1 5]'''
    # k<0,主对角线之下
    print(np.diag(x, k=-1))
    '''[3 7]'''
    # 通过对角线上的数据数组创建矩阵
    print(np.diag(np.diag(x)))
    '''[[0 0 0]
     [0 4 0]
     [0 0 8]]
     '''
    
    • dot : 矩阵乘法
    # dot
    A = np.arange(9).reshape((3,3))
    print(A)
    '''[[0 1 2]
     [3 4 5]
     [6 7 8]]
     '''
    B = np.arange(6).reshape((3,2))
    print(B)
    '''[[0 1]
     [2 3]
     [4 5]]
     '''
    print(A.dot(B))
    print(np.dot(A,B))
    '''[[10 13]
     [28 40]
     [46 67]]
     '''
    
    • trace :对角线上的和
    A = np.arange(9).reshape((3,3))
    print(A)
    '''[[0 1 2]
     [3 4 5]
     [6 7 8]]
     '''
    print(A.trace())
    print(np.trace(A))
    '''12'''
    
    • det : 行列式
    x = np.mat('3 4;2 2')
    print(x)
    '''[[3 4]
     [2 2]]
     '''
    print(np.linalg.det(x))
    '''-2'''
    
    • eigvals、eig :计算特征值和特征向量

    注:特征值(eigenvalue)即方程 Ax = ax 的根,是一个标量。其中 A 是一个二维矩阵,x 是一个一维向量。特征向量(eigenvector)是关于特征值的向量

    函数 eigvals 函数可以计算矩阵的特征值,而 eig 函数可以返回一个包含特征值和对应的特征向量的元组

    C = np.mat('3 -2;1 0')
    # 调用eigvals函数求解特征值
    e0 = np.linalg.eigvals(C)
    print(e0)
    '''[2. 1.]'''
    # 使用 eig 函数求解特征值和特征向量,第一列为特征值,第二列为特征向量
    e1,e2 = np.linalg.eig(C)
    print(e1)
    '''[2. 1.]'''
    print(e2)
    '''[[0.89442719 0.70710678]
     [0.4472136  0.70710678]]
     '''
    # 检查结果
    for i in range(len(e1)):
        print("left:", np.dot(C, e2[:, i]))
        print("right:", e1[i] * e2[:, i])
    '''
    left: [[1.78885438]
     [0.89442719]]
    right: [[1.78885438]
     [0.89442719]]
    left: [[0.70710678]
     [0.70710678]]
    right: [[0.70710678]
     [0.70710678]]
     '''
    
    • inv :方阵的逆
    A = np.mat('0 1 2;1 0 3;4 -3 8')
    print(A)
    '''
    [[ 0  1  2]
     [ 1  0  3]
     [ 4 -3  8]]
     '''
    # 使用inv函数计算逆矩阵
    inv = np.linalg.inv(A)
    print(inv)
    '''
    [[-4.5  7.  -1.5]
     [-2.   4.  -1. ]
     [ 1.5 -2.   0.5]]
     '''
    # 检查结果
    print(inv * A)
    '''
    [[1. 0. 0.]
     [0. 1. 0.]
     [0. 0. 1.]]
     '''
    
    • pinv : 广义逆矩阵
    A = np.mat('1 2;4 3')
    print(A)
    '''
    [[1 2]
     [4 3]]
     '''
    pseudoinv = np.linalg.pinv(A)
    print(pseudoinv)
    '''
    [[-0.6  0.4]
     [ 0.8 -0.2]]
     '''
    
    • svd :奇异分解

    SVD(Singular Value Decomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积
    函数 svd 可以对矩阵进行奇异值分解,该函数返回3个矩阵--U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值

    A = np.mat('4 11 14;8 7 -2')
    print(A)
    '''
    [[ 4 11 14]
     [ 8  7 -2]]
     '''
    # 调用svd函数分解矩阵
    U,Sigma,V = np.linalg.svd(A, full_matrices=False)
    print('U:{}{}Sigma:{}{}V:{}{}'.format(U,'\n',Sigma,'\n',V,'\n'))
    '''
    U:[[-0.9486833  -0.31622777]
     [-0.31622777  0.9486833 ]]
    Sigma:[18.97366596  9.48683298]
    V:[[-0.33333333 -0.66666667 -0.66666667]
     [ 0.66666667  0.33333333 -0.66666667]]
     '''
    # 检查结果
    print(U * np.diag(Sigma) * V)
    '''
    [[ 4. 11. 14.]
     [ 8.  7. -2.]]
     '''
    
    • solve :解线性方程组

    solve可以解形如 Ax = b 的线性方程组,其中 A 为矩阵,b 为一维或二维的数组,x是未知变量

    B = np.mat('1 -2 1;0 2 -8;-4 5 9')
    print(B)
    '''
    [[ 1 -2  1]
     [ 0  2 -8]
     [-4  5  9]]
     '''
    b = np.array([0, 2, 2])
    x = np.linalg.solve(B, b)
    print(x)
    '''[37. 21.  5.]'''
    # 检查结果
    print(B.dot(x))
    '''[[0. 2. 2.]]'''
    '''和b相等'''
    
    • QR分解
      对于m×n的列满秩矩阵A,必有:

                  Am*n= Qm*n·Rn*n
      

      其中,QT·Q=I(即Q为正交矩阵),R为非奇异上三角矩阵(即矩阵R的对角线下面的元素全为0)。

      这个将A分解成这样的矩阵Q和R的过程就是QR分解。

      其中当要求R的对角线元素为正时,该分解唯一。

      QR分解可用于求解矩阵A的特征值、A的逆等问题。

    # QR分解
    A = np.array([[1,2,3,4,0],[-1,3,np.sqrt(2),3,0],[-2,2,np.e,np.pi,0],[-np.sqrt(10),2,-3,7,0],[0,2,7,5/2,0]],dtype=float)
    print(A)
    '''
    [[ 1.          2.          3.          4.          0.        ]
     [-1.          3.          1.41421356  3.          0.        ]
     [-2.          2.          2.71828183  3.14159265  0.        ]
     [-3.16227766  2.         -3.          7.          0.        ]
     [ 0.          2.          7.          2.5         0.        ]]
     '''
    A = np.matrix(A,dtype=float)
    Q,R = np.linalg.qr(A)
    # 验证
    print(Q*R)
    '''
    [[ 1.          2.          3.          4.          0.        ]
     [-1.          3.          1.41421356  3.          0.        ]
     [-2.          2.          2.71828183  3.14159265  0.        ]
     [-3.16227766  2.         -3.          7.          0.        ]
     [ 0.          2.          7.          2.5         0.        ]]
     '''
    

    相关文章

      网友评论

          本文标题:数据分析学习笔记(四)-- numpy:线性代数

          本文链接:https://www.haomeiwen.com/subject/dfollftx.html