0

我正在上一门机器学习课程,我们得到了第一个统计数据——“编程”练习。

所以练习是这样的:

回想一下“亚马逊的两个卖家价格相同”讲座中的故事。一个有 90 条正面评价和 10 条负面评价。另一个2阳性0阴性。你应该向谁购买?” 写下关于可靠性的后验概率(如讲座中所述)。使用数值积分计算 p(x > y|D1, D2)。您可以使用函数scipy.stats.beta.rvs(a,b,size)生成 Beta 分布的样本。

我们从讲座中了解到以下内容:

应用了两个 Beta 二项式模型:p(x|D1) = Beta(x|91, 11) 和 p(y|D2) = Beta(y|3, 1)

计算卖方 1 比卖方 2 更可靠的概率:

p(x > y | D1, D2 ) = ∫∫ [x > y] Beta (x| 91, 11) Beta (y| 3, 1) dx dy

所以我在 Python 中的尝试是这样的:

In [1]: import numpy as np
        from scipy import integrate, stats
In [2]: f = lambda x, y: stats.beta.rvs(91, 11, x) * stats.beta.rvs(3, 1, y)
In [3]: stats.probplot(result, x > y)

我收到一条错误消息:

... The maximum number of subdivisions (50) has been achieved....

但最终有一个计算的答案是大约。1.7 . (我们被告知答案是大约 0.7 )

我的问题是:如何计算 [x > y] 部分,意思是:卖家 1 (x) 比卖家 2 (y) 更可靠的概率?

4

1 回答 1

0

几乎是对的,我会做类似的事情:

from scipy import stats

N = 10000
P = sum(stats.beta.rvs(3, 1, size=N) < stats.beta.rvs(91, 11, size=N))
P / N

如果你想要一个图形显示:

import matplotlib.pyplot as plt
import numpy as np

X = np.linspace(0.6, 0.8, 501)
Y = stats.beta.pdf(X, 1 + P, 1 + N - P)

plt.plot(X, Y)

可能有库代码可以更好地进行绘图。

以上给出了答案的蒙特卡洛估计。如果你想要一个更好的数值估计,你可以使用以下方法在正交下到达那里:

from scipy.integrate import dblquad
from scipy import stats

a = stats.beta(91, 11)
b = stats.beta(3, 1)

dblquad(
    lambda x, y: a.pdf(x) * b.pdf(y),
    0, 1, lambda x: x, lambda x: 1)

这给了我一个 ~0.712592804 的估计值(误差为 2e-8)。

如果您想获得更准确的信息,则需要进行一些分析:

https://stats.stackexchange.com/questions/7061/binomial-probability-question

这涉及到使用一些我难以理解的先验。

于 2018-10-25T21:48:57.090 回答