我正在使用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)!
显然,你的笔记是正确的。