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

Python实现多元正态分布下测试样本似然值计算方法

你可以通过以下两种方式实现单条测试样本的似然值计算:

方案1:使用scipy内置方法(最简便,推荐)

scipy.stats模块提供了封装好的多元正态分布工具,可直接调用pdf方法计算似然,你之前用到的np.random.multivariate_normal仅用于分布采样,没有内置pdf计算能力,用scipy的工具类可直接满足需求:

import numpy as np
from scipy.stats import multivariate_normal

# 你已经计算好的均值和协方差矩阵
mean_vector = training_set.mean(0) 
covariance_matrix = np.cov(training_set, rowvar=False) 
# 可选:添加极小正则项避免协方差矩阵奇异报错
covariance_matrix += 1e-6 * np.eye(covariance_matrix.shape[0])

# 实例化多元正态分布
mvn_dist = multivariate_normal(mean=mean_vector, cov=covariance_matrix)

# 输入单条测试样本计算似然,test_sample为shape为(n_features,)的numpy数组
likelihood = mvn_dist.pdf(test_sample)
# 可选:计算对数似然,数值稳定性更高,避免似然值过小导致下溢
log_likelihood = mvn_dist.logpdf(test_sample)

方案2:手动实现(适合需要自定义逻辑的场景)

如果不想引入scipy依赖,也可以根据多元正态分布的概率密度公式手动实现:

def cal_mvn_likelihood(x, mean, cov):
    feature_dim = len(mean)
    # 计算协方差矩阵的行列式和逆矩阵
    det_cov = np.linalg.det(cov)
    inv_cov = np.linalg.inv(cov)
    # 计算归一化系数
    norm_factor = 1 / np.sqrt( (2 * np.pi) ** feature_dim * det_cov )
    # 计算指数项
    diff = x - mean
    exp_term = np.exp( -0.5 * diff.T @ inv_cov @ diff )
    return norm_factor * exp_term

# 调用示例
likelihood = cal_mvn_likelihood(test_sample, mean_vector, covariance_matrix)

手动实现对数值稳定性的处理较少,特征维度较高或协方差矩阵条件数较差时,优先使用scipy内置实现。

内容的提问来源于stack exchange,提问作者jinx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:45:04