精华内容
下载资源
问答
  • 线性代数的应用

    2018-07-21 20:55:07
    这里详细介绍了线性代数及其应用,可以帮助对线性代数不了解同学完整了解!
  • 线性代数的应用场景

    2020-05-25 00:14:06
    机器学习与线性代数 自打我开始学习机器学习相关知识以来,线性代数就一直是制约我读懂算法最大短板。尽管经过大概两个月学习,我代数知识积累似乎已经足以让我不害怕任何数学推导了,但是毕竟是将来要赖以...

    机器学习与线性代数

    自打我开始学习机器学习的相关知识以来,线性代数就一直是制约我读懂算法的最大短板。尽管经过大概两个月的学习,我的代数知识积累似乎已经足以让我不害怕任何数学推导了,但是毕竟是将来要赖以生存的本领,如果有一天忘记了它们我会很沮丧的。所以这里我还是决定整理一下与机器学习相关的所有数学知识,方便随时查阅,杜绝忘却。
    笔记将以花书《深度学习》为思维导向,从底到上梳理各种可能用到的数学知识。

    代数的运算律

    和标量类似的运算律有分配律、结合律,而一般不满足交换律,因为代数是有维度的。
    ABBAexp:(2x3)×(3x2)=(2x2)but(3x2)×(2x3)=(3x3) AB \neq BA \qquad exp: (2x3)\times (3x2) = (2x2) \quad but \quad (3x2)\times (2x3) = (3x3)
    此外代数可以转置,也就是沿对角线反转矩阵。代数乘积的转置满足
    (AB)T=BTAT (AB)^T = B^TA^T

    Tr(A)=iAi,iTr(A) = \sum_iA_{i,i}
    只看这个定义看不出什么,体验它的作用还是在实践中。它有着非常好用的交换律,即使两个矩阵一个是nxn一个是mxm
    Tr(AB)=Tr(BA) Tr(AB) = Tr(BA)

    范数

    范数可以把向量映射为非负标量
    xp=(ixip)1p ||x||_p = (\sum_i|x_i|^p)^{\frac{1}{p}}
    范数常用来评估高维空间中的距离,经典的应用就是正则化和聚类。常用的范数有L1范数,即曼哈顿距离,L2范数即欧几里得距离,有时还会使用Linf范数,即计算向量中最大幅值元素的绝对值。

    矩阵逆

    单位矩阵一般写成II,是对角线元素为1其他为0的方阵。为此我们有矩阵的逆矩阵的定义
    A1A=I A^{-1}A = I
    做题和考试时求矩阵逆我们可能会采取手算的方法,就是通过多次基本矩阵变换把A变成I,这是同样把这些操作施加于单位矩阵上,就得到逆矩阵。矩阵可逆的条件是矩阵正定,即矩阵中不存在线性相关项。同时,单位正交矩阵的逆矩阵就是它自己的转置。

    特征值分解

    应某些问题需要,我们经常会用到矩阵对角化的运算。对一个方阵B,我们希望得到
    B=P1AP B = P^{-1}AP
    其中A是对角矩阵,即对角线上的元素非零其他为零。而P是单位正交矩阵,单位正交矩阵的每一列对应的列向量都是单位向量,且两两正交。也就是满足
    diag(A)={λ1,...,λn} diag(A) = \{\lambda_1,...,\lambda_n\}
    PTP=I P^TP = I
    这样的矩阵分解方法也可以写成多个向量外积的加和
    B=λ1p1pnT+...+λnpnpnT B = \lambda_1 p_1p_n^T+...+\lambda_np_np_n^T
    这种分解得到的对角矩阵中的标量称为特征值,每个特征值都会对应一个特征向量。一般的矩阵不一定能对角化,但是对称矩阵一定可以对角化。正定矩阵的特征值都是非负的。

    行列式

    计算大家都懂,它会得到矩阵所有特征值的乘积。一个有用的性质是, 如果方阵线性相关, 行列式的值为0.

    SVD分解

    我们不能对一般的矩阵(不一定是方阵)进行对角化,但是我们可以用一些运算构造出能分解的对称矩阵。
    M=ATAM = A^TA为对称正定矩阵,因为
    (ATA)T=AT(AT)T=ATA (A^TA)^T = A^T(A^T)^T = A^TA
    xTATAx=(xTAT)(Ax)=(Ax)T(Ax)0 x^TA^TAx = (x^TA^T)(Ax) = (Ax)^T(Ax) \ge 0
    很容易看出,M的转置仍然是自己,且不论是用怎样的特征向量,得到的λ\lambda特征值都是非负数。这样我们就能对这个ATAA^TA进行SVD分解
    (ATA)nxn=UTDU (A^TA)_{nxn} = U^TDU
    (AAT)mxm=VTDV (AA^T)_{mxm} = V^TDV
    两个矩阵分解得到的中间的对角矩阵,也就是得到的特征值相同。
    Amxn=VmxmTdiag({λ112,...λn12})UnxnT A_{mxn}=V^T_{mxm}diag(\{\lambda_1^{\frac{1}{2}},...\lambda_n^{\frac{1}{2}}\})U^T_{nxn}
    Amxn=λ112v1u1T+...+λn12vnunT A_{mxn}=\lambda_1^{\frac{1}{2}}v_1u_1^T+...+\lambda_n^{\frac{1}{2}}v_nu_n^T
    这样就能对任意的矩阵进行奇异值的分解。得到的对角矩阵中的标量称为奇异值,左侧矩阵的向量称为左奇异向量,右侧称为右奇异向量。
    SVD分解和特征值分解都常被用作矩阵的压缩保存,我们可以不保存所有特征向量,只保存一部分特征向量来重构原矩阵。

    应用1:线性回归

    我们在学习线性代数时知道用矩阵方法求解线性方程组,事实上对于一个线性方程组Anxnx=yA_{nxn}x=y,我们完全可以用x=A1yx = A^{-1}y来计算线性方程组的解。当然A可逆的条件是A为方阵且A中的每个行向量线性无关,也就是A正定。但是实际使用中我们并不会有那么好的运气,在做线性回归时,我们的数据集的有效数据个数rank和数据维度m不总是相等的。当rank大于m时线性方程组无解,当rank小于m时方程组有无穷个解。解决这个问题的简单方法是使用伪逆。
    我们将不追求得到尽善尽美的解,而是追求最小化均方误差Axy2||Ax-y||_2。这种凸优化问题,我们只需要对均方误差求导就能得到最小化误差的解。
    L=(Axy)T(Axy) L = (Ax-y)^T(Ax-y)
    Lx=2AT(Axy)=0 \frac{\partial L}{\partial x} = 2A^T(Ax-y)=0
    这时得到的解是
    x=(ATA)1ATy x = (A^TA)^{-1}A^Ty
    当A矩阵像上面的列数m多于行数n,则上面的方法并不能得到好的解,因为这时A的秩(最大线性无关行的个数)不会大于n,而n<m,对mxm的方阵我们是无法求逆的。这时我们需要引入L2正则化项让A可逆,我们把上面的损失函数改成Axy2+λαx2||Ax-y||_2+\lambda ||\alpha x ||^2
    x=limα0(ATA+αI)1ATy x = lim_{\alpha \rightarrow 0}(A^TA+\alpha I)^{-1}A^Ty
    这时就可以求逆了,可以直观地理解,我们在每个向量vmv_m的第m维加上了一点点的增量,这样即使原本线性相关的向量也会被变成线性无关。这样,我们就能对任意的A求解一个线性方程组近似解,也就是线性回归解。
    上面的这个(ATA+αI)1AT(A^TA+\alpha I)^{-1}A^T又叫伪逆A+A^+,我们一般会用奇异值分解帮助我们计算伪逆。即A+=VD+UTA^+ = VD^+U^T,对角矩阵D的伪逆就是对D的非零元素取倒数再转置。如果我们用伪逆在数据集上进行线性回归,得到的解会让欧几里得距离,也就是上面的损失函数最小。同时如果引入正则化项,还能在m多于rank时,从无穷个解中找到最小范数的解x。

    实例:小车初速度与加速度测定

    我们在物理实验中会让小车在光滑平面上运动, 通过记录时间和路程构成的多个数据点并做数据分析, 得到小车实际的初速度和加速度. 这个过程实际上是一个线性回归, 我们知道路程-时间公式可以写成
    s=s0+v0t+at2 s = s_0+v_0 t+a t^2
    那么问题实际上是一个三元的线性回归, 变量分别是11, tt, t2t^2, 我们把三元数据和路程做线性回归, 就能得到一个权值向量x, 它的三个维度的意义就是上面的s0,v0,as_0,v_0,a.

    import numpy as np
    
    # 小车斜面下落实验, 加速度为4.9, 初速度2, 初始路程1
    t = np.linspace(0, 5, 20)
    s = 1 + 2*t + 4.9*t**2
    # 加一些噪声,可以理解为实验中的测量误差
    s += np.random.randn(*s.shape)*0.01
    
    # 构造数据的三元矩阵
    A = np.concatenate([np.ones(t.shape).reshape(1,-1),
                        t.reshape(1,-1),
                        (t**2).reshape(1,-1)]).T
    # 计算线性回归的权值向量x
    x = np.linalg.pinv(A).dot(s)
    print("Displacement: %.4f"%(x[0]))
    print("Initial velocity: %.4f"%(x[1]))
    print("Acceleration: %.4f"%(x[2]))
    
    Displacement: 0.9971
    Initial velocity: 1.9972
    Acceleration: 4.9009
    

    应用2:主成分分析(PCA)

    我们希望通过一个线性变换,把现有的数据集XnxmX_{nxm}通过变换矩阵WmxdW_{mxd}变换到d维,从而实现数据降维的需要。这个W要满足正交基的性质,即WTW=IW^TW=I,是单位正交矩阵。
    为了实现"变换后的数据丢失尽可能少的信息",我们会定义一个损失函数,让这些降维后的数据点分得尽可能开。这个损失函数就设定为变换后数据集的方差,我们希望最大化方差。为了处理起来简便,我们在一开始就把X标准化处理,让它的均值为零,那么降维后的均值μ=0\mu=0
    E(W)=inxiWμ22=inxiW22 E(W) = \sum_i^n||x_iW-\mu||_2^2= \sum_i^n||x_iW||_2^2
    这个损失函数可以用上面迹的定义写成非常好看的矩阵乘法形式
    E(W)=tr[(XW)(XW)T] E(W) = tr[(XW)(XW)^T]
    加上上面的W单位正交条件,这个问题是一个约束优化问题,最优解一定满足KKT条件。构造出拉格朗日函数,设$\lambda $是拉格朗日乘子的d维行向量。我们有
    L(W)=E(W)+λtr(WTWI)=tr[(XW)(XW)T]λtr(WTWI) L(W) = E(W)+\lambda tr(W^TW-I) = tr[(XW)(XW)^T] -\lambda tr(W^TW-I)
    LW=2XT(XW)2λW=0XTXW=λW \frac{\partial L}{\partial W} = 2X^T(XW)-2\lambda W = 0 \rightarrow X^TXW = \lambda W
    这说明W中的每个向量都满足XTXwi=λiwiX^TXw_i = \lambda_iw_i的条件,也就是,W中的每个向量都是XTXX^TX的特征向量。但是特征向量可能有很多,我们只需要d个,该选择哪d个呢?让我们回到上面的误差函数E
    E(W)=tr[(XW)T(XW)]=tr[WTXTXW]=tr[WTλW]=tr[λWTW]=tr[λI]=idλi E(W) = tr[(XW)^T(XW)] = tr[W^TX^TXW] = tr[W^T\lambda W]=tr[\lambda W^TW]=tr[\lambda I] = \prod_i^d \lambda_i
    我们会发现我们想最大化的误差E就是w特征向量对应的特征值的乘积。如果我们要最大化这个误差,只需要找最大的d个特征值即可。
    综上,算法的流程为,对X进行标准化,然后对XTXX^TX进行特征值分解,并取出前d个最大特征值对应的特征向量拼接成W,返回XWXW,算法结束。

    实例:数据可视化

    在数据科学中, 我们要处理的数据往往超过三个维度, 几十维甚至上百维的数据是很常见的. 为了直观的观察数据的分布与它的特征之间的关系, 我们常常要用降维手段把它降到2维平面, 再plot出来观察. PCA可以胜任这个工作.
    这里我们用经典的乳腺癌数据集(30维特征)做降维到2维, 并观察数据的分布和类别的关系. 在此之上判断我们下一步该用什么机器学习方法解决问题.

    def PCA(X, dim):
        '''
        X, size(n,m), n个m维的数据点构成的数据集矩阵
        dim, 目标降维维度, dim<m
        '''
        # 归一化处理
        means = np.mean(X,axis = 0)
        X = X.copy()-means
        # 计算要特征值分解的协方差矩阵
        Covs = X.T.dot(X)
        # 特征值分解
        lamda,V = np.linalg.eigh(Covs)
        index = np.argsort(-lamda)[:dim]
        W = V[:,index]
        return X.dot(W)
    
    # 导入数据集
    from sklearn import datasets
    X,y = datasets.load_breast_cancer(return_X_y = True)
    
    X_2dim = PCA(X, 2)
    import matplotlib.pyplot as plt
    import matplotlib
    plt.figure(figsize=(8,6))
    ec_list = ['b' if n==0 else 'r' for n in y]
    plt.scatter(X_2dim[:,0],X_2dim[:,1],c = 'w', edgecolor = ec_list)
    plt.show()
    

    可以看见的是良性肿瘤(红色)的分布较为集中, 表现出高斯簇的形状, 而恶性肿瘤(兰色)则比较发散
    所以我们可以把这个问题用二分类模型来解, 也可以用无监督的多维高斯模型构造异常检测系统
    在这里插入图片描述

    应用3:PageRank

    page rank是google在世纪初使用的搜索引擎技术, 它是一种结合了线性代数, 图论和数值计算的高效机器学习算法. 但究其原理其实并不复杂, 我们先构思一个图模型, 它的每个顶点是一个独立的网页. 这些网页之间被超链接互联, 从而让这个图模型是一个有向图. 这时我们就能给出一个假设, 网络中的用户流在顶点V时, 有等概率流向它的所有其他子顶点. 这样的假设建立了网页间的影响力关系线性方程组, 举个例子, 下面的网页图模型.
    在这里插入图片描述
    也就是, 我们把每个顶点的分流因子1平均赋值到所有子结点, 形成一个nxn的矩阵M. 所有顶点的影响力满足线性方程组Mx=xMx = x
    在这里插入图片描述
    解一个这样的线性方程组就能得到解x, 它就是所有网页的影响力值, 可以通过排序被用在网页的推荐上. 但是这样的解法是有一定问题的, 一个是效率的问题, 我们的网页数目通常会很多, 100k以上都是比较少的了, 这样的线性方程组的系统不适合直接求解, 而且即使直接解, 也不能保证解是唯一的. 因此我们一般使用带约束的迭代解法, 一般如下面的流程.

    1. 初始化x为一个x1=1||x||_1 = 1的向量
    2. 迭代计算xMxx\leftarrow Mx
    3. x不再变化时, 停止迭代

    这是不动点迭代的思想, 因为M的每一列的所有元素和为1, 迭代计算可以保证x1=1||x||_1 = 1始终成立, 而这样的迭代计算会让x向真正的解不断靠近直至收敛. 这个迭代次数一般不会太多, 所以这种解法能适用于有一定特殊性的本问题, 而且效率比RREF的方法高效得多
    这样的解法可行, 但是我们仍然会面临两个很重要的问题, 它们会让解变得无效化.

    1. 等级泄露(Rank Leak):如果一个网页没有出链,就像是一个黑洞一样,吸收了其他网页的影响力而不释放,最终会导致其他网页的 PR 值为 0。
      在这里插入图片描述
    2. 等级沉没(Rank Sink):如果一个网页只有出链,没有入链(如下图所示),计算的过程迭代下来,会导致这个网页的 PR 值为 0
      在这里插入图片描述
      为此我们可以引入一个合理的另一个假设, 我们假设在浏览网页时, 用户不会老老实实跟着超链接走下去, 很有可能看到一半感觉无聊了, 就随机跳到了一个另外的界面. 也就是, 我们引入这样的随机浏览因素, 把原来的M矩阵写成新的PR矩阵
      PR=(1d)M+dOnesn PR = (1-d)M+d \frac{Ones}{n}
      这样的变化会让我们的计算收敛到一个有意义的解, 避免了无效解的产生

    实例: 网页推荐

    我们按照下面的网页连接状况进行建模, 并计算出网络影响力, 以此作为排序标准进行网页推荐.
    在这里插入图片描述

    hyperlinks = [
        (3, 0),
        (3, 1),
        (4, 3),
        (4, 1),
        (1, 2),
        (2, 1),
        (5, 1),
        (4, 5),
        (5, 4),
        (6, 1),
        (6, 4),
        (7, 1),
        (7, 4),
        (8, 1),
        (8, 4),
        (9, 4),
        (10, 4)
    ]
    n = 11
    hyperlinks = np.array(hyperlinks)
    M = np.zeros((n,n))
    M[hyperlinks[:,1],hyperlinks[:,0]] = 1
    for i in range(n):
        if np.sum(M[:,i])>0:
            M[:,i] /= np.sum(M[:,i])
    
    d = 0.175
    PR = (1-d)*M + d*np.ones((n,n))/n
    x = np.ones((n,1))/n
    for iter in range(50):
        x = PR.dot(x)
        x /= np.sum(x)
    
    x = x[:,0]
    x *= 100
    sorted_indices = np.argsort(-x)
    
    for i in sorted_indices:
        name = chr(ord('A')+i)
        print("Page "+name+": Score: %5.3f"%(x[i]))
    
    Page B: Score: 38.322
    Page C: Score: 34.143
    Page E: Score: 8.163
    Page D: Score: 3.943
    Page F: Score: 3.943
    Page A: Score: 3.308
    Page G: Score: 1.636
    Page H: Score: 1.636
    Page I: Score: 1.636
    Page J: Score: 1.636
    Page K: Score: 1.636
    

    小结

    线性代数和概率论给我的感觉是, 它们就是机器学习和深度学习的基石, 比起最优化理论还要重要. 早知如此大一就不听我们的废柴老师讲的线代了, 自己看名校网课不是美滋滋? 我学线代时完全不知道这东西有什么用, 直到自己开始接触高级一点的机器学习问题或者物理建模, 才知道没学好这东西是一个多大的短板.

    展开全文
  • numpy线性代数的应用

    2020-10-21 15:21:31
    Python之Numpy:线性代数/矩阵运算 当你知道工具用处,理论与工具如何结合时候,通常会加速咱们对两者学习效率。 零 numpy 那么,Numpy是什么? NumPy(Numerical Python) 是 Python 语言一个扩展程序库,...

    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(“方程组的解:\n”,X);

    [output]

    方程组的解:
    [ 4.4 -8.2 -1.8]
    2.2 利用最小二乘法拟合函数模型
    给出一组数据【5对(Xi,Yi)参数】,用最小二乘法,求形如:f(x)=a+b*x^3的经验公式。

    原方程(模型)
    f(x)=a+bx3
    其法方程
    ATA(ab)=ATy

    (ab)=(ATA)−1ATy
    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© # [ 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:\n”,A);
    print(“原矩阵b:\n”,b);

    print(“转置矩阵A^T:\n”,np.transpose(A)); # 转置
    print(“矩阵的行列式值|A|:\n”,np.linalg.det(A)); # 方阵的行列式值:|A|
    print(“矩阵的迹trace(A):\n”,np.trace(A));
    print(“矩阵的秩rank(A):\n”,np.linalg.matrix_rank(A));
    print(“逆矩阵A^(-1):\n”,np.linalg.inv(A)); #矩阵的逆运算(条件:矩阵A可逆(行列式值不为0)| 矩阵A为方阵)

    print("*"*30); # 分隔线

    print(“N阶单位矩阵:\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]]
    三 推荐文献
    Numpy - 菜鸟教程
    Numpy学习笔记二——初始化数组的10种方法

    展开全文
  • 学习一门科学,当我们不知道它有何用时,就会怀疑自己为何而学,那么学习的兴趣就很难持久...所以,了解了一些线代的基本概念之后,便忍不住去搜索它在实际生活中的应用场景。 1.计算机图形学中的应用 计算机上...

    学习一门科学,当我们不知道它有何用时,就会怀疑自己为何而学,那么学习的兴趣就很难持久。

    而当我们了解了  何时when 何地where 何人who 为何why 用到了它,就会更想要搞明白 这到底是什么what(或者用到了哪一部分),以及该怎样使用 how 或更好地使用它。

    所以,了解了一些线代的基本概念之后,便忍不住去搜索它在实际生活中的应用场景。

     

    1.计算机图形学中的应用

    计算机上的图形和图像,可以用矩阵表示其信息(包括横纵坐标及颜色),而对图像的变换则可转化为矩阵运算。

    2.经济学中的应用——列昂惕夫投入产出模型

    列昂惕夫因发展了投入产出分析方法及这种方法在经济领域产生和重大作用,而获得诺贝尔经济学奖。

    而列昂惕夫投入产出模型,就借助了矩阵的概念。投入产出分析是研究国民经济各部门间平衡关系所使用的方法。从一般均衡的假定出发,由各部门的产品量的依存关系,得到一个技术系数表(表示每一部门的产品总量与它生产这个总量所需其他部门的产品量的比例,类似于转移矩阵),从而推断想要得到某一产出时,需要的投入,最终计算为满足社会上一定的“最终消费”(即个人及政府消费、投资和输出)所需生产的各种产品总量,并预测国民经济发展的前景。

    {总产出x}={中间需求}+{最终需求d} 

    Reference:

    1.《 线性代数及其应用 (原书第4版)》—— 2.7 计算机图形学中的应用 https://yq.aliyun.com/articles/90588

    2.《 线性代数及其应用 (原书第4版)》—— 2.6 列昂惕夫投入产出模型  https://yq.aliyun.com/articles/90532 

     

     

     

    展开全文
  • 见《线性代数及其应用(第三版)》1.10节 转自 https://blog.csdn.net/u014038143/article/details/78192235

    见《线性代数及其应用(第三版)》1.10节

    转自 https://blog.csdn.net/u014038143/article/details/78192235

    展开全文
  • numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。 一、计算逆矩阵 语法:np.linalg.inv() import numpy as np#导入模块 # 准备一个矩阵 a = np....
  • import numpy as np a = np.mat([[1, 0, 0], [0, 1, 0], [0...矩阵大小 = a.shape #矩阵大小 a[1, 1] #下标读取矩阵中元素 转置矩阵 = a.T #转置矩阵 转置矩阵 = a.transpose() #转置矩阵 行列式值 = np.linalg.d
  • Maxima在线性代数的应用

    千次阅读 2013-01-13 17:54:59
    这篇文章,是介绍Maxima 这套数学软件,在学习线性代数的应用。 Maxima 是一个所谓的“电脑代数系统”(Computer Algebra System, CAS),这种系统比较为人熟知的还有Mathematica 和Maple 等等。我们选定Maxima 做为...
  • 3.就该题进行数学建模–体验线性代数的使用 1.问题介绍 有一个按钮组成的矩阵,其中每行有5个按钮,共5行。每个按钮旁边有一盏灯。当按下一个按钮,该按钮及其上下左右四个按钮控制的灯都会发生状态改变,即,如果灯...
  • 适合于使用MATLAB或正在打算使用MATLAB读者。本书另辟蹊径可以借助或不借助MATLAB随带文档资料让读者自学MATLAB。书中口语化风格,使读者易于阅读。如书名所示,本书提供了读者精通MATLAB所需工具。作为编程...
  • 一、矩阵操作 1、numpy 创建矩阵方法 import numpy as np #1.直接使用分号隔开字符串 mat = np.mat('1 2 3;4 5 6;7 8 9') print(mat) # 2.使用numpy数组创建矩阵 arr = np.arange(1, 10).reshape(3, 3) mat...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,193
精华内容 1,277
关键字:

线性代数的应用