问题描述
我提到了这篇文章: 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()
这意味着平均值的概率为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()
在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。