截断SVD为何最优?Eckart-Young-Mirsky定理精讲与工程实践

如果你平时的工作离不开矩阵分解,那你一定绕不开Eckart-Young-Mirsky定理。这个定理还有一个更常用的名字——截断SVD最优性定理。说白了就是:任意一个矩阵,你想用一个低秩矩阵去近似它,只要用谱范数或Frobenius范数来衡量误差,最优答案都是同一个——保留最大的k个奇异值,其余全部置零。这句话听起来轻飘飘的,但整个数据降维、主成分分析、推荐系统里的矩阵分解、图像压缩的误差分析,全都建立在这个定理之上。这篇文章目标很明确:把E-Y-M定理的数学含义、证明思路、代码验证和工程中的坑一次讲透,适合已经会调用SVD、但还没认真想过"为什么截断SVD是最优"的读者。

1. E-Y-M定理到底在说什么

1.1 一句话版本与数学表述

先说标准表述。设A是一个m×n的实矩阵,它的奇异值分解为:

A = UΣV^T

其中U和V是正交矩阵,Σ是对角矩阵,对角元满足:σ₁ ≥ σ₂ ≥ ... ≥ σ_r > 0,r是A的秩。截断SVD的做法是只保留前k个奇异值,以及对应的左右奇异向量:

A_k = U_k Σ_k V_k^T

其中U_k是U的前k列,V_k是V的前k列,Σ_k是Σ前k个奇异值组成的k×k对角矩阵。因为后面m-k或n-k个奇异值都被丢弃了,A_k的秩最多为k,但它仍然是一个m×n矩阵,形状和A完全一样。

E-Y-M定理说的是:在所有秩不超过k的m×n矩阵B里,A_k同时是谱范数和Frobenius范数意义下的最优逼近。换句话说:

||A - A_k||₂ ≤ ||A - B||₂
||A - A_k||_F ≤ ||A - B||_F

对任意秩≤k的B都成立。而且误差有精确表达式:

||A - A_k||₂ = σ_{k+1}(第k+1个奇异值)
||A - A_k||F = sqrt(σ{k+1}² + σ_{k+2}² + ... + σ_r²)

注意,k可以从0取到r。k=0时A_0就是零矩阵,谱范数误差就是σ₁;k≥r时误差为0,因为低秩矩阵本身已经能完全表示A了。

这里经常有人混淆谱范数和Frobenius范数的定位。谱范数衡量的是"最坏情况下的放大倍数",它只关心最大奇异值;Frobenius范数则是把所有元素的平方差加起来再开方,像欧氏距离的矩阵版本,衡量的是整体平均能量。E-Y-M定理巧妙的地方在于:这两个性质不同、用途不同的范数,最优解居然都是同一个截断SVD。

1.2 直觉:为什么截断SVD是最优的

很多新手会有一个直觉:想用一个低秩矩阵近似A,直接从A里抽前k列不行吗?实际试一下就知道了,这样做的误差通常大得离谱。原因是矩阵的列与列之间高度相关,只拿前k列意味着完全放弃了后面所有列里的信息,而后面列未必是"不重要的列"。

SVD之所以比抽列抽行强,是因为它先做了一次坐标旋转。V^T把A的行空间旋转到了"主轴坐标系",在这个坐标系里,每个方向对矩阵能量的贡献正好是对应的奇异值平方。奇异值越大,这个方向上的能量越集中。截断SVD相当于保留能量最大的k个主轴,丢掉其余能量较小的主轴。

打个比方:矩阵像一张建筑图纸,奇异值就是不同比例尺下的轮廓强度。前几个大奇异值决定了整体骨架和主要结构,后面一堆小奇异值只是门窗细节和装饰线。做低秩逼近就像是先画大框架再抠细节——如果只允许你保留k笔,最优策略肯定是先画影响最大的几笔,而不是随便截掉图纸的一半。

E-Y-M定理就是把这句直觉话变成了严格的数学保证。

2. 为什么这个定理值得你花时间

2.1 PCA是它的直接推论

