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
相关产品推荐
相关产品推荐

