资讯动态

线性代数几何意义:从向量空间变形到SVD可视化

发布时间:2026/10/14 0:09:11 来源:尧图企业网站定制
1. 为什么“线性代数几何意义”值得专门开一场大杂烩你有没有过这种时刻矩阵乘法算得飞快特征值求得准确可当老师在黑板上画出一个向量被A变换后拉伸又旋转的示意图时你突然愣住——这串数字运算到底在空间里干了什么不是不会算是算完不知道“它长什么样”。这正是绝大多数人学线性代数时最真实的断层代数符号和几何直觉之间横着一道看不见却极难跨越的沟。而“线性代数几何意义大杂烩”这个标题说白了就是一次集中爆破——不讲定义推导不堆公式证明只做一件事把那些藏在行列式、秩、特征向量、奇异值背后的“空间动作”全给你扒开、摊平、摆到眼前让你亲手摸到它们的形状、方向和力度。我带过不少跨专业转行学数据科学的同学其中一位某高校物理系毕业的A同学矩阵理论功底扎实但第一次接触PCA降维时完全卡壳。他能写出协方差矩阵的全部推导却无法解释“为什么取前k个主成分就等价于在原始空间中找一个k维子空间让所有点投影过去后总误差最小”。后来我们花了整整一上午只用一张白纸、一支笔、三个坐标轴反复画点、画基、画投影、画误差向量当他亲手把三维散点云“压扁”成二维椭圆盘并看到那两条最长轴恰好就是协方差矩阵的两个特征向量时他拍了下桌子“原来‘主成分’不是算出来的是‘长’出来的”——这句话让我意识到几何意义不是辅助理解的“花边”而是线性代数真正的骨架。它不解决“怎么算”但彻底回答“为什么这么算”。本篇内容覆盖的正是这些高频、高价值、却常被教科书一笔带过的几何直觉从最基础的向量加法如何对应平行四边形法则到SVD分解如何天然给出数据的“最佳压缩视角”从秩为何等于列空间维数到为什么正交矩阵乘法就是刚体旋转。所有解释都基于真实教学与工程调试中的反复验证不依赖抽象定义只依赖你能画出来、能比划出来、能用Python或Matlab立刻可视化出来的空间操作。适合三类人一是正在啃课本却总感觉“隔一层”的初学者二是需要快速建立模型直觉的数据从业者三是想把数学讲得让学生眼睛发亮的一线教师。接下来我们就从最朴素的起点出发一砖一瓦把这座几何意义的大楼盖起来。2. 核心概念的几何解码从向量到矩阵每一步都在空间里“动手”2.1 向量不只是箭头更是坐标系里的“位移指令”很多人把向量简单理解为“有方向有长度的箭头”这没错但远远不够。在几何意义框架下向量的本质是一条位移指令——它告诉你从原点出发沿着某个方向走多远。这个“指令”之所以强大在于它完全独立于你选择的坐标系。举个例子假设你在某实验室里用激光测距仪标定出两个固定点P和Q它们之间的位移向量v Q − P。无论你用直角坐标系x, y、极坐标系r, θ还是随手在墙上画的歪斜坐标系u, w这个向量v所代表的“从P走到Q”这一物理动作始终不变。变化的只是你用来描述它的数字组合在标准基底下v可能是[3, 4]换到一组斜交基底下它可能变成[5, 1]。但向量本身是那个客观存在的位移。提示当你看到一个列向量[2; −1]别急着把它当成两个数字。先闭眼想象站在原点向右走2步再向下走1步你停下的那个点就是这个向量的终点。这个“走法”就是它的几何生命。实操中这个理解直接决定你能否看懂基变换。比如某图像处理Demo中原始像素坐标用标准基表示但算法内部为了计算效率临时切换到一组正交小波基。此时同一个像素位置在两套基底下坐标不同但其在图像平面上的实际物理位置分毫不差。我曾调试过一个实时视频滤镜因误将新基下的坐标直接当作屏幕像素使用导致画面整体偏移——问题根源就是混淆了“向量指令”和“坐标数字”。2.2 矩阵空间的“变形器”而非冰冷的数表如果说向量是位移指令那么矩阵就是空间变形器。一个m×n矩阵A作用于一个n维向量x得到m维向量y Ax这个过程在几何上就是把x所在的n维空间通过A这个“模具”挤压、拉伸、旋转、折叠最终映射到m维空间中去。关键在于这个变形是线性的——意味着它必须满足两个铁律(1) A(x y) Ax Ay叠加性(2) A(cx) c(Ax)齐次性。这两条规则直接锁定了所有可能的变形类型只能是平移不线性变换必须保原点所以严格来说不能平移平移属于仿射变换、旋转、缩放、剪切、投影以及它们的任意组合。绝不可能出现弯曲、扭曲、打结这类非线性操作。以最经典的2×2矩阵为例。考虑矩阵A [[2, 0], [0, 0.5]]。它对任意向量[x; y]的作用是[2x; 0.5y]。几何上这就是一个沿x轴拉伸2倍、沿y轴压缩一半的纯缩放变换。所有点都被“横向撑开、纵向压扁”。再看B [[0, −1], [1, 0]]它把[x; y]变成[−y; x]——这正是绕原点逆时针旋转90度的标准操作。而C [[1, 1], [0, 1]]把[x; y]变成[xy; y]效果是y坐标不变x坐标额外加上一个y值。画出来就是典型的“水平剪切”网格线被斜向拉长像一摞扑克牌被水平推歪。这三个例子就是线性变换几何意义的基石模板。后续所有复杂概念都是它们的变体或组合。2.3 行列式变形的“体积缩放因子”行列式det(A)常被初学者视为一个神秘的计算结果。但它的几何意义极其直观它告诉你矩阵A作用于空间时单位体积如单位正方体会被放大或缩小多少倍。在2D中det(A)是单位正方形经A变换后所得平行四边形的有向面积在3D中它是单位立方体变换后所得平行六面体的有向体积。这里有两个关键细节必须吃透。第一“有向”意味着符号很重要。det(A) 0说明变换保持了空间的“手性”比如右手系仍为右手系det(A) 0则发生了镜像翻转右手系变左手系典型操作就是关于某条直线的反射。第二det(A) 0这是几何意义的“死亡判决书”——它意味着A把原本n维的空间彻底压扁到了一个更低维的子空间里。例如一个3×3矩阵行列式为0说明它把整个3D空间压成了一个平面、一条线甚至只是一个点。此时A的列向量必然线性相关它们张成的空间维度即秩小于3。我在调试一个机器人运动学求解器时就曾因忽略这一点而陷入死循环当机械臂处于奇异位形时雅可比矩阵J的行列式趋近于0这意味着末端执行器在某个方向上完全失去了运动能力——J把6维关节速度空间压扁成了一个5维甚至更低的操作空间。不理解det0的几何含义就永远无法真正读懂“奇异位形”四个字的重量。2.4 秩空间变形的“有效维度”秩rank(A)是线性代数里最被低估的概念之一。它的代数定义是“行向量组或列向量组的极大线性无关组所含向量的个数”但几何上它就是矩阵A所能到达的最高空间维度。更直白地说A把输入空间Rⁿ映射出去它能覆盖到的最大“地盘”是一个rank(A)维的子空间。举个生活化例子。想象你有一台老式投影仪光源是点状的镜头可以调节。当你把镜头调到最清晰时投在墙上的是一幅完整的、有宽度和高度的图像2D。此时投影变换的秩是2。如果你不小心把镜头拧得太紧光束被极度收束墙上只剩一条细细的亮线1D秩就降为1。如果镜头彻底堵死墙上一片漆黑0D秩就是0。矩阵的秩就是这个“投影清晰度”的量化指标。它决定了Ax b这个方程组是否有解b必须落在A的列空间内即rank(A)维的子空间里也决定了A是否可逆只有满秩方阵才能实现一一对应的双向映射。在某跨平台系统开发中我们用矩阵来建模用户行为路径。当发现某类用户的路径矩阵秩持续偏低时我们立刻意识到这群用户的行为模式高度同质化几乎被限制在少数几条主路径上——这直接指导了个性化推荐策略的调整而不是盲目增加模型复杂度。3. 高阶工具的几何透视从特征值到SVD看清数据的“骨骼”与“筋络”3.1 特征值与特征向量空间变形中的“不动轴线”特征值λ和特征向量v满足Av λv。这个等式在几何上揭示了一个惊人的事实在矩阵A所代表的整个空间变形过程中存在一些特殊的方向即特征向量v的方向沿着这些方向的向量经过A变换后只发生长度的缩放λ倍而方向本身岿然不动或反向若λ为负。这些方向就是空间变形的“主轴”或“不动轴线”。这不是数学游戏。在实际应用中它直接对应物理世界的稳定结构。比如在结构力学中一个桥梁的刚度矩阵K的特征向量就代表了该桥在受力时最容易发生的几种振动模态形状对应的特征值则是这些模态的固有频率平方。再比如在图像处理中一张人脸灰度图可以看作一个向量其协方差矩阵C的特征向量就是所谓的“特征脸”Eigenface。每一个特征脸都代表了人脸图像空间中一个最主要的、独立的变化方向——有的控制胖瘦有的控制明暗有的控制嘴型。当我第一次用OpenCV加载出前10个特征脸并逐个叠加回原图时那种“原来这张脸是由这十几个基本形状拼凑而成”的震撼感远超任何公式推导。特征值的大小则直接告诉你这个变化方向的“重要性”λ越大说明在这个方向上数据的离散程度越高信息量越丰富。因此PCA降维的本质就是放弃那些λ极小的特征向量所张成的、信息贫瘠的方向只保留λ最大的前k个从而在损失最少信息的前提下将数据投影到一个更紧凑的k维子空间。3.2 奇异值分解SVD任意矩阵的“终极几何解构”如果说特征值分解是方阵的“专属特权”那么SVD就是所有矩阵无论方阵与否无论是否对称的“通用解剖刀”。它将任意m×n矩阵A分解为A UΣVᵀ其中U和V都是正交矩阵代表纯旋转/反射Σ是一个对角矩阵对角线元素σ₁ ≥ σ₂ ≥ … ≥ σᵣ 0称为奇异值r rank(A)。SVD的几何意义堪称线性代数的皇冠明珠。它告诉我们任何线性变换A都可以被拆解为三步纯粹的几何操作(1) 先在输入空间Rⁿ中进行一次正交变换Vᵀ旋转/反射(2) 然后在中间空间中沿r个相互垂直的轴进行不同程度的缩放由Σ的奇异值σᵢ控制(3) 最后在输出空间Rᵐ中再进行一次正交变换U旋转/反射。这三步完美分离了“方向调整”和“尺度调整”。这个分解的威力在数据压缩与去噪中体现得淋漓尽致。假设A是一张1000×1000的灰度图片矩阵。完整存储它需要10⁶个数值。但如果我们只保留前50个最大的奇异值及其对应的左右奇异向量那么只需存储50个σᵢ 50×1000U的前50列 50×1000V的前50列≈ 10⁵个数值压缩率高达90%。更重要的是重建的图片A₅₀ U₅₀Σ₅₀V₅₀ᵀ虽然丢失了大量细节但保留了图片最核心的“轮廓”和“结构”——因为那些微小的奇异值恰恰对应着图像中高频的噪声和纹理。我在处理一批工业相机拍摄的金属表面缺陷图时就用SVD做了预处理先对每张图做SVD然后将σᵢ 0.1% × σ₁的所有奇异值置零再重建。结果背景的随机噪点被大幅抑制而真正的划痕、凹坑等结构性缺陷反而更加凸显后续的边缘检测准确率提升了近40%。SVD不是魔法它只是忠实地告诉你数据的“骨骼”由大σᵢ定义在哪里“血肉”由小σᵢ定义又在哪里。3.3 伪逆Moore-Penrose Inverse当“不可逆”成为常态时的几何救星现实世界中满秩方阵是奢侈品。更多时候我们面对的是欠定方程方程少于未知数如Ax bA是m×n且m n或超定方程方程多于未知数如Ax ≈ bA是m×n且m n。此时传统逆矩阵不存在但伪逆A⁺却能给出一个“最优”的答案。它的几何意义是在所有可能的解中找到那个离原点最近的解欠定情况或在所有可能的投影中找到那个让误差||Ax − b||²最小的投影超定情况。具体来说对于超定系统Ax ≈ b最小二乘解x* A⁺b其几何本质是将向量b垂直投影到A的列空间即A所能到达的所有点构成的子空间上得到投影点p然后x就是那个能通过A精确生成p的输入向量即Ax p。这个“垂直投影”保证了误差向量(b − p)与整个列空间正交从而实现了误差的全局最小化。在某高校的课程设计项目中学生需要用多个传感器读数融合估计一个物理量。由于传感器精度不一直接平均效果很差。引入加权最小二乘后他们将每个读数的权重设为其信噪比的平方构建出加权矩阵W最终求解(WA)⁺Wb。结果估计值的标准差比简单平均降低了60%以上。这个成功不在于他们多会编程而在于他们真正理解了伪逆不是一堆符号的运算而是空间里一次精准的“垂足定位”。4. 实战场景深度还原从课堂习题到工业级问题的几何建模全过程4.1 场景一3D点云配准——刚体变换的几何落地问题给定两组来自不同视角的同一物体的3D扫描点云P和Q如何找到一个旋转矩阵R和平移向量t使得RP t尽可能接近Q这是计算机视觉和机器人导航中的基础问题。代数解法往往直接套用ICP迭代最近点算法但若缺乏几何直觉调试起来如同盲人摸象。正确的几何建模思路是首先刚体变换的核心约束是保距——任意两点间的距离在变换前后必须严格相等。这意味着R必须是正交矩阵RᵀR I且det(R) 1排除镜像只保留纯旋转。其次平移t的作用是将两组点云的“重心”对齐。因此第一步必然是计算P的重心cₚ mean(P)Q的重心c_q mean(Q)然后将两组点云中心化P P − cₚQ Q − c_q。此时问题简化为寻找R使得RP ≈ Q。关键的几何洞察在此刻出现中心化后的点云其协方差矩阵H PQᵀ的SVD分解H UΣVᵀ能直接给出最优旋转R VUᵀ。为什么因为SVD本质上是在寻找两组点云各自主轴之间的最优对齐方式。U的列是P的主轴方向V的列是Q的主轴方向而VUᵀ这个乘积正是将P的主轴“旋转”到Q主轴所需的最小角度旋转。我在调试一个AR眼镜的手势识别模块时就曾因跳过中心化步骤导致R计算严重偏差——算法试图用旋转去补偿本该由平移完成的重心偏移结果手势轨迹抖动剧烈。补上cₚ和c_q的计算后抖动瞬间消失。这个案例反复印证几何建模的每一步都有其不可替代的空间逻辑。4.2 场景二推荐系统中的协同过滤——低秩近似的几何本质问题一个电商网站有百万用户和十万商品用户-商品交互矩阵R非常稀疏大部分用户只买过极少商品。如何预测用户u对未购买商品i的评分传统方法如矩阵分解将R近似为两个低秩矩阵的乘积R ≈ U·Vᵀ其中U是用户隐因子矩阵m×kV是商品隐因子矩阵n×kk min(m, n)。代数上这是在最小化||R − UVᵀ||_F²。但其几何意义更为深刻它是在高维稀疏的用户-商品交互空间中强行寻找一个k维的“兴趣流形”Manifold让所有用户和商品都能被这个流形上的点即U和V的行向量所表征。每个用户向量uᵢ ∈ Rᵏ代表该用户在这个k维兴趣空间中的坐标每个商品向量vⱼ ∈ Rᵏ代表该商品在同一空间中的坐标。两者内积uᵢᵀvⱼ就是用户i对商品j的偏好强度。这个k维空间就是SVD中由前k个最大奇异值所张成的“主子空间”。它过滤掉了原始矩阵R中由噪声、偶然点击、数据稀疏性引入的“虚假维度”只保留了最稳定的、能解释大部分交互模式的“兴趣主轴”。某公司曾上线一个新版本的推荐引擎将k从50提升到200理论上模型容量更大。但A/B测试结果显示点击率反而下降了5%。深入分析发现过大的k让模型过度拟合了长尾商品的稀疏噪声破坏了兴趣流形的平滑性。最终他们采用奇异值衰减曲线Scree Plot来确定最优k当σₖ/σ₁下降到5%以下时停止增加k。这个决策完全基于对SVD几何意义的理解——不是参数越多越好而是要找到那个能承载真实信号、同时摒弃噪声的“恰到好处”的维度。4.3 场景三电路网络分析——基尔霍夫定律的线性空间表达问题一个复杂电路包含多个电阻、电源和节点如何系统性地求解各支路电流初学者常陷于列写KCL基尔霍夫电流定律和KVL基尔霍夫电压定律方程的繁琐中。但若用线性代数几何视角整个电路就是一个定义在图Graph上的向量空间。节点电压构成一个|N|维向量v|N|为节点数支路电流构成一个|B|维向量i|B|为支路数。关联矩阵A|N|×|B|则编码了电路的拓扑结构每一列对应一条支路1表示电流流入该节点−1表示流出0表示不相关。此时KCL定律直接写作A i 0所有节点的净流入电流为0。而欧姆定律和KVL则共同构成了另一个方程i C v其中C是一个对角矩阵其对角线元素是各支路电导1/电阻。于是整个系统可统一写为A C Aᵀ v A C s其中s是电源向量。这里的A C Aᵀ就是著名的拉普拉斯矩阵L。它的几何意义是电路图在“电压空间”中的“刚度”或“连通性”度量。L的零空间null space维度等于电路中独立连通分量的个数而L的非零特征值则反映了各连通分量内部的“电气紧密度”。我在协助某实验室搭建一个大型传感器网络时就利用L的第二小特征值Fiedler值来评估网络的鲁棒性该值越大说明网络越不容易被单点故障割裂。当发现某版PCB布线导致Fiedler值骤降时我们立刻重新设计了关键节点的冗余连接。这个判断完全脱离了具体元件参数只依赖于图的拓扑结构和拉普拉斯矩阵的几何性质。5. 常见误区与避坑指南那些年我们在几何直觉上踩过的坑5.1 误区一“正交”等于“垂直”小心坐标系陷阱这是最普遍、也最危险的误解。在标准笛卡尔坐标系下两个向量点积为0确实意味着它们在纸上画出来是垂直的。但一旦坐标系不再是标准正交基比如用了斜交基或者进行了非均匀缩放点积为0的几何含义就变了。此时它代表的是在该特定度量Metric下“正交”而非欧氏空间中的直观垂直。我曾在一个金融风控模型中栽过跟头。模型使用了一种自定义的距离度量其度量矩阵M不是单位阵。在计算特征向量时我错误地使用了标准点积⟨u, v⟩ uᵀv来判断正交性结果发现不同特征向量的“夹角”在可视化时根本不是90度。后来才明白正确的内积定义应为⟨u, v⟩_M uᵀMv。只有当uᵀMv 0时u和v在M定义的度量下才是正交的。这个教训让我养成了一个习惯每次涉及“正交”、“投影”、“范数”等概念时第一反应永远是问自己“这里的‘正交’是相对于哪个内积定义的”——这个问题的答案往往就是整个模型是否稳健的分水岭。5.2 误区二把“特征向量”当成唯一解忽略了其方向的任意性特征向量v满足Av λv但若v是特征向量那么任意非零标量c·v也一定是。这意味着特征向量只定义了一个方向而非一个具体的向量。在PCA中第一个主成分方向是唯一的但你可以用[1, 2]来表示它也可以用[−0.447, −0.894]单位化后的反向向量来表示它两者完全等价。这个看似简单的事实在实际部署中却极易引发灾难。某公司的推荐系统每天凌晨用新数据重训一次模型输出新的用户隐向量U。但前端App在加载U时没有做任何方向归一化处理。结果某天训练出的U的第一列是[1, 2, 3]第二天却是[−1, −2, −3]。虽然数学上完全等价但前端代码将其视为“用户兴趣发生了180度反转”触发了错误的推送逻辑。解决方法极其简单在保存和加载U之前强制规定每个特征向量的第一个非零元素必须为正。这个小小的“方向锚定”操作彻底杜绝了此类问题。它提醒我们几何对象的“方向”虽自由但工程实现必须有确定的约定。5.3 误区三认为“秩低”就一定“简单”警惕病态条件数低秩矩阵常被等同于“结构简单”、“易于处理”。这在理想情况下成立但现实中一个矩阵的秩与其条件数Condition Number并无直接关系。条件数κ(A) σ₁/σᵣ衡量的是矩阵对输入扰动的敏感度。一个秩为100的矩阵如果其最大的奇异值σ₁是10⁶而最小的非零奇异值σ₁₀₀是10⁻⁶那么κ(A) 10¹²这是一个极度病态的矩阵微小的输入误差会被放大万亿倍。我在调试一个高精度惯性导航解算模块时就遇到了这个陷阱。系统矩阵A的秩是满的6但其条件数高达10⁸。当我用双精度浮点数直接求解Ax b时解x的最后几位数字完全不可信。最终解决方案不是去追求更高精度的硬件而是改用截断SVD只保留σᵢ ε·σ₁的奇异值ε设为10⁻⁴然后用这些“强壮”的奇异值来构造伪逆。这相当于在几何上主动放弃那些对噪声极度敏感的、微弱的“变形方向”只信任那些主导性的、稳健的变形模式。这个操作本质上是对矩阵所定义的空间变形进行了一次“健康体检”和“择优录取”。5.4 误区四可视化时只画“结果”不画“过程”失去动态理解很多教程在讲解矩阵变换时只展示变换前后的静态图像一个网格然后是变形后的网格。这固然直观但丢失了最关键的信息——变形是如何一步步发生的我的做法是永远用动画来呈现。例如要理解一个复合变换AB先B后A我不直接画AB作用后的最终网格而是分三帧第一帧是原始网格第二帧是B作用后的中间网格第三帧是A再作用于第二帧的结果。更进一步我会用插值让时间t从0到1显示(1−t)I tAB的变换效果让网格像被一只无形的手缓缓拉扯过去。这种动态视角能让你清晰看到哪些区域被剧烈拉伸雅可比行列式大哪些区域被压缩雅可比行列式小哪些角度被扭曲非正交变换。在向某高校导师演示一个新型图像配准算法时正是这段3秒的变形动画让他一眼就抓住了算法的核心创新点——它通过一个特殊的非线性插值确保了中间过程的雅可比行列式始终大于0.5从而避免了图像折叠folding这一常见伪影。静态图能说明“是什么”而动态过程才能揭示“为什么这样设计”。6. 工具链与可视化实践用代码把几何意义“画”出来6.1 核心工具选型为什么是Matplotlib NumPy而不是其他在众多Python科学计算库中我始终坚持用NumPy处理核心线性代数运算用Matplotlib进行二维/三维可视化。原因非常务实它们的API设计与线性代数的几何直觉高度吻合。NumPy的数组ndarray本身就是向量和矩阵的自然载体其广播broadcasting机制完美模拟了向量与标量、向量与矩阵之间的几何运算如向量平移、矩阵缩放而Matplotlib的plt.quiver()函数专为绘制向量场而生plt.pcolormesh()则能无缝对接矩阵的格点数据。相比之下某些高级封装库如Seaborn虽然绘图更美观但其抽象层级过高隐藏了底层的几何操作细节不利于教学和调试。而像Plotly这样的交互式库虽然能做3D旋转但在处理大量点云或实时动画时性能开销巨大且其JavaScript后端与Python数值计算的耦合增加了调试复杂度。我曾尝试用TensorFlow的tf.linalg.svd替代NumPy的np.linalg.svd结果发现前者在GPU上虽快但返回的U、V矩阵的符号sign是随机的导致每次运行动画时旋转方向都可能颠倒——这在几何演示中是致命的。最终我回归到NumPy并在SVD后手动添加了符号校准步骤确保U[:, 0]的第一个元素为正一切问题迎刃而解。工具的价值不在于它有多炫而在于它是否能让你的几何直觉毫无阻碍地流淌到屏幕上。6.2 关键可视化代码片段从向量到SVD的全流程复现下面是一段精炼但功能完整的代码它能让你亲手“看见”前述所有核心概念。请务必逐行运行并观察图形变化import numpy as np import matplotlib.pyplot as plt # 1. 定义基础向量和变换矩阵 v np.array([2, 1]) # 原始向量 A np.array([[1.5, 0.5], [0.5, 1.0]]) # 一个典型的2D变形矩阵 # 2. 可视化向量加法平行四边形法则 fig, ax plt.subplots(1, 1, figsize(6, 6)) ax.set_xlim(-1, 4); ax.set_ylim(-1, 3) ax.grid(True, alpha0.3) # 绘制向量v和w w np.array([0.5, 2]) ax.quiver(0, 0, v[0], v[1], anglesxy, scale_unitsxy, scale1, colorblue, labelv) ax.quiver(0, 0, w[0], w[1], anglesxy, scale_unitsxy, scale1, colorred, labelw) ax.quiver(0, 0, (vw)[0], (vw)[1], anglesxy, scale_unitsxy, scale1, colorgreen, labelvw) # 绘制平行四边形 ax.plot([0, v[0], v[0]w[0], w[0], 0], [0, v[1], v[1]w[1], w[1], 0], k--, alpha0.5) ax.legend(); ax.set_title(向量加法平行四边形法则) # 3. 可视化矩阵变换网格变形 fig, ax plt.subplots(1, 2, figsize(12, 5)) # 原始网格 x np.linspace(-2, 2, 5) y np.linspace(-2, 2, 5) X, Y np.meshgrid(x, y) U, V np.zeros_like(X), np.zeros_like(Y) for i in range(len(x)): for j in range(len(y)): vec np.array([X[j, i], Y[j, i]]) trans_vec A vec U[j, i], V[j, i] trans_vec[0], trans_vec[1] ax[0].pcolormesh(X, Y, np.zeros_like(X), edgecolorslightgray, linewidth0.5, alpha0.3) ax[0].set_title(原始网格) ax[0].set_aspect(equal) # 变换后网格 ax[1].pcolormesh(U, V, np.zeros_like(U), edgecolorslightgray, linewidth0.5, alpha0.3) ax[1].set_title(A变换后网格) ax[1].set_aspect(equal) # 4. SVD分解与主轴可视化 U_svd, s, Vt np.linalg.svd(A) V Vt.T # 绘制A的列向量原始基像和V的列向量输入主轴 fig, ax plt.subplots(1, 1, figsize(6, 6)) ax.quiver(0, 0, A[0,0], A[1,0], anglesxy, scale_unitsxy, scale1, colorpurple, width0.005, labelA[:,0]) ax.quiver(0, 0, A[0,1], A[1,1], anglesxy, scale_unitsxy, scale1, colororange, width0.005, labelA[:,1]) ax.quiver(0, 0, V[0,0], V[1,0], anglesxy, scale_unitsxy, scale1, colorgreen, linestyledashed, width0.005, labelV[:,0] (Input PC1)) ax.quiver(0, 0, V[0,1], V[1,1], anglesxy, scale_unitsxy, scale1, colorred, linestyledashed, width0.005, labelV[:,1] (Input PC2)) ax.set_xlim(-2, 2); ax.set_ylim(-2, 2); ax.grid(True, alpha0.3) ax.legend(); ax.set_title(SVD输入主轴(V) vs 列空间基(A[:,i])) plt.show()这段代码的精妙之处在于它没有使用任何高级绘图技巧却完成了从基础向量运算到高阶SVD分解的完整几何叙事。特别是第三部分它将矩阵A的列向量即A对标准基e₁, e₂的变换结果与SVD中V的列向

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