在MATLAB中使用PRTools计算未知误分类后验分布

我正在使用PRTools MATLAB库来训练一些分类器,生成测试数据并测试这些分类器。

我有以下详细信息:

  • N:测试样例的总数
  • k:每个分类器和类别的误分类数量

我想做的是:

计算并绘制误分类未知概率(记为q)的贝叶斯后验分布,作为q本身的概率密度函数(因此,将在0到1之间绘制P(q))。

我有以下公式(数学公式,不是MATLAB代码!):

Posterior = Likelihood * Prior  / Normalization constant = P(q|k,N)  = P(k|q,N)   * P(q|N) / P(k|N)

先验概率设置为1,所以我只需要计算似然和归一化常数。

我知道似然可以表示为(其中B(N,k)是二项式系数):

P(k|q,N) = B(N,k) * q^k * (1-q)^(N-k)

…所以归一化常数只是上述后验分布从0到1的积分:

P(k|N) = B(N,k) * integralFromZeroToOne( q^k * (1-q)^(N-k) )

(虽然二项式系数(B(N,k))在似然和归一化常数中都出现,但可以省略)

现在,我听说归一化常数的积分可以作为一个级数来计算…类似于:

k!(N-k)! / (N+1)!

这是正确的吗?(我有一些讲义上有这个级数,但我无法确定它是用于归一化常数的积分,还是用于误分类(q)的整体分布)

此外,欢迎提供如何实际计算的建议?(阶乘很容易造成截断错误,对吗?)…还有,如何实际计算最终的图表(从0到1的q上的后验分布)。


回答:

我确实没有太多关于贝叶斯后验分布的经验(而且已经有一段时间没有接触过了),但我会尽力根据你提供的信息来帮助你。首先,

k!(N-k)! / (N+1)! = 1 / (B(N,k) * (N + 1))

你可以在MATLAB中使用nchoosek()来计算二项式系数,尽管文档中提到,对于大的系数可能会有精度问题。N和k有多大?

其次,根据Mathematica,

integralFromZeroToOne( q^k * (1-q)^(N-k) ) = pi * csc((k-N)*pi) * Gamma(1+k)/(Gamma(k-N) * Gamma(2+N))

其中csc()是正割函数,Gamma()伽玛函数。然而,Gamma(x) = (x-1)!,我们马上会用到这个。问题是我们有底部的函数Gamma(k-N),而k-N将是负数。然而,反射公式会帮助我们解决这个问题,最终我们得到:

= (N-k)! * k! / (N+1)!

显然,你的笔记是正确的。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注