主成分分析(PCA)是E-Y-M定理最经典的应用。PCA做的事情是:给一个数据矩阵X(n个样本,p个特征),先对每一列做中心化,也就是减去该列的均值,然后找到一组新的正交方向,让数据投影到这组方向上后方差最大,或者等价地,投影后重构原始数据的误差最小。

如果把中心化后的数据矩阵记为X_c,对它做SVD:X_c = UΣV^T,那么前k个右奇异向量(V的前k列)就是主成分方向。E-Y-M定理的Frobenius范数部分保证了:在所有的k维子空间里,由前k个右奇异向量张成的子空间,重建X_c时产生的F范数误差最小。

这里有一个非常容易被忽略的前提:PCA必须先做中心化。E-Y-M定理本身不要求中心化,直接对原始X做截断SVD也能得到一个最优低秩近似。但PCA要的是最大方差方向,如果数据中心不在原点,第一主成分会被均值方向带偏,而不是真正的最大方差方向。所以工程上的顺序永远是:先中心化,再SVD,再取前k个方向。

把PCA理解成E-Y-M定理的特例,有个额外好处:以后看到其他降维方法,你可以问一句"它的最优性来自哪个范数下的哪个约束",思路会清楚很多。

2.2 推荐系统与图像压缩都在用它

推荐系统里的矩阵分解,目标是把用户对物品的评分矩阵R分解成两个低秩矩阵的乘积:R ≈ P Q^T,P是用户隐因子矩阵,Q是物品隐因子矩阵。如果评分矩阵是完整无缺失的,那最优的低秩近似就是截断SVD,E-Y-M定理直接给出最优解和误差上界。实际推荐场景中评分矩阵有大量缺失值,不能直接套截断SVD,但低秩假设本身——即"用户偏好可以被少数几个隐因子解释"——正是从E-Y-M定理背后衍生出来的核心思想。

图像压缩是另一个直观例子。一张灰度图就是一个m×n像素矩阵。对它做SVD后,只保留前k个奇异值,就可以用U_k、Σ_k、V_k^T三块小矩阵重建图像。存储成本从mn个数值降到k(m+n+1)个数值。对人像、风景这类结构化的图像,k取30到50时,肉眼几乎看不出和原图的差别。传统JPEG压缩在细节保留上当然更强,但SVD压缩的教育意义无可替代,因为它把"信号能量集中在前几个奇异值"这一事实摆在台面上。

特征脸、潜在语义分析、文本主题模型,本质也都是同一套思路:原始数据有冗余,低秩结构能解释大部分方差,截断SVD给出最优低秩表示。

2.3 低秩假设的理论基石

再往深一层说,E-Y-M定理支撑起了整个"低秩模型"体系。数据是低秩加噪声的,低秩部分才是信号,噪声散布在所有方向上。把奇异值中最小的那些置零,就是在做最有效的去噪。这些操作看起来像启发式技巧,背后却有一个精确的最优性定理兜底,所以工程上敢放心用。

如果有一天你在论文里看到"通过低秩近似实现数据压缩","用截断SVD作为强基线",或者"低秩矩阵恢复",追根溯源,理论起点基本都是E-Y-M定理。理解它,等于拿到了一把通用钥匙。

3. 证明思路拆解

3.1 谱范数情况的经典论证

谱范数部分的证明不复杂,而且非常漂亮。核心思路分两步:先证明任意秩≤k的B误差都≥σ_{k+1},再证明A_k恰好能达到这个值。

先看下界。B的秩不超过k,那么B的零空间null(B)的维度至少是n-k。选择这个零空间作为候选子空间S,那么对任意x∈S且||x||=1,有Bx = 0,所以:

||(A - B)x|| = ||Ax||

于是:

||A - B||₂ = max_{||x||=1} ||(A-B)x|| ≥ max_{x∈S, ||x||=1} ||Ax||

接下来需要用到奇异值的一个经典变分刻画:第k+1个奇异值σ_{k+1}等于所有n-k维子空间上"最大拉伸"的最小值,也就是:

σ_{k+1}(A) = min_{dim S = n-k} max_{x∈S, ||x||=1} ||Ax||

B的零空间本身就是一个n-k维子空间,所以上式的右边至少是σ_{k+1}。连起来就是:

||A - B||₂ ≥ σ_{k+1}

