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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:15:38