傅里叶特征映射
公开知识笔记
傅里叶特征映射
一句话说人话:把每个基因表达值 x 通过 sin 和 cos 映射成一个二维向量 [cos(απx), sin(απx)],把「数值的大小」变成「波形上的位置」,从而构造出一个对微小变化特别敏感的「高频通道」——给模型装一个「对比度增强」滤镜,让它看清边界。
一、为什么需要它:先回顾痛点
在 低通滤波与高频信号 里我们说过:GCN 是低通滤波,天生把「剧烈跳变」磨平。而组织边界(空间域的边界)恰恰是基因表达剧烈跳变的地方。所以 GCN 看不清边界。
那怎么办?一个直接的想法是:既然 GCN 自己看不见高频,那就把数据「加工」一下,让高频信息变得显眼,再喂给它。
傅里叶特征映射干的就是这件事——它不动模型,动数据:把原始表达值做一次变换,让「边界处的剧烈变化」被放大、被凸显。
二、它做了什么:把「数值」绕到「圆」上
公式看起来唬人,其实就一步:
每个表达值 x → [cos(απx), sin(απx)]
也就是:把 x 这个「数」,变成坐标平面上的一个点,这个点落在单位圆上,角度由 απx 决定。α 是一个可调的超参数(论文里叫 αfourier),控制「敏感度」。
生活类比 1——钟表指针:
时间是「数值」,你把它映射到表盘上,就变成了「指针的 cos/sin 位置」。12:00 和 12:01 这两个时间,数值上只差 1 分钟,但映射到表盘后,指针的角度能被你一眼区分。
生活类比 2——对比度增强滤镜:
一张照片的灰度值都挤在很窄的范围里,边缘的明暗差看不出来。你拉一下「对比度」滑杆,暗的更暗、亮的更亮,原本模糊的轮廓线立刻清晰了。傅里叶映射就是给「基因表达值」拉对比度。
生活类比 3——把直尺绕成弹簧:
一条直线上两个点离得很近(数值差不多),你很难分辨。但把这条直线绕成螺旋弹簧,两个原本挨着的点,在弹簧上对应的角度可能被拉开很大,一下就能分开了。
三、为什么「绕圆」能增强边界信号
关键在「距离」上。两个表达值 x1 和 x2,映射之后它们之间的距离(平方)是:
∥F(x1) − F(x2)∥² = 2·sin²(απ(x1−x2)/2)
当 x1 和 x2 很接近时,这个式子近似等于 απ·|x1 − x2|。
这意味着:原本很小的差异,被放大了 απ 倍。 而且 cos/sin 是周期振荡的函数,相当于给数据叠加了「高频波动」,天然携带高频信息。
于是,边界两侧「只差一点点」的表达值,经过映射后差距被拉开,模型(后面的线性层、GCN 层)就能「看得见」这个边界了。
四、这篇论文里它扮演什么角色
在 FPS-MGCN 里,傅里叶映射是核心创新,具体这样落地:
- 输入表达矩阵 X(N 个 spot × M 个基因),每个值 xij 都做映射,得到:
- Xfourier = [cos(απX), sin(απX)],维度从 N×M 变成 N×2M(每个基因变成 cos、sin 两个通道)。
- 这个 Xfourier 被交给一个专门的 Fourier-GCN 分支,在空间图上传播,学习「边界信号在空间上如何组织」。
反常识:
在傅里叶特征映射中,
torch.cat([cos, sin])是拼接编码的标准步骤。之所以直接分块拼贴而非按频率交错排列,是因为深度学习的一个基本规律:特征的语义关联由可学习参数自动建立,而不依赖数据的物理排布。无论后续接什么网络层,运算本质都是参数化的全局聚合。网络不需要 cos 和 sin 相邻才能识别它们的配对关系,这种关系会在训练中由梯度下降自动捕获。因此,分块排列只是顺应批量计算的自然输出格式、省去内存重排开销,而语义完整性完全由模型自身的表达能力保证。
一句话:论文专门给傅里叶特征开了一条独立通道,和原始表达、空间、特征等通道并行(见 多视图学习与多视图聚类),最后用注意力融合。
五、为什么论文需要它
这是整篇论文的「招牌动作」:
- 它直接对症下药——GCN 低通看不见高频边界,傅里叶映射显式构造高频通道,把边界信息「递到眼前」。
- 它代价极低——就一个公式、一个超参数 α,却能显著提升边界敏感度。
- 它通用——「把数值映射到 sin/cos 上增强突变敏感度」这一招,可以平移到任何需要刻画边界/突变的图模型里(思路借鉴自 NeRF 的 positional encoding)。
论文原文说得最清楚:
"we introduce a Fourier sine–cosine feature mapping that explicitly constructs high-frequency feature channels to enhance sensitivity to high-frequency spatial gradients such as tissue boundaries."
数学表达详解:从公式到直觉
这一部分把傅里叶特征映射涉及的三个核心公式拆开讲清楚,适合零基础理解。
1. 核心映射:
它在做什么? 把一个普通的实数 (比如某个基因在某个 spot 的表达值)变成二维平面上的一个点。这个点落在单位圆上,角度由 决定。
- 是一个可调超参数,控制“放大倍数”
- 越大, 的微小变化引起的角度变化越大,映射后的点“转得越快”
直觉类比: 把一条直线绕成弹簧。直线上两个挨得很近的点,绕成弹簧后在圆周上对应的角度可能被拉开很远。
2. 距离公式:映射后两个点离多远?
对于两个表达值 和 ,把它们分别映射:
我们想知道这两个映射点在平面上的欧氏距离平方 。
推导过程:
距离平方等于横坐标差的平方加纵坐标差的平方:
利用和差化积公式:
代入 ,,再经过 化简,得到:
注意: 原文笔记里写的是 ,这里根据推导应为 ,可能是笔误(也可能源文献的映射前有归一化因子)。关键结构不变:距离只和差值 以及 有关。
为什么这个式子能“放大差异”?
当 和 很接近时,,所以:
也就是说,映射后的距离约等于原始差值乘以 。只要把 设得够大,原本微小的表达差异就会被放大许多倍,边界两侧的 “一点点不同” 就变得肉眼可见了。
3. 批量操作:
这是对整个表达矩阵 ( 个 spot × 个基因)做映射。
- 对矩阵中每一个元素 分别计算 ,得到一个同样大小的矩阵
- 再计算 ,得到另一个同样大小的矩阵
- 把这两个矩阵左右拼接,结果维度变成
维度变化:
每个基因原本只有一个数值,映射后变成一对值 ,相当于一个基因变成了两个通道。这就是“给每个基因增加一个高频通道”的含义。
生活类比: 普通照片只有灰度值一个通道,傅里叶映射相当于给每个像素额外增加了一个“相位通道”,让位置信息更丰富。
小结
- 公式一:数值 → 圆上的点,是映射本身
- 公式二:映射后距离 ≈ 倍原始差值,是放大原理
- 公式三:对整个矩阵批量映射并拼接,是实际代码实现
这三步合起来,就是“给 GCN 装上高频放大镜”的数学基础。
后续联动
| 概念 | 关系 |
|---|---|
| 低通滤波与高频信号 | 傅里叶映射要解决的就是「GCN 低通、看不清高频边界」的问题 |
| 图卷积网络GCN | 映射后的特征交给 Fourier-GCN 分支在空间图上传播 |
| 空间转录组与空间域 | 最终目的是把空间域的边界划得更准 |
| 多视图学习与多视图聚类 | 傅里叶视图是多视图中的一路,与其他视图注意力融合 |
被以下札记引用
2026-W35