再看构造。A_k的秩为k,并且A - A_k的奇异值恰好是σ_{k+1}, σ_{k+2}, ...(前k个被消掉了)。因此A - A_k的最大奇异值就是σ_{k+1},即:

||A - A_k||₂ = σ_{k+1}

误差下界和可达性同时成立,谱范数部分就证完了。

3.2 F范数误差为什么是奇异值平方和

Frobenius范数的证明比谱范数稍微绕一点,这里给你一个足够建立信任的直观推导。F范数关于左右正交变换不变,所以可以先把A放进SVD坐标系里考虑:

||A - B||_F = ||Σ - U^T B V||_F

记C = U^T B V,它的秩仍然不超过k。现在问题变成:在Σ这个对角矩阵旁边放一个秩不超过k的矩阵C,最小化它们差的F范数。

因为F范数的平方等于所有元素差的平方和,C的秩最多为k,它再厉害也只能同时控制k个"方向"上接近Σ的对应项。第k+1个及之后的奇异值方向,C并没有足够的自由度去覆盖,这些方向上的能量Σ_{k+1}, Σ_{k+2}, ...就必然作为误差保留下来。极端理想情况下,C精确匹配前k个对角线上的值,其他位置全是0,这时候误差就是:

sqrt(σ_{k+1}² + σ_{k+2}² + ... + σ_r²)

而C = U^T A_k V恰好能做到这一点,所以等号能取到。

这个推导虽然偏直觉,但和严格证明的结论完全一致。想要更严谨的叙述,可以去翻矩阵分析教材里的奇异值扰动不等式和交错定理。对工程应用来说,记住"F范数误差平方 = 被丢弃奇异值的平方和"这个结论,比记住繁琐的证明过程更有用。

3.3 这个证明教会我们什么

从证明里能读出三层信息。第一,最优低秩逼近并不是简单地把矩阵切成小块,而是要先做正交旋转再截断。旋转本身不消耗"存储预算",只改变坐标表达。第二,第k+1个奇异值像一道分水岭,它决定了谱范数误差的上限,也暗示了一个事实:当奇异值快速衰减时,低秩逼近效果会好到惊人。第三,能取到等号的A_k不是唯一的,如果奇异值有重复,对应的奇异向量子空间可以旋转,但误差不变。工程上如果发现多次运行结果的主成分方向不一样,多半是遇到了奇异值简并,这不一定是bug。

4. 实操:写代码验证并落地

4.1 生成含噪声的低秩矩阵并验证

理论说得再好,不如跑一段代码亲眼验证。这里用NumPy生成一个真实的低秩矩阵,再加上噪声,然后比较截断SVD的实测误差和定理预测值。

import numpy as np rng = np.random.default_rng(42) m, n, true_rank, k = 100, 80, 25, 6 # 生成一个低秩矩阵:两个随机正交因子 + 对角奇异值 U0, _ = np.linalg.qr(rng.standard_normal((m, true_rank))) V0, _ = np.linalg.qr(rng.standard_normal((n, true_rank))) S0 = np.logspace(2, 0, true_rank) # 奇异值从100衰减到1 # 真实信号 + 高斯噪声 A = U0 @ np.diag(S0) @ V0.T + 0.1 * rng.standard_normal((m, n)) # 完整SVD U, s, Vt = np.linalg.svd(A, full_matrices=False) # 截断SVD重建 A_k = (U[:, :k] * s[:k]) @ Vt[:k, :] # 实测误差 err_2 = np.linalg.norm(A - A_k, 2) err_f = np.linalg.norm(A - A_k, 'fro') # 定理预测 pred_2 = s[k] # 第k+1个奇异值(索引从0开始) pred_f = np.sqrt(np.sum(s[k:] ** 2)) print(f"谱范数 实测 {err_2:.6f} 预测 {pred_2:.6f}") print(f"F范数 实测 {err_f:.6f} 预测 {pred_f:.6f}")

