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

基于条件高斯分布采样填补缺失Z值,Python生态是否支持该功能?

基于多元高斯条件分布的缺失值填补方案(Python实现)

核心结论

完全可以通过numpy和scipy.stats实现你的需求,不需要额外第三方库,步骤清晰且计算高效。

实现步骤

1. 用MLE拟合联合高斯分布

多元高斯分布的MLE估计等价于计算样本的均值向量和协方差矩阵,直接用numpy的基础函数就能完成。

2. 推导条件高斯分布参数

对于联合分布$P(X,Z) \sim \mathcal{N}(\mu, \Sigma)$,拆分均值与协方差矩阵:

  • 均值向量:$\mu = [\mu_X, \mu_Z]^T$
  • 协方差矩阵:$\Sigma = \begin{bmatrix} \Sigma_{XX} & \Sigma_{XZ} \ \Sigma_{ZX} & \Sigma_{ZZ} \end{bmatrix}$

条件分布$P(Z|X=x)$的参数可通过线性代数推导得到:

  • 条件均值:$\mu_{Z|X} = \mu_Z + \Sigma_{ZX}\Sigma_{XX}^{-1}(x - \mu_X)$
  • 条件协方差:$\Sigma_{Z|X} = \Sigma_{ZZ} - \Sigma_{ZX}\Sigma_{XX}^{-1}\Sigma_{XZ}$

3. 基于条件分布采样填补Z

利用scipy.stats.multivariate_normal,根据计算出的条件均值和协方差,对每个观测到的X采样对应的Z值。

完整代码示例

import numpy as np
from scipy.stats import multivariate_normal

# ----------------------
# 1. 模拟第一组全观测数据(X+Z)
# ----------------------
np.random.seed(42)
n_samples = 1000
# 假设X是2维特征,Z是3维特征
true_mu = np.array([1, 2, 3, 4, 5])
true_cov = np.array([
    [2, 0.5, 0.3, 0.2, 0.1],
    [0.5, 3, 0.4, 0.3, 0.2],
    [0.3, 0.4, 4, 0.5, 0.4],
    [0.2, 0.3, 0.5, 5, 0.6],
    [0.1, 0.2, 0.4, 0.6, 6]
])
data_full = multivariate_normal.rvs(mean=true_mu, cov=true_cov, size=n_samples)
X_full = data_full[:, :2]  # 提取X维度
Z_full = data_full[:, 2:]  # 提取Z维度

# ----------------------
# 2. MLE拟合联合高斯分布
# ----------------------
mu_hat = np.mean(data_full, axis=0)
cov_hat = np.cov(data_full, rowvar=False)  # rowvar=False表示每行是一个样本

# 拆分拟合后的均值与协方差
mu_x = mu_hat[:2]
mu_z = mu_hat[2:]
cov_xx = cov_hat[:2, :2]
cov_xz = cov_hat[:2, 2:]
cov_zx = cov_hat[2:, :2]
cov_zz = cov_hat[2:, 2:]

# ----------------------
# 3. 计算条件分布P(Z|X)的参数
# ----------------------
inv_cov_xx = np.linalg.inv(cov_xx)
beta = cov_zx @ inv_cov_xx  # 条件均值的系数矩阵

# 模拟第二组仅观测X的数据(用X_full前10条作为示例)
X_missing_z = X_full[:10]

# 计算每个X对应的条件均值
cond_mu = mu_z + beta @ (X_missing_z - mu_x).T
cond_mu = cond_mu.T  # 转置为(样本数, Z维度数)格式

# 计算条件协方差(对所有X保持一致)
cond_cov = cov_zz - beta @ cov_xz

# ----------------------
# 4. 采样填补缺失的Z值
# ----------------------
# 批量采样:每个X对应一个条件分布样本
Z_filled = multivariate_normal.rvs(mean=cond_mu[0], cov=cond_cov, size=len(X_missing_z))

print("填补后的Z值:")
print(Z_filled)

关键细节说明

  • MLE拟合的核心就是样本统计量,numpy的np.mean()和np.cov()已足够高效,无需额外拟合函数
  • 条件高斯的参数计算是纯线性代数操作,numpy的矩阵乘法、逆矩阵函数能快速完成
  • scipy.stats.multivariate_normal支持批量传入均值数组,也支持逐个样本采样,适配不同场景
  • 该方案完全符合你的需求:基于联合分布的MLE估计,通过条件分布采样生成Z值,而非回归问题的点估计

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:13:19