You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Python扩散映射实现Nystroem式.transform方法处理样本外数据

实现DiffusionMapEmbedding的.transform方法(基于Nystroem样本外扩展)

核心需求是给移植自mapalign的DiffusionMapEmbedding类补充transform方法,支持将新观测数据Y投影到已训练完成的扩散映射空间,参考pyDiffMap的Nystroem样本外扩展逻辑实现。

核心原理(Nystroem样本外扩展)

扩散映射的样本外扩展逻辑是通过新样本与训练样本的核相似度,结合训练阶段得到的扩散矩阵特征分解结果推导嵌入:

  • 计算新样本Y与训练样本X的高斯核矩阵(复用训练时的核参数)
  • 对核矩阵做归一化,完全匹配训练时扩散矩阵的归一化规则
  • 结合训练得到的左特征向量、特征值,计算新样本的最终嵌入

代码实现(添加到现有类中)

假设现有DiffusionMapEmbedding类已实现fit和fit_transform方法,且保存了以下实例变量:

  • self.X_train:训练数据集
  • self.epsilon:高斯核带宽参数
  • self.diffusion_eigenvectors:扩散矩阵的左特征向量(训练样本的嵌入结果)
  • self.diffusion_eigenvalues:扩散矩阵的特征值
  • self.d:训练样本的度向量(可选,若类中已计算)

直接在类中添加transform方法:

import numpy as np
from scipy.spatial.distance import cdist

class DiffusionMapEmbedding:
    # 保留现有fit、fit_transform方法...
    
    def transform(self, Y):
        # 1. 计算新样本与训练样本的高斯核矩阵
        dists = cdist(Y, self.X_train, metric='euclidean')
        K_YX = np.exp(-dists ** 2 / self.epsilon)
        
        # 2. 归一化核矩阵(匹配训练阶段的扩散矩阵归一化逻辑)
        if hasattr(self, 'd'):
            d = self.d
        else:
            # 若类中未保存度向量,重新计算训练样本的度向量
            dists_train = cdist(self.X_train, self.X_train, metric='euclidean')
            K_train = np.exp(-dists_train ** 2 / self.epsilon)
            d = K_train.sum(axis=1)
        
        # 对新样本的核矩阵做行归一化,对应转移矩阵的行归一化规则
        P_YX = K_YX / d[np.newaxis, :]
        
        # 3. 计算样本外嵌入:跳过第一个特征值(对应常数向量),取前k个非平凡特征分量
        k = self.diffusion_eigenvectors.shape[1] - 1
        eigenvectors = self.diffusion_eigenvectors[:, 1:]
        eigenvalues = self.diffusion_eigenvalues[1:]
        
        # 按照pyDiffMap的Nystroem扩展逻辑计算嵌入
        embedding = P_YX @ eigenvectors @ np.diag(1 / eigenvalues)
        
        return embedding

测试验证示例

用你的测试数据集验证完整流程:

# 初始化实例并完成训练
dme = DiffusionMapEmbedding(epsilon=1.0, n_components=2)
X_emb = dme.fit_transform(X_train)

# 转换新数据Y
Y_emb = dme.transform(Y_test)

# 验证嵌入维度符合预期:Y_emb.shape == (Y样本数量, 设定的n_components)
print(Y_emb.shape)

关键注意事项

  • 必须保证transform中使用的核参数(如epsilon)、归一化逻辑与fit阶段完全一致,否则嵌入结果会出现偏差
  • 若训练时已计算过渡向量d或转移矩阵P,直接复用即可,避免重复计算浪费时间
  • 若训练时对扩散矩阵采用对称归一化而非行归一化,需同步调整transform中的归一化逻辑,保证前后规则统一

内容的提问来源于stack exchange,提问作者O.rka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:42:48