跑出来的两组数会在浮点精度范围内完全一致。这里有两个细节值得说。一是np.linalg.svd默认full_matrices=True,对非方阵会返回两个大正方阵,白白多算很多内存。设成full_matrices=False后,U形状是m×min(m,n),Vt形状是min(m,n)×n,足够完成截断重建。二是s[k]对应的是丢弃的第一个奇异值,因为Python索引从0开始,保留k个意味着从下标k开始的奇异值都要丢弃。很多人在这一步对不上数字,基本都是索引没对齐。

4.2 选k的三种实用方法

理论给了误差公式,但k怎么选仍然是个工程问题。我自己常用的方法有三个。

第一种是能量占比。奇异值平方表示该方向贡献的能量,定义累计能量占比:

energy = np.cumsum(s ** 2) / np.sum(s ** 2) k_energy = np.searchsorted(energy, 0.9) + 1 # 找到第一个超过90%的位置

想要保留90%的总能量,就找累计能量曲线第一次超过0.9的位置。这个方法无监督、可解释、速度快,适合探索数据时快速估算k的取值范围。

第二种是奇异值缺口。把奇异值从大到小画成折线图,如果某个位置出现明显拐点,比如σ_k是10,σ_{k+1}突然掉到1,那说明前k个奇异值承载了主要结构,后面基本是噪声。拐点处就是合理的k。这个方法需要看图,带有主观成分,但往往非常有效。

第三种是有监督的交叉验证。把矩阵的一部分元素随机遮住,在剩余元素上做截断SVD,然后预测被遮住的元素,统计预测误差。k从1扫到r,选验证误差最小的那一个。这个方法最稳健,代价是计算量上去了。实际项目中,我会先用能量占比扫一遍范围,再用交叉验证精挑。

4.3 大规模场景下的截断SVD选择

如果m和n都上千甚至更大,直接np.linalg.svd求完整分解会非常慢,因为完整SVD的复杂度是O(mn·min(m,n))级别。这时候应该用专门的截断算法。

scipy.sparse.linalg.svds支持稀疏矩阵和指定k值,只算最大的k个奇异值对。sklearn.decomposition.TruncatedSVD封装了randomized SVD,对大矩阵更友好,适合作为降维流水线的一环。

这里有个容易踩的坑:svds返回的奇异值默认是升序排列的,也就是从小到大的顺序。如果你沿用np.linalg.svd的惯性直接取s[k:]当成丢弃的奇异值,结论会完全反掉。解决方法是拿到结果后统一用np.sort(svds_s)[::-1]转成降序。

当k比min(m,n)小很多时,randomized SVD的思路是先用一个随机矩阵把A投影到一个维度为k+p的小空间,再对小矩阵做精确SVD。它的理论保证可以理解为:先构造一个接近最优的低秩子空间,再用E-Y-M定理保证误差。实际中p取5到15就够,速度能比完整SVD快一个数量级以上。

5. 工程上最容易踩的坑

5.1 数据有没有中心化和标准化

E-Y-M定理本身对输入矩阵没有任何均值要求,但一旦你把截断SVD用在PCA语境里,就必须先中心化。很多人直接对原始数据矩阵做SVD取前k个奇异向量,当成主成分,结果第一主成分总是和数据均值方向搅在一起,方差解释率看起来很高,实际却跑偏了。

标准化是另一回事。比如数据里一列是金额,取值范围0到10000,另一列是0到1的评分,奇异性会被金额列完全支配。这种情况下要先做标准化,让每列同量纲,再做SVD。标准化不等于中心化,两者目的不同:中心化让方差方向有意义,标准化让不同特征平等竞争。在实际项目里,我习惯先看业务含义,再决定做不做标准化,而不是无脑套Z-score。

5.2 缺失值场景不能用朴素截断SVD

推荐系统评分矩阵几乎都有缺失值,如果你直接把缺失位置填成0,然后对全矩阵做截断SVD,E-Y-M定理依然成立,但代价是:它会把"缺失"当成"真实评分是0"来处理。结果就是预测值普遍偏向低分,误差毫无意义。

正确的做法是加权低秩近似:只统计有观测值的位置,把缺失位置的误差权重设为0。这不再是标准SVD能解的封闭问题,需要用交替最小二乘或随机梯度下降迭代求解。正因为如此,工程中面对稀疏评分矩阵时,不会有人真的去调np.linalg.svd,而是会用矩阵补全类方法。低秩假设还是那个低秩假设,但求解路径完全不同。

