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

出现ValueError:概率和不为1的报错原因排查求助

解决“probabilities do not sum to 1”的ValueError问题

这个报错既不是numpy的问题,也不是联合分布本身的问题,核心原因是你直接把联合分布的数值当作条件概率传给了np.random.choice,而Gibbs采样需要的是归一化后的条件概率。

问题分析

Gibbs采样中:

  • 给定Y=y时,X的条件概率是P(X=x|Y=y) = P(X=x,Y=y) / P(Y=y),也就是联合分布对应行的数值除以该行的和(Y=y的边缘概率)。
  • 给定X=x时,Y的条件概率是P(Y=y|X=x) = P(X=x,Y=y) / P(X=x),也就是联合分布对应列的数值除以该列的和(X=x的边缘概率)。

你的代码里直接用p[y]和p[:,x]作为概率参数,比如当y=2时,p[y] = [6/66, 0, 0],求和为6/66≠1,不符合np.random.choice对概率参数和为1的要求,所以触发报错。

修正方案

对联合分布的每一行、每一列分别做归一化,得到符合要求的条件概率矩阵:

import numpy as np
import matplotlib.pyplot as plt

p = np.array([[10/66, 15/66, 3/66], [20/66, 12/66, 0], [6/66, 0, 0]])

# 计算给定Y时X的条件概率:每行归一化
p_given_y = p / p.sum(axis=1, keepdims=True)
# 计算给定X时Y的条件概率:每列归一化
p_given_x = p / p.sum(axis=0, keepdims=True)

x = 0
y = 0
trace_x = []
trace_y = []

for i in range(10000):
    x = np.random.choice([0, 1, 2], p=p_given_y[y])
    y = np.random.choice([0, 1, 2], p=p_given_x[:, x])
    trace_x.append(x)
    trace_y.append(y)

plt.plot(trace_x)
plt.title('Trace plot for X')
plt.xlabel('Iteration')
plt.ylabel('Value')
plt.show()

plt.plot(trace_y)
plt.title('Trace plot for Y')
plt.xlabel('Iteration')
plt.ylabel('Value')
plt.show()

说明

  • 归一化后,p_given_y的每一行和为1,p_given_x的每一列和为1,完全满足np.random.choice的参数要求,不会再触发报错。
  • 你的联合分布中所有边缘概率都不为0,无需处理行/列和为0的特殊情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:37:22