zoukankan      html  css  js  c++  java
  • 线性代数精华——矩阵的特征值与特征向量

    今天和大家聊一个非常重要,在机器学习领域也广泛使用的一个概念——矩阵的特征值与特征向量。

    我们先来看它的定义,定义本身很简单,假设我们有一个n阶的矩阵A以及一个实数(lambda),使得我们可以找到一个非零向量x,满足:

    [Ax=lambda x ]

    如果能够找到的话,我们就称(lambda)是矩阵A的特征值,非零向量x是矩阵A的特征向量。


    几何意义


    光从上面的式子其实我们很难看出来什么,但是我们可以结合矩阵变换的几何意义,就会明朗很多。

    我们都知道,对于一个n维的向量x来说,如果我们给他乘上一个n阶的方阵A,得到Ax。从几何角度来说,是对向量x进行了一个线性变换。变换之后得到的向量y和原向量x的方向和长度都发生了改变。

    但是,对于一个特定的矩阵A来说,总存在一些特定方向的向量x,使得Ax和x的方向没有发生变化,只是长度发生了变化。我们令这个长度发生的变化当做是系数(lambda),那么对于这样的向量就称为是矩阵A的特征向量,(lambda)就是这个特征向量对应的特殊值。


    求解过程


    我们对原式来进行一个很简单的变形:

    [(A-lambda I)x = 0 ]

    这里的I表示单位矩阵,如果把它展开的话,可以得到一个n元的齐次线性方程组。这个我们已经很熟悉了,这个齐次线性方程组要存在非零解,那么需要系数行列式

    [|A-lambda I| ]

    不为零,也就是系数矩阵的秩小于n。

    我们将这个行列式展开:

    [left| egin{matrix} a_{11}-lambda & a_{12} & cdots & a_{1n} \ a_{21} & a_{22} - lambda & cdots & a_{2n} \ vdots & vdots & & vdots \ a_{n1} & a_{n2} & cdots & a_{nm} - lambda end{matrix} ight| ]

    这是一个以(lambda)为未知数的一元n次方程组,n次方程组在复数集内一共有n个解。我们观察上式,可以发现(lambda)只出现在正对角线上,显然,A的特征值就是方程组的解。因为n次方程组有n个复数集内的解,所以矩阵A在复数集内有n个特征值。

    我们举个例子,尝试一下:

    假设:

    [A=left[ egin{matrix} a_{11}-lambda & a_{12} \ a_{21} & a_{22}-lambda \ end{matrix} ight] ]

    那么(f(lambda)=(a_{11}-lambda)(a_{22}-lambda)-a_{12}a_{21}=lambda^2-(a_{11}+a_{22})lambda-|A|),我们套入求根公式可以得出使得(f(lambda)=0)的两个根(lambda_1, lambda_2),有:(lambda_1+lambda_2=a_{11}+a_{22},quad lambda_1lambda_2=|A|)

    这个结论可以推广到所有的n都可以成立,也就是说对于一个n阶的方阵A,都可以得到:

    1. (lambda_1+lambda_2+cdots+lambda_n=a_{11}+a_{22}+cdots+a_{nn})
    2. (lambda_1lambda_2cdotslambda_n=|A|)

    案例


    我们下面来看一个例子:

    [A=left[ egin{matrix} 3 & 1 \ 1 & 3 end{matrix} ight]]

    我们带入((A-lambda I)x=0),可以得到:

    [left| egin{matrix} 3-lambda & 1 \ 1 & 3 - lambda end{matrix} ight|=0 ]

    所以: ((3-lambda)^2 - 1 = 0),可以看出来(lambda_1=2, quad lambda_2=4)

    (lambda=2)时:

    [left[ egin{matrix} 3 & 1\ 1 & 3 end{matrix} ight]x = 2x ]

    [left[ egin{matrix} 3 & 1\ 1 & 3 end{matrix} ight][a_1, a_2]^T = [2a_1, 2a_2]^T ]

    [egin{aligned} 3a_1 + a_2 &= 2a_1 \ a_1 + 3a_2 &= 2a_2 end{aligned} ]

    解之,可以得到:(a_1+a_2=0),所有((x, -x))向量都是A的特征向量。

    同理,当(lambda = 4)时:

    [egin{aligned} left[ egin{matrix} 3 & 1\ 1 & 3 end{matrix} ight]x &= 4x \ left[ egin{matrix} 3 & 1\ 1 & 3 end{matrix} ight][a_1, a_2]^T &= [4a_1, 4a_2]^T \ 3a_1 + a_2 &= 4a_1 \ a_1 + 3a_2 &= 4a_2 end{aligned} ]

    解之,可以得到:(a_1=a_2),所有((x, x))向量都是A的特征向量。


    使用Python求解特征值和特征向量


    在我们之前的文章当中,我们就介绍过了Python在计算科学上的强大能力,这一次在特征值和特征矩阵的求解上也不例外。通过使用numpy当中的库函数,我们可以非常轻松,一行代码,完成特征值和特征向量的双重计算。

    我们一起来看代码:

    import numpy as np
    
    a = np.mat([[3, 1], [1, 3]])
    lam, vet = np.linalg.eig(a)
    

    np.linalg.eig 方法会返回两个值,第一个返回值是矩阵的特征值,第二个返回值是矩阵的特征向量,我们看下结果:

    这里的特征向量为什么是0.707呢?因为Python自动帮我们做好了单位化,返回的向量都是单位向量,不得不说实在是太贴心了。


    总结


    关于矩阵的特征值和特征向量的介绍到这里就结束了,对于算法工程师而言,相比于具体怎么计算特征向量以及特征值。理解清楚它们的概念和几何意义更加重要,因为这两者在机器学习的领域当中广泛使用,在许多降维算法当中,大量使用矩阵的特征值和特征向量。

    对于降维算法的原理,这里不过多赘述,我们会在以后的文章当中更新相关内容。感兴趣的同学可以小小期待一下。

    文章到这里就结束了,这也是线性代数专题的最后一篇文章,短短六篇文章当然不能涵盖线性代数这门学科当中的所有知识点,但实际当中常用的内容基本上已经都包括了。下周我们将开始全新的Python专题,希望大家多多期待。

    如果觉得有所收获,请顺手点个关注或者转发吧,你们的支持是我最大的动力。

  • 相关阅读:
    防雪崩利器:熔断器 Hystrix 的原理与使用
    SpringBoot返回结果为null或空值不显示处理方法
    Tomca原理分析之责任链
    TOMCAT原理详解及请求过程
    RocketMQ支持事务消息机制
    ubuntu 安装rocketmq
    Monkey安装与配置教程
    Monkey通过安装包获取包名
    git使用笔记
    Linux解压命令
  • 原文地址:https://www.cnblogs.com/techflow/p/12258342.html
Copyright © 2011-2022 走看看