5.3 数值细节:顺序、阈值、shape

浮点误差会让很小的奇异值变成负值或者虚数(实际上NumPy会返回接近0的正数,但有时会带噪声),在计算能量占比时,如果矩阵不是满秩,s[k:]里混入几个1e-15量级的数会导致开方后误差极小但非零,这不算bug,但会让自动化测试的断言失败。我自己习惯在截断前加一个阈值:奇异值小于max(m,n) * eps * s[0]的,直接视为0。

另一个常见问题是特征值分解和SVD混用。对于对称正定矩阵,特征值分解等于SVD;对一般矩阵,特征分解可能出现负特征值、复数特征值,甚至没有实特征分解,而SVD永远存在。低秩逼近一律用SVD,不要图省事去调np.linalg.eig然后取绝对值。

5.4 谱范数和F范数怎么选

这两个范数对应不同的工程诉求。谱范数只关注最坏情况下误差有多大,适合安全分析、稳定性证明,或者当你对最大异常非常敏感时。F范数关注整体误差能量,适合图像重建、PCA重构、推荐系统评估这类看平均效果的任务。

举个例子:图像压缩中,如果某一块区域因为奇异值截断而出现剧烈伪影,这个伪影在F范数里占比可能不大,却在谱范数里非常刺眼。反过来,推荐系统评价指标通常用均方根误差,它本质上和F范数同源,所以F范数更贴近业务指标。选哪种,取决于你最在乎的是"平均好"还是"最差不离谱"。

6. 常见问题速查表

问题原因解决方案
截断SVD误差比σ_{k+1}小k的索引理解错误确认保留的是前k个奇异值,σ_{k+1}对应s[k]
结果和理论对不上矩阵非方阵时用了full_matrices=True,重建时形状对不齐用full_matrices=False,统一U、s、Vt的形状
svds返回的奇异值顺序不对SciPy的截断SVD返回升序用np.sort(s)[::-1]手动降序
PCA第一主成分方向不合理漏做中心化每一列减去均值后再SVD
列间量纲差异过大大数值列主导奇异值先做标准化,再SVD
稀疏矩阵直接截断SVD预测值偏低缺失位置被当作0参与误差计算改用矩阵补全或加权低秩近似
小奇异值抖动导致能量占比不稳定数值精度或秩退化设阈值,奇异值小于max(m,n)*eps*s[0]视为0
主成分方向每次跑不一样奇异值简并这是正常现象,检查是否有重复奇异值,官方说法是子空间等价

这张表基本覆盖了我这几年在项目里见过的绝大多数问题。排查顺序建议是:先查索引和shape,再查是否中心化、标准化,最后查奇异值顺序。按照这个顺序走,大多数"神秘bug"都能在五秒内定位。

另外还有一个值得养成的习惯:在写任何使用SVD的代码前,先手动构造一个已知低秩矩阵,比如用两个矩阵相乘生成一个秩为r的矩阵,再叠加噪声,然后跑一遍完整流程。这样既能验证代码正确性,也能让你对"低秩+噪声"的数据形态形成直观手感,以后再遇到真实数据时一眼就能判断低秩假设是否成立。

我个人在实际操作中最深的体会是:E-Y-M定理看起来只是一个小结论,但它把PCA、推荐系统、图像压缩、去噪这些看似毫不相干的领域串在了同一条线上。每当你遇到一个新问题,只要里面出现了"低秩近似"四个字,先问自己三个问题:数据有没有缺失?要不要中心化和标准化?误差该用谱范数还是F范数?这三个问题想清楚,再用截断SVD,方向基本不会错。最后一个私房技巧:验证定理时,一定要用SVD而不是特征值分解,因为SVD对任何矩阵都存在而且数值上更稳定,这一条能帮你避开大量不明不白的报错。

相关新闻

深度学习实战:番茄成熟度识别与采摘点检测全流程解析

深度学习实战:番茄成熟度识别与采摘点检测全流程解析

