如何用PyTorch实现基于加权平方差核的协方差矩阵计算?
实现自定义核函数生成协方差矩阵
根据你提供的示例输入输出,结合自定义核函数的描述(phi为特征系数、p为特征数量),可明确核函数形式为:
( k(x, x') = -\sum_{i=1}^p \phi_i (x_i - x'_i)^2 )
当phi为全1向量时,即为两个样本的负L2距离平方。
以下是两种PyTorch实现方案,优先推荐向量化版本(效率更高):
方法一:向量化高效实现
利用PyTorch广播机制一次性计算所有样本对的核值,避免循环,适合大规模样本场景:
import torch def custom_kernel(A, phi=None): # 默认phi为全1向量,维度与样本特征数一致 if phi is None: phi = torch.ones(A.shape[1], device=A.device, dtype=A.dtype) # 扩展维度后计算所有样本对的特征差值:(n_samples, n_samples, p) diff = A.unsqueeze(1) - A.unsqueeze(0) # 加权平方差求和后取负,得到核矩阵 kernel_matrix = -torch.sum(phi * diff ** 2, dim=-1) return kernel_matrix # 验证示例 A = torch.Tensor([[1 , 1], [0, 1]]) print(custom_kernel(A)) # 输出: # tensor([[ 0., -1.], # [-1., 0.]])
方法二:循环实现(直观理解逻辑)
适合小样本场景,逻辑更直白:
import torch def custom_kernel(A, phi=None): n_samples, p = A.shape # 默认phi为全1向量 if phi is None: phi = torch.ones(p, device=A.device, dtype=A.dtype) kernel_matrix = torch.zeros((n_samples, n_samples), device=A.device, dtype=A.dtype) # 逐个计算样本对的核值 for i in range(n_samples): for j in range(n_samples): diff = A[i] - A[j] kernel_matrix[i,j] = -torch.sum(phi * diff ** 2) return kernel_matrix # 验证示例 A = torch.Tensor([[1 , 1], [0, 1]]) print(custom_kernel(A)) # 输出与向量化版本一致
说明
- 可通过传入自定义
phi向量调整各特征的权重,需保证phi维度与样本特征数一致 - 向量化版本利用PyTorch的并行计算能力,运行效率远高于循环实现
内容的提问来源于stack exchange,提问作者Gooby
相关产品推荐
相关产品推荐

