• Python之Numpy:线性代数/矩阵运算


    当你知道工具的用处,理论与工具如何结合的时候,通常会加速咱们对两者的学习效率。

    零 numpy

    那么,Numpy是什么?
    NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量维度的数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
    NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。 ---- 摘自 · 菜鸟教程

    一 要点

    • 假定AX=b,求解未知矩阵X 【线性代数中常遇到的运算问题】
    • 矩阵转置A^(T)
    • 矩阵的逆A^(-1)
    • 矩阵行列式的值|A|
    • 矩阵的秩 rank(A)
    • 矩阵的迹 trace(A)
    • 其它
      • 单位矩阵
      • 0向量/矩阵
      • ...

    二 示例应用

    2.1 求解AX=b中的未知参数矩阵X

    import numpy as np
    
    # Hypothsis : A*X = b
    
    A = [[2,1,2],
         [3,1,0],
         [1,1,-1]];
    b = np.transpose([-3,5,-2])# 转置
    #[or] b = np.transpose(np.array([-3,5,-2]))# 转置
    
    # 求解未知参数矩阵X
    X = np.linalg.solve(A,b) # 方式一:直接使用numpy的solve函数一键求解
    #A_inv=np.linalg.inv(A) # 方式二:先求逆运算,再点积求值
    #X=np.dot(A_inv,b) # a.dot(b) 与 np.dot(a,b) 效果相同;but np.dot(a,b)与np.dot(b,a)效果肯定是不同的(线性代数/矩阵常识)
    print("方程组的解:
    ",X);
    
    # [output]
    方程组的解:
     [ 4.4 -8.2 -1.8]
    

    2.2 利用最小二乘法拟合函数模型

    给出一组数据【5对(Xi,Yi)参数】,用最小二乘法,求形如:f(x)=a+b*x^3的经验公式。

    • 原方程(模型)

    [f(x) = a + bx^3 ]

    • 其法方程

    [A^T A egin{pmatrix} a \ b \ end{pmatrix} = A^T y ]

    [egin{pmatrix} a \ b \ end{pmatrix} = left( A^T A ight)^{-1} A^T y ]

    import numpy as np
    import matplotlib.pyplot as plt  # Python 绘图工具(业界推荐)
    
    # 数据初始化
    A = [
        [1,pow(-3,3)],
        [1,pow(-2,3)],
        [1,pow(-1,3)],
        [1,pow(2,3)],
        [1,pow(4,3)]
    ];
    
    At =  np.transpose(A); # A的转置矩阵
    
    y = np.transpose([14.3,8.3,4.7,8.3,22.7]);
    
    
    # step1:求解
    ## 令 (a ,b)^T 为 未知参数X
    X = np.dot(np.dot(np.linalg.inv(np.dot(At,A)),At),y)
    print(X)
    print("a:",X[0])
    print("b:",X[1])
    
    # step2:查看拟合效果
    x = [-3,-2,-1,2,4];
    ## 1. 计算拟合数值 fitValue
    def fitValue(arg_x):
        a = X[0];
        b = X[1];
        return a + b*pow(arg_x,3);
    
    fitValues = np.zeros([5]); # 创建长为5的【一维】数组;[1,5]:创建第1行为5个元素的【二维】数组 
    for i in range(0,len(fitValues)):
        fitValues[i] = fitValue(x[i]);
        print(i,":","x(i):",x[i],"fit Y:",fitValues[i]); # just for test
        pass;
    
    ## 2. 绘图可视化
    yt = np.transpose(y); # y的转置
    plt.rcParams['figure.dpi'] = 100 #分辨率
    plt.scatter(x, yt, marker = '*',color = 'red', s = 10 ,label = 'Actual Dataset') # 真实数据集
    plt.scatter(x, fitValues, marker = 'x',color = 'green', s = 10 ,label = 'Fitting Dataset') #[拟合数据集]
    plt.legend(loc = 'best')    # 设置 图例所在的位置 使用推荐位置
    plt.show() 
    
    
    # [output]
    [ 10.67505325   0.13679816]
    a: 10.6750532504
    b: 0.136798159666
    0 : x(i): -3 fit Y: 6.98150293942
    1 : x(i): -2 fit Y: 9.58066797308
    2 : x(i): -1 fit Y: 10.5382550907
    3 : x(i): 2 fit Y: 11.7694385277
    4 : x(i): 4 fit Y: 19.430135469
    

    2.3 数组创建/初始化

    • numpy.linspace(start, stop[, num=50[, endpoint=True[, retstep=False[, dtype=None]]]]])
      • 一维等差数列
      • return 在指定范围内的均匀间隔的数字(组成的数组),也即返回一个等差数列
      • 参数
        • start - 起始点
        • stop - 结束点
        • num - 元素个数,默认为50,
        • endpoint - 是否包含stop数值,默认为True,包含stop值;若为False,则不包含stop值
        • retstep - 返回值形式,默认为False,返回等差数列组,若为True,则返回结果(array([samples, step])),
        • dtype - 返回结果的数据类型,默认无,若无,则参考输入数据类型。
    import numpy as np
    
    a = np.linspace(1,10,5,endpoint= True)
    print(a) # [ 1.    3.25  5.5   7.75 10.  ]
    
    b = np.linspace(1,10,5,endpoint= False)
    print(b) #[1.  2.8 4.6 6.4 8.2]
    
    c = np.linspace(1,10,5,retstep = False)
    print(c) # [ 1.    3.25  5.5   7.75 10.  ]
    
    d = np.linspace(1,10,5,retstep = True)
    print(d) # (array([ 1.  ,  3.25,  5.5 ,  7.75, 10.  ]), 2.25)
    

    2.4 线性代数常用运算

    
    print("原矩阵A:
    ",A);
    print("原矩阵b:
    ",b);
    
    print("转置矩阵A^T:
    ",np.transpose(A)); # 转置
    print("矩阵的行列式值|A|:
    ",np.linalg.det(A)); # 方阵的行列式值:|A|
    print("矩阵的迹trace(A):
    ",np.trace(A)); 
    print("矩阵的秩rank(A):
    ",np.linalg.matrix_rank(A)); 
    print("逆矩阵A^(-1):
    ",np.linalg.inv(A)); #矩阵的逆运算(条件:矩阵A可逆(行列式值不为0)| 矩阵A为方阵)
    
    print("*"*30); # 分隔线
    
    print("N阶单位矩阵:
    ",np.eye(4));
    print(np.zeros([5])); # 创建长为5的【一维】数组;[1,5]:创建第1行为5个元素的【二维】数组 
    
    # 创建指定的初始化数组
    print(np.array([1]))  # 生成 第1行含值为1的元素的【一维】数组
    print(np.array([[56]])) # 生成 第1行含值为56的元素的【二维】数组
    np.full((3,5),3.14) # 创建一个3x5的浮点型数组,数组的值都是3.14
    
    # [output]
    原矩阵A:
     [[2, 1, 2], [3, 1, 0], [1, 1, -1]]
    原矩阵b:
     [-3  5 -2]
    转置矩阵A^T:
     [[ 2  3  1]
     [ 1  1  1]
     [ 2  0 -1]]
    矩阵的行列式值|A|:
     5.0
    矩阵的迹trace(A):
     2
    矩阵的秩rank(A):
     3
    逆矩阵A^(-1):
     [[-0.2  0.6 -0.4]
     [ 0.6 -0.8  1.2]
     [ 0.4 -0.2 -0.2]]
    **********************
    N阶单位矩阵:
     [[ 1.  0.  0.  0.]
     [ 0.  1.  0.  0.]
     [ 0.  0.  1.  0.]
     [ 0.  0.  0.  1.]]
    [ 0.  0.  0.  0.  0.]
    [1]
    [[56]]
    

    三 推荐文献

  • 相关阅读:
    JAVA抽象方法,接口
    JAVA基础,字符串
    JAVA运算符
    JAVA数组
    团队任务1:第一次团队会议
    课后作业二:个人项目
    自我介绍
    python3加密 解密 签名 验签
    python3读取xml字符串
    SETX命令设置环境变量
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/10855208.html
Copyright © 2020-2023  润新知