Python 中的统计数据
Statistics in Python
我正在学习机器学习 class,我们得到了第一个统计数据 - "programming" 练习。
所以练习是这样的:
Recall the story from the lecture “Two sellers at Amazon have the same price. One has
90 positive and 10 negative reviews. The other one 2 positive and 0 negative. Who should
you buy from?” Write down the posterior probabilities about the reliability (as in the lecture). Calculate p(x > y|D1, D2) using numerical integration.
You can gernate Beta distributed samples with the function scipy.stats.beta.rvs(a,b,size).
我们从讲座中了解到的内容如下:
应用了两个 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) 更可靠的概率?
几乎正确,我会做类似的事情:
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
其中涉及使用一些我难以理解的先验词。
我正在学习机器学习 class,我们得到了第一个统计数据 - "programming" 练习。
所以练习是这样的:
Recall the story from the lecture “Two sellers at Amazon have the same price. One has 90 positive and 10 negative reviews. The other one 2 positive and 0 negative. Who should you buy from?” Write down the posterior probabilities about the reliability (as in the lecture). Calculate p(x > y|D1, D2) using numerical integration. You can gernate Beta distributed samples with the function scipy.stats.beta.rvs(a,b,size).
我们从讲座中了解到的内容如下:
应用了两个 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) 更可靠的概率?
几乎正确,我会做类似的事情:
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
其中涉及使用一些我难以理解的先验词。