在Python中如何计算概率密度函数(PDF)?

17
我有以下代码,可以打印出特定均值和标准差的PDF图形。

现在我需要找到实际概率,即特定值的概率。例如,如果我的平均值是0,而我的值也是0,那么我的概率就是1。通常通过计算曲线下的面积来实现这一点。类似于这样:

http://homepage.divms.uiowa.edu/~mbognar/applets/normal.html

我不确定如何解决这个问题。
import numpy as np
import matplotlib    
import matplotlib.pyplot as plt
    
def normal(power, mean, std, val):
    a = 1/(np.sqrt(2*np.pi)*std)
    diff = np.abs(np.power(val-mean, power))
    b = np.exp(-(diff)/(2*std*std))
    return a*b

pdf_array = []
array = np.arange(-2,2,0.1)
print array
for i in array:
    print i
    pdf = normal(2, 0, 0.1, i)
    print pdf
    pdf_array.append(pdf)

plt.plot(array, pdf_array)
plt.ylabel('some numbers')
plt.axis([-2, 2, 0, 5])
plt.show()

print 
3个回答

16

除非你有自己实现的理由,否则所有这些功能都在scipy.stats.norm中提供。

如果你需要cdf,那么请使用以下代码:

from scipy.stats import norm
print(norm.cdf(x, mean, std))

我正在使用C ++。除非你告诉我有一个eigen函数。 - Raaj
通常是通过计算曲线下的面积来完成这个过程。这将是CDF,而不是PDF,正如此答案所建议的那样。 - sspaniel

8

如果你想从头开始编写:

class PDF():
    def __init__(self,mu=0, sigma=1):
        self.mean = mu
        self.stdev = sigma
        self.data = []

    def calculate_mean(self):
        self.mean = sum(self.data) // len(self.data)
        return self.mean

    def calculate_stdev(self,sample=True):
        if sample:
            n = len(self.data)-1
        else:
            n = len(self.data)
        mean = self.mean
        sigma = 0
        for el in self.data:
            sigma += (el - mean)**2
        sigma = math.sqrt(sigma / n)
        self.stdev = sigma
        return self.stdev

    def pdf(self, x):
        return (1.0 / (self.stdev * math.sqrt(2*math.pi))) * math.exp(-0.5*((x - self.mean) / self.stdev) ** 2)




1
实际上,一个点的密度为0,你需要一个区间的面积来得到概率密度函数。 你可以取一个_epsilon_值,假设是1e-6,并在x和x+e之间的区域上进行积分,以计算出该点的概率密度函数。 它可能不是很准确,但是接近。 integral-calculator -> 这个网站可以帮助您重新制定pdf方程。 - Vaibhav Singh
你可以在网站上添加这个方程式:_1/(sqrt(2pisigma^2)) * exp(-(x-mu)^2/(2*sigma^2))_,然后输入限制条件,比如2和2.0000001,它会给出相应的方程式。 - Vaibhav Singh

4
x = ax = b的曲线下面积等于从x = ax = bf(x)dx的积分。 Scipy 提供了一种快速简便的积分方法。需要理解的是,该区域中找到单个点的概率不能为1,因为总体下曲线下面积为1(除非可能是一个delta函数)。因此,在任何感兴趣的特定值处应该得到0 ≤ probability of value < 1。可能有不同的方法来实现它,但传统的方法是在x轴上分配置信区间像这样。在继续编码之前,应该先阅读高斯曲线和标准化方面的知识。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接