zl程序教程

您现在的位置是:首页 >  后端

当前栏目

基于python/scipy学习概率统计(1):均匀分布(Uniform Distribution)

Python统计学习 基于 概率 distribution scipy
2023-09-14 09:01:30 时间

目录

1. 前言

2. 均匀分布 Uniform Distribution

2.1 统计特征

2.2 概率密度函数

2.3 随机采样实验

2.4 其它常用函数


1. 前言

        本系列借助scipy.stats模块对机器学习中常用的概率统计基础知识进行基于实验的学习。

        这第一篇先从最简单的均匀分布(uniform distribution)。

        以下的代码示例假定在Jupyter notebook中运行,并且缺省地先进行了以下必要的包的导入。

import random
import numpy as np
%matplotlib inline
from matplotlib import pyplot as plt

2. 均匀分布 Uniform Distribution

        均匀分布可能是最简单的分布之一了。

        连续均匀分布的概率密度函数(pdf: probability density function)如下所示:

         对于遵循离散均匀分布的随机变量X来说有K个取值,每种取值的概率相等,均为1/K,即:

P(X=x_i) = \frac{1}{K}, i=1,2,...,K

2.1 统计特征

        机器学习中最常用的随机变量的统计特征为均值(mean, 一阶原点矩),方差(variance, 二阶中心矩, 方差的平方根称为标准差:standard deviation),偏度(skewness, 三阶中心矩,也称倾斜度),峰度(kurtosis, 四阶中心矩)。

        对于标准的连续均匀分布(对应于以上定义式中a = 0, b = 1),这4个常用统计特征定义分别为:

\mu = \int^1_0{xf(x)dx}=1/2

\sigma^2=\int^1_0{(x-\mu)^2f(x)dx}=\int^1_0{(x-\frac{1}{2})^2f(x)dx}=\frac{1}{12}

\mu_3 = \int^1_0{(x-\mu)^3f(x)dx}=\int^1_0{(x-\frac{1}{2})^3dx}=0

\mu_4 = \int^1_0{(x-\mu)^4f(x)dx} = \int^1_0{(x-\frac{1}{2})^4dx}=\frac{1}{80}

        用以下代码来看看标准的连续均匀分布的统计特征与以上理论值是否吻合:

from scipy.stats import uniform
mean, var, skew, kurt = uniform.stats(moments='mvsk')
print(mean, var, skew, kurt)

         输出结果:0.5 0.08333333333333333 0.0 -1.2

        前三个是吻合的,然而第4个(Kurtosis)是"-1.2"。。。有点方,发生了什么?让我品一品^-^

        非标准的连续均匀分布是什么情况呢?

rv_uniform = uniform(10,40)
mean, var, skew, kurt = rv_uniform.stats(moments='mvsk')
print(mean, var, skew, kurt)

       输出结果:30.0 133.33333333333331 0.0 -1.2

        均值和方差随(a,b)变化而变化,Skewness总是等于0,这个符合预期。Kurtosis仍然是"-1.2",问题同上。。。有没有人能告诉我为什么,在线等^-^

        [2021-10-13] 

        scipy.stats中的Kurtosis是采用以下定义(至于为什么这样的定义另文解释):

\kappa = \frac{\mu_4}{(\mu_2)^2}-3=\frac{\mu_4}{(\sigma^2)^2}-3

        对于标准的区间[0,1]的均匀分布来说,将\sigma^2=\frac{1}{12}\mu^4=\frac{1}{80}代入可得:

\kappa = (\frac{1}{80})/(\frac{1}{12})^2-3=\frac{9}{5}-3=-1.2

        进一步,也可以证明\kappa确实不依赖于区间[a,b]的位置和宽度。 

2.2 概率密度函数

        以下代码中调用函数pdf()给出了三种参数条件下的连续均匀分布的概率密度曲线图。 pdf()的第一个参数指定采样点,第二个参数和三个参数用于指定区间,但是要注意其指定方式,第二个参数对应于a,而“第二个参数与第三个参数之和”对应于b。换句话说,第二个参数指定区间起点,第三个参数指定区间宽度。

x = np.linspace(-12,12,100)
plt.plot(x, uniform.pdf(x),'r-', lw=3, alpha=1.0, label='standard uniform pdf')
plt.plot(x, uniform.pdf(x,-5,10),'r-', lw=3, alpha=0.6, label='uniform[-0.5,1.5] pdf')
plt.plot(x, uniform.pdf(x,-10,20),'r-', lw=3, alpha=0.6, label='uniform[-10,10] pdf')
plt.legend()

         可以看出,在区间(a,b)范围内的概率密度值与区间(a,b)的宽度成反比,符合预期。

        当然,也可以自己写一个函数来计算这个pdf以验证理解是否正确,如下所示: 

def my_uniform_pdf(x, a, b):

    y = [1 / (b - a) if a <= val and val <= b else 0 for val in x]

    return x, y

x = np.arange(-100, 100) # define range of x
for ls in [(-50, 50), (10, 20)]:
    a, b = ls[0], ls[1]
    x, y = my_uniform_pdf(x, a, b)
    plt.plot(x, y, label=r'$a=%.2f,\ b=%.2f$' % (a, b))

plt.legend()
plt.show()

        符合预期。不过前面已经说了,均匀分布是最简单的概率分布之一,所以这个也没有什么值得骄傲的^-^。后面有些比较复杂的概率分布,要自己写代码计算概率密度函数就要费点劲了。

2.3 随机采样实验

        接下来做个随机采样实验,生成指定的概率分布的随机样本,然后对样本进行统计分析,看看它的统计特征与理论值是否吻合(当然肯定是吻合的^-^,如果有发现不吻合--比如说上面的Kurtosis--那就意味着我们的理解有误或者库函数使用方式有误。这种试错的方式正是学习正途)。

        首先,进行随机数采样。以下生成在(10,30)的均匀分布的10000个样点,调用rvs()函数生成。

# random numbers from uniform distribution
n     = 10000
start = 10
width = 20
samples_uniform = uniform.rvs(size=n, loc = start, scale=width)

         然后,画出以上随机样本数据的直方图,并且与理论上的概率密度函数放在一起进行对比。

fig, ax = plt.subplots(1, 1)
x = np.linspace(start-5,start+width+5,100)
ax.hist(samples_uniform, bins=100,density=True, histtype='stepfilled', alpha=0.2, label=r'$a=%.2f,\ b=%.2f$' % (start, start+width))
ax.plot(x, uniform.pdf(x,start,width),'r-', lw=3, alpha=0.6, label='uniform[%.2f,%.2f] pdf' % (start, start+width))
ax.legend(loc='best', frameon=False)
plt.show()

        如上所示,随机样本数据的直方图 (归一化后可以认为是概率密度函数的近似)与理论值基本吻合。当然有一定的差异的,这是由随机变量的本事属性所致,当样本数据量足够大的时候这种差异就会变得足够小。

2.4 其它常用函数

        logpdf()

        cdf(), logcdf()

        sf(), logsf(), isf()

        ppf()

        moment()

        entropy()

        fit()

        expect(), mean(), var(), std(), interval()

        暂时不再一一介绍,等用到了或者有时间了再来补充。这些函数对于所有各种分布,所以也可能再后续其它概率分布的介绍中进行穿插介绍。

        

        本系列计划目录:

        (1) 均匀分布

        (2) 伯努利分布:  https://blog.csdn.net/chenxy_bwave/article/details/120847774

        (3) 正态分布: https://blog.csdn.net/chenxy_bwave/article/details/121661014

        (4) 二项分布

        (5) Student-T分布

        (6) Chi-Square分布

        (7) Rayleigh/Rice分布

        (8) Beta分布

        (9) Gamma分布

        (10) 玻尔兹曼分布

        (11) 指数分布

        (12) dirichlet分布

        ......

Reference:

        [1] scipy.stats.norm — SciPy v1.7.1 Manual