智慧农业这几年喊得响,但真正能落地的场景里,番茄成熟度识别绝对算一个刚需。不管是大棚里挂满枝头的樱桃番茄,还是连栋温室里的串收大果,采摘自动化要解决的第一件事,就是让机器知道“哪个该摘、哪个不该摘、该摘的位…

2026/10/20 22:54:43 阅读更多 →
阿里云腾讯云华为云对比:计算存储网络数据库安全五维选型避坑指南

阿里云腾讯云华为云对比:计算存储网络数据库安全五维选型避坑指南

简介:这份文档面向企业技术人员、运维人员及云计算初学者,系统梳理主流云平台的核心概念与选型思路,帮助读者理解云计算平台的基本原理、企业应用价值以及不同厂商之间的差异。资源为单个doc文件,压缩包约306KB,内容以…

2026/10/20 22:54:43 阅读更多 →
未来编程的角色责任:从编码执行者到全链路负责人

未来编程的角色责任:从编码执行者到全链路负责人

每次聊到“未来编程的角色与责任”,我总想起自己刚入行那会儿:接到需求就闷头写代码,写完能跑就觉得万事大吉。后来才慢慢明白,编程从来不只是把逻辑翻译成机器指令那么简单,它背后牵扯的是一个人在整个系统里的定位&a…

2026/10/20 22:54:43 阅读更多 →

最新新闻

T+转U8+数据迁移实战:科目、辅助核算与期初余额的平滑过渡方案

T+转U8+数据迁移实战:科目、辅助核算与期初余额的平滑过渡方案

简介:专门用于T与U8之间数据迁移的辅助工具,面向财务人员、ERP实施顾问及企业信息化运维者,解决T版本数据平滑转换至U8过程中的字段映射与账套整合难题。整个工具包共13个文件,压缩后仅426KB,包含8个SQL脚本&#xff0…

2026/10/20 23:25:58 阅读更多 →
spaCy 2.0与交互式标注工具:NLP工程化落地的关键一步

spaCy 2.0与交互式标注工具:NLP工程化落地的关键一步

2017年对我这种做NLP应用落地的人来说,是一个很微妙的年份。深度学习在学术界已经打得火热,但真要把它用在生产环境里,总是隔着一层:训练代码要自己写,数据标注靠Excel和手工,好不容易练出来的模型还不好部…

2026/10/20 23:25:58 阅读更多 →
OpenClaw盗刷谣言背后:AI自动化工具的安全边界

OpenClaw盗刷谣言背后:AI自动化工具的安全边界

1. 一张"受害者"截图,到底骗了谁?这两天我的信息流快被同一张图刷屏了:一张聊天截图,配文大意是"信用卡被盗刷、微信红包被盗刷,第一批OpenClaw受害者出现了"。配上几个红色感叹号,评论…

2026/10/20 23:25:58 阅读更多 →
AI智能体不是高级Prompt:四基石与七把尺子

AI智能体不是高级Prompt:四基石与七把尺子

1. 别急着调用API:先搞清“AI智能体”到底不是什么“AI智能体你用对了没有?”——这问题一出来,我下意识就笑了。上周在某高校实验室做技术分享,台下一位导师举手问:“我们让大模型写周报、改PPT、润色论文&#xff0c…

2026/10/20 23:25:58 阅读更多 →
智能拖拉机环境下的多类别车辆检测与识别:Mask R-CNN改进实战

智能拖拉机环境下的多类别车辆检测与识别:Mask R-CNN改进实战

做智能拖拉机环境下的车辆检测与识别,和做城市自动驾驶感知完全是两码事。城市道路的障碍物再复杂,好歹有清晰的车道线、红绿灯、标准化的车辆外形;田间地头是另一番光景——扬尘一起,逆光一下,远处开过来的运粮车在麦…

2026/10/20 23:25:58 阅读更多 →
diagram-design:系统可视化设计的方法论与工程实践

diagram-design:系统可视化设计的方法论与工程实践

1. “diagram-design”不是一张图,而是一套系统性视觉表达方法论很多人第一次看到“diagram-design”这个词,下意识会把它当成“画流程图”“做PPT示意图”或者“用draw.io拖几个框连几条线”的简单操作。我最初也这么想——直到在某高校的跨学科课程设计…

2026/10/20 23:24:57 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →