python演示,用经验分布逼近总体精确分布

 经验分布定义为\large F_n(x)=\frac{1}{n}S(x),

\large S(x)表示样本值,不大于任意实数x的样本个数,n表示样本总量。

根据格力文科定理,对于任意的实数x,当样本量足够大的时候,统计量\large F_n(x)与总体分布\large F(x)的函数值之间只有很小的差距,在实际上可以当做总体分布来使用。

设  是来自以 为分布函数的总体 的样本, 是经验分布函数,则有

 

对于固定的x,经验分布的 数学期望  是  总体分布。 

现在假设有200个球,分别标上了数字-100到+100 ,没有标零;现在,再取特定的x=0,每一次从200个球中抽取一个球,相应的数字要么小于零,要么大于零,数字小于零的概率是0.5,大于0的概率也是0.5。

大于零用0表示,小于零用1表示,这件事随机的,用X表示该随机变量,那么,X是一个服从两点分布的随机变量;这里为了保证是来自同一总体,必须是放回抽样。那么现在重复做20次这样的实验,就成了20重伯努利试验,因此在20次试验中,抽到小于零的球的个数\large Y=X_1+X_2+...+X_n=S(0) 是随机变量,服从n=20,p=0.5的 二项分布。于是

\large \dpi{120} \large E(F_{20}(0))=E(\frac{s(0)}{20})=\frac{1}{20}E[S(0)]=\frac{ 0.5*20}{20 }=0.5

对于特定的x,任意一次抽样所得样本X1 要么比x大,要么比x小,比x小的概率为F(x),即是小或大这件事服从0,1分布\large B(1,F(x));现在抽样n次,得到n个样本,因此小于x的个数s(x) 服从二项分布\large B(n,F(x));于是\large E(F_n(x))=E(\frac {s(x)}{n})=F(x)

import numpy as np 
import time
import matplotlib.pyplot as plt 
import matplotlib.mlab as mlab
from scipy.stats import norm
def caculate(len):
	#产生正态随机样本
	len = len #样本数量
	mu = 5
	sigma = 3
	np.random.seed(int(time.time()))
	s =lambda: np.random.normal(mu, sigma, len )
	samples=s()

	# 计算经验分布
	smax,smin=samples.max(),samples.min()
	listx=np.arange(smin,smax+0.1,0.05)
	count=lambda x:((samples<=x)*1).sum()
	fa=[count(i) for i in listx]
	faofn=np.array(fa)/len
	
	# 计算精确分布
	q=[norm.cdf((i-mu)/sigma) for i in listx]
	# 在同一幅图中展示图像
	return listx,faofn,q
if __name__ == '__main__':
	num=400
	listx,faofn,q=caculate(num)
	plt.subplot(221)
	# 经验分布
	plt.plot(listx,faofn)
	plt.plot(listx,q)
	plt.title('num of Samples:'+str(num))
	# 精确分布
	plt.plot(listx[:-1],5*np.diff(faofn)/np.diff(listx))
	plt.plot(listx[:-1],5*np.diff(q)/np.diff(listx))

	num=800
	listx,faofn,q=caculate(num)
	plt.subplot(222)
	plt.plot(listx,faofn)
	plt.plot(listx,q)
	plt.title('num of Samples:'+str(num))
	plt.plot(listx[:-1],5*np.diff(faofn)/np.diff(listx))
	plt.plot(listx[:-1],5*np.diff(q)/np.diff(listx))
	num=1800
	listx,faofn,q=caculate(num)
	plt.subplot(223)
	plt.plot(listx,faofn)
	plt.plot(listx,q)
	plt.title('num of Samples:'+str(num))
	plt.plot(listx[:-1],5*np.diff(faofn)/np.diff(listx))
	plt.plot(listx[:-1],5*np.diff(q)/np.diff(listx))
	num=10000
	listx,faofn,q=caculate(num)
	plt.subplot(224)
	plt.plot(listx,faofn)
	plt.plot(listx,q)
	plt.title('num of Samples:'+str(num))
	plt.plot(listx[:-1],5*np.diff(faofn)/np.diff(listx))
	plt.plot(listx[:-1],5*np.diff(q)/np.diff(listx))
	plt.show()

python演示,用经验分布逼近总体精确分布_第1张图片

 从上图的精确分布和经验分布可以看出,当样本量比较小的时候,经验和总体分布的拟合较差!随着样本量的上升,经验分布和精确分布几乎重合,这就验证了当样本量足够大时,经验分布和总体分布几乎相同。

从上图的经验概率密度和精确概率密度曲线我们可以看出,经验分布密度   在一个特定点处函数值在精确分布分布密度曲线上下波动,有时候处于上方有时候处于下方,具有随机性,但总的趋势和精确分布是相吻合 。到底是位于上方还位于下方,这个服从两点分布,两点分布的p参数能算出来吗?请在评论区留言

你可能感兴趣的:(机器学习,python)