如何在python中获取给定样本的值的概率?

问题描述


我提到了这篇文章: https://stackoverflow.com/questions/38141951/why-does-scipy-norm-pdf-sometimes-give-pdf-1-how-to-correct-it

但是我还是有些困惑
import scipy.stats as stats
x = np.array([ 0.7972,0.0767,0.4383,0.7866,0.8091,0.1954,0.6307,0.6599,0.1065,0.0508])

print('mean:',x.mean())  # 0.45511999999999986
print('std',x.std())  # 0.30346538451691657

y = stats.norm.pdf(x,mean,std)
plt.plot(x,y,c='b')
plt.show()

enter image description here

enter image description here

这意味着平均值的概率为131%?
给定一个点以及如何计算值的概率?这可能吗?

添加我的情况:
我知道在连续变量中任何点的概率为0。
但是,我的用户问我数据中100的概率是多少,如何量化100?

解决方法

如前所述,在连续分布中x为100的概率为0。提出的正确问题是“ x的概率介于99.5和100.5之间”。可以通过减去间隔两端的cdf来计算。在该间隔内,它也等于曲线下方的面积:
from matplotlib import pyplot as plt
import numpy as np
import scipy.stats as stats

x = np.array([0.7972,0.0767,0.4383,0.7866,0.8091,0.1954,0.6307,0.6599,0.1065,0.0508])

mean = x.mean()
std = x.std()
print('mean:',mean)  # 0.45511999999999986
print('std',std)  # 0.30346538451691657

val = 0.4
eps = 0.05
prob_close_to_val = stats.norm.cdf(val + eps,mean,std) - stats.norm.cdf(val - eps,std)
print(f"probability of being close to {val}: {prob_close_to_val * 100:.2f} %")
# probability of being close to 0.5: 12.95 %

xs = np.linspace(mean - std * 3,mean + std * 3,200)
ys = stats.norm.pdf(xs,x.mean(),x.std())
plt.plot(xs,ys,c='b')
plt.fill_between(xs,where=(xs >= val - eps) & (xs <= val + eps),color='r',alpha=0.3)
plt.ylim(ymin=0)
plt.margins(x=0)
plt.show()

explanation plot

在y轴上解释1.3的值:x落在w周围宽度x=0.5的小区域中的概率接近1.3/w。选择w=0.1会得到1.3/0.1或大约13%。

,

y是概率 density 函数,x是一个连续变量,连续域中任何值的概率为0。那个值(通常为pdf)连续域的意思是,假设(mean-dx/2,mean+dx/2)小(在极限1.314622*dx中相等),则值位于dx区间中的概率约为dx->0。实际上,您可以在pdf的中心具有一个无限值的delta函数(只要pdf下的面积之和为1)。有关更多信息,您可以查看Wikipedia:https://en.wikipedia.org/wiki/Probability_density_function

对于离散随机变量的概率质量函数,不要将其与概率质量函数混淆,离散随机变量表示变量等于某个值的概率。

,

您正在使用的函数将计算平均值处(即高斯峰处)的概率密度函数的值。

概率密度函数具有整数1。这并不意味着概率密度函数的值必须始终小于1。