小论线性变换
时间:2022-04-21
本文章向大家介绍小论线性变换,主要内容包括EIG分解、SVD分解、特征值与奇异值、参考代码、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
任何一个线性变换都可以用一个矩阵A来表示。
EIG分解
特征值分解的适应情况是:
- 矩阵是方阵
- 矩阵有足够的特征向量
- 如果矩阵有不相同的特征值 ,那么肯定有足够的特征向量
对角矩阵本质上是每个轴上的不耦合地伸缩。
SVD分解
如何将不能对角化的矩阵对角化,不存在奇异值为0的情况,矩阵是方阵
特征值与奇异值
如果一个矩阵的秩为rr,表明这个矩阵表示的空间是rr维的,不等于0的特征值或者奇异值的个数是rr,特征值或者奇异值的绝对值表示对应维度的方差,方差越大表明在这个维度上信息量越大,这个维度也就越重要。
参考代码
% 画图辅助函数
function [] = px(X,p1,p2)
plot(X(1,:),X(2,:),p1)
hold on
plot(X(1,:),X(2,:),p2)
hold off
axis equal
%axis([0 2 0 2])
% 主函数
%% 耦合与解耦
X = [0 0 1 1 0
0 1 1 0 0];
% 对角矩阵
A2 = [1 0
0 2];
X2 = A2*X;
px(X,'ro','r-')
hold on
px(X2,'b*','b:')
hold off;
% 矩阵耦合的情况
A2 = [1 2
0 1];
X2 = A2*X;
px(X,'ro','r-')
hold on
px(X2,'b*','b:')
hold off;
%% 解耦,矩阵可以对角化,有足够的特征向量,按照SDS^{-1}分解
A2 = [1 2
0 2];
% %D =
%
% 1 0
% 0 2
X2 = A2*X;
px(X,'ro','r-')
hold on
px(X2,'b*','b:')
hold off;
% 换坐标系,从单位坐标系换到以特征向量为基底的坐标系
[V,D] = eig(A2)
V*D*inv(V)
Xnew = inv(V)*X; %Xnew是原正方形数据X在新的基下面的坐标
Xnew2 = inv(V)*A2*V*Xnew %Xnew2是经过线性变换A2后在新的基底下的坐标
% 选择特征向量方向为新的坐标,在新的坐标系下横坐标不变,纵坐标是原来的2倍。
px(Xnew,'ro','r-')
hold on
px(Xnew2,'b*','b:')
gtext('A = [1 2 ; 0 1]')
%% 对称矩阵,一定可以对角化,特征值是实数,特征向量标准正交
% 对称矩阵就像对角矩阵那样
% 更深刻地去理解特征值与特征向量
% 特征值本质上是找到了一组完整的不缺失的特征向量后,可以进行解耦地伸缩变换,每个基上伸缩变换的系数
% 如果和压缩联系在一起的话,如果特征向量的长度都一样,那么特征值的绝对值越大表明在这个方向
% 的伸缩越大,理解成方差越大,因此可以利用这种分解去找到最大的方差,寻找如何包含更多的信息。
% D =
%
% -0.5616 0
% 0 3.5616
A2 = [1 2
2 2];
X2 = A2*X;
px(X,'ro','r-')
hold on
px(X2,'b*','b:')
hold off;
% 换坐标系,从单位坐标系换到以特征向量为基底的坐标系
[V,D] = eig(A2)
V*D*inv(V)
Xnew = inv(V)*X; %Xnew是原正方形数据X在新的基下面的坐标
Xnew2 = inv(V)*A2*V*Xnew %Xnew2是经过线性变换A2后在新的基底下的坐标
% 选择特征向量方向为新的坐标,在新的坐标系下横坐标不变,纵坐标是原来的2倍。
px(Xnew,'ro','r-')
hold on
px(Xnew2,'b*','b:')
% 判断是不是符合
mean((D(1,1)*Xnew(1,:) - Xnew2(1,:) ) < 1e-5)
mean((D(2,2)*Xnew(2,:) - Xnew2(2,:) ) < 1e-5)
%% 特征值如果出现0(行列式等于0,不满秩)是什么含义呢
% 在某个基上的分量丢失,原来的系数不为0可能是因为和其他基耦合
% 对角化后D上存在着为0的元素,有几个0说明有几个维度丢失。
A2 = [1 0
0 0];
X2 = A2*X;
px(X,'ro','r-')
hold on
px(X2,'b*','b:')
hold off;
% 换坐标系,从单位坐标系换到以特征向量为基底的坐标系
[V,D] = eig(A2)
V*D*inv(V)
Xnew = inv(V)*X; %Xnew是原正方形数据X在新的基下面的坐标
Xnew2 = inv(V)*A2*V*Xnew %Xnew2是经过线性变换A2后在新的基底下的坐标
% 选择特征向量方向为新的坐标,在新的坐标系下横坐标不变,纵坐标是原来的2倍。
px(Xnew,'ro','r-')
hold on
px(Xnew2,'b*','b:')
%% 不能对角化意味着什么
% 找不到上面那些好的性质,特征向量之间线性相关充满不了整个空间
% 但是只是在变换前后同一个基的条件下找不到
A2 = [1 2
0 1];
X2 = A2*X;
px(X,'ro','r-')
hold on
px(X2,'b*','b:')
hold off;
% 换坐标系,从单位坐标系换到以特征向量为基底的坐标系
[V,D] = eig(A2)
V*D*inv(V)
Xnew = inv(V)*X; %Xnew是原正方形数据X在新的基下面的坐标
Xnew2 = inv(V)*A2*V*Xnew %Xnew2是经过线性变换A2后在新的基底下的坐标
% 选择特征向量方向为新的坐标,在新的坐标系下横坐标不变,纵坐标是原来的2倍。
px(Xnew,'ro','r-')
hold on
px(Xnew2,'b*','b:')
% 判断是不是符合
mean((D(1,1)*Xnew(1,:) - Xnew2(1,:) ) < 1e-5)
mean((D(2,2)*Xnew(2,:) - Xnew2(2,:) ) < 1e-5)
%% 如何将不能对角化的矩阵对角化,不存在奇异值为0的情况,矩阵是方阵
% SVD,构建起两个不同的坐标基
% 与特征值相对的,这里引入的是奇异值
% S =
%
% 2.4142 0
% 0 0.4142
A2 = [1 2
0 1];
[V,D] = eig(A2)
V
[U,S,V] = svd(A2);
Xnew = inv(V)*X; %Xnew是原正方形数据X在新的基下面的坐标
Xnew2 = inv(U)*A2*V*Xnew; %Xnew2是经过线性变换A2后在新的基底下的坐标
% 选择特征向量方向为新的坐标,在新的坐标系下横坐标不变,纵坐标是原来的2倍。
px(Xnew,'ro','r-')
hold on
px(Xnew2,'b*','b:')
% 判断是不是符合
mean((S(1,1)*Xnew(1,:) - Xnew2(1,:) ) < 1e-5)
mean((S(2,2)*Xnew(2,:) - Xnew2(2,:) ) < 1e-5)
- 理解cookie的path和domain属性
- 静态页面设置缓存、动态页面设缓存(不断更新中。。。。)
- 区块链技术如何把你的游戏资产真正变为你的资产
- Python标准库07 信号 (signal包,部分os包)
- 当css属性width设为100%时
- GridView实战一:自定义分页、排序、修改、插入、删除
- Windows下程序打包发布时的小技巧
- Linux的“壳”
- 网页优化系列一:合并文件请求(asp.net版)
- Windows下Thumbnail的开发总结
- 剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)
- Linux架构
- 绘图: Python matplotlib简介
- 绘图: matplotlib Basemap简介
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- GXYCTF2019-PingPingPing
- 利用cloudflareWorkers制作Google镜像站
- MySQL information_schema详解 COLLATIONS
- 极客大挑战2019-Knife
- DB2备份还原相关操作
- MySQL复制全解析 Part 8 MySQL Auto-Positioning
- Redis 5.0.8 主从搭建
- Linux 修改网卡名称及mac地址
- MySQL Galera Cluster全解析 Part 10 grastate.dat文件详解
- MySQL MHA部署 Part 7 MHA手动切换测试
- 使用sysbench进行压测 Part2 sysbench语法介绍
- mysqlbinlog命令详解 Part 1-实验环境准备
- mysqlbinlog命令详解 Part 2 -MySQL 事件类型
- mysqlbinlog命令详解 Part 4 -查看行事件具体SQL语句
- mysqlbinlog命令详解 Part 5 通过位置和时间查看日志