掌握线性代数核心——理解矩阵的特征值和特征向量
今天和大家聊一个非常重要,在机器学习领域也广泛使用的一个概念——矩阵的特征值与特征向量。
我们先来看它的定义,定义本身很简单,假设我们有一个n阶的矩阵A以及一个实数\(\lambda\),使得我们可以找到一个非零向量x,满足:
如果能够找到的话,我们就称\(\lambda\)是矩阵A的特征值,非零向量x是矩阵A的特征向量。
几何意义
光从上面的式子其实我们很难看出来什么,但是我们可以结合矩阵变换的几何意义,就会明朗很多。
我们都知道,对于一个n维的向量x来说,如果我们给他乘上一个n阶的方阵A,得到Ax。从几何角度来说,是对向量x进行了一个线性变换。变换之后得到的向量y和原向量x的方向和长度都发生了改变。
但是,对于一个特定的矩阵A来说,总存在一些特定方向的向量x,使得Ax和x的方向没有发生变化,只是长度发生了变化。我们令这个长度发生的变化当做是系数\(\lambda\),那么对于这样的向量就称为是矩阵A的特征向量,\(\lambda\)就是这个特征向量对应的特殊值。
求解过程
我们对原式来进行一个很简单的变形:
这里的I表示单位矩阵,如果把它展开的话,可以得到一个n元的齐次线性方程组。这个我们已经很熟悉了,这个齐次线性方程组要存在非零解,那么需要系数行列式
不为零,也就是系数矩阵的秩小于n。
我们将这个行列式展开:
这是一个以\(\lambda\)为未知数的一元n次方程组,n次方程组在复数集内一共有n个解。我们观察上式,可以发现\(\lambda\)只出现在正对角线上,显然,A的特征值就是方程组的解。因为n次方程组有n个复数集内的解,所以矩阵A在复数集内有n个特征值。
我们举个例子,尝试一下:
假设:
那么\(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_1\lambda_2=|A|\)。
这个结论可以推广到所有的n都可以成立,也就是说对于一个n阶的方阵A,都可以得到:
- \(\lambda_1+\lambda_2+\cdots+\lambda_n=a_{11}+a_{22}+\cdots+a_{nn}\)
- \(\lambda_1\lambda_2\cdots\lambda_n=|A|\)
案例
我们下面来看一个例子:
我们带入\((A-\lambda I)x=0\),可以得到:
所以: \((3-\lambda)^2 - 1 = 0\),可以看出来\(\lambda_1=2, \quad \lambda_2=4\)
当\(\lambda=2\)时:
解之,可以得到:\(a_1+a_2=0\),所有\((x, -x)\)向量都是A的特征向量。
同理,当\(\lambda = 4\)时:
解之,可以得到:\(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专题,希望大家多多期待。
如果觉得有所收获,请顺手点个关注或者转发吧,你们的支持是我最大的动力。
上一篇: 用Harr特征级联分类器来找出你的目标
下一篇: 三级分类体系表
推荐阅读
-
掌握线性代数核心——理解矩阵的特征值和特征向量
-
求矩阵的特征值和特征向量计算器
-
如何使用电脑计算4x4实矩阵的特征值和特征向量?——特性和向量计算器演示
-
【2022新手指南】Java编程进阶之路 - 六、技术架构篇 ### MySQL索引底层解析与优化实战 - 你会讲解MySQL索引的数据结构吗?性能调优技巧知多少? - Redis深度揭秘:你知道多少?从基础到哨兵、主从复制全梳理 - Redis持久化及哨兵模式详解,还有集群搭建和Leader选举黑箱打开 - Zookeeper是个啥?特性和应用场景大公开 - ZooKeeper集群搭建攻略及 Leader选举、读写一致性、共享锁实现细节 - 探究ZooKeeper中的Leader选举机制及其在分布式环境中的作用 - Zab协议深入剖析:原理、功能与在Zookeeper中的核心地位 - RabbitMQ全方位解读:工作模式、消费限流、可靠投递与配置策略 - 设计者视角:RabbitMQ过期时间、死信队列与延时队列实践指南 - RocketMQ特性和应用场景揭示:理解其精髓与差异化优势 - Kafka详细介绍:特性及广泛应用于实时数据处理的场景解析 - ElasticSearch实力揭秘:特性概述与作为搜索引擎的广泛应用 - MongoDB认知升级:非关系型数据库的优势阐述,安装与使用实战教学 - BIO/NIO/AIO网络模型对比:掌握它们的区别与在网络编程中的实际应用 - Netty带你飞:理解其超快速度背后的秘密,包括线程模型分析 - 网络通信黑科技:Netty编解码原理与常用编解码器的应用,Protostuff实战演示 - 解密Netty粘包与拆包现象,怎样有效应对这一常见问题 - 自定义Netty心跳检测机制,轻松调整检测间隔时间的艺术 - Dubbo轻骑兵介绍:核心特性概览,服务降级实战与其实现益处 - Dubbo三大神器解读:本地存根与本地伪装的实战运用与优势呈现 ----------------------- 七、结语与回顾
-
特征向量的复特征值_线性代数 - 复数矩阵
-
特殊矩阵的特征值和特征向量
-
线性代数:理解特征值运算与矩阵运算之间的对应关系
-
用 MATLAB 查找矩阵的特征值和特征向量
-
线性代数笔记23:理解和操作矩阵的对角化及幂运算
-
理解核心:《线性代数》中的矩阵,那个至关重要的关键概念