§1.问题引入
速成直接看§2.1 §3.1
§1.1 评判估计的好坏标准的解释
对于一个无偏或者渐近无偏估计,我们给出统一的渐判标准--估计量的方差,方差的本身就是用来描述数据集的离散程度,对于离散程度大的,方差就大,对于离散程度小的,方差自然就小.什么是估计量的方差呢?
举个例子,我们去估计一个抛硬币(硬币均匀)出现正反面的概率,规定实验次数100次(实验次数要一定,不然没有可比性,自然是次数越多越准),得到了容量为100的样本,现在估计出现正面的概率,我们用频率来表示概率,构造一个估计量:
n=100,NA表示正面出现的次数,根据常识,估计的p值肯定不是0.5,会有一点距离,我们重复上面的实验10次,得到更多的估计值p1,p2,p3....p10,那么估计量的方差的估计值就是这10个数的方差.
注意:这里计算方差的均值就是这10个数的均值
总的来说:方差是用来形容数据集的离散程度的,如果由估计量形成的数据集方差很小,那么重新产生的估计量数就会更有可能在数据集的均值附近,估计量形成的数据集的均值收敛到准确值
以下是投掷100次硬币,用频率估计概率的实验模拟示意图
x表示第几次实验,y表示这次实验的估计值,可以看到,每次实验的估计都会有一定的偏差,这个偏差的方差计算为:0.0020760000000000006,方差较小,故每次估计与准确值的偏差不会很大
注意:估计值的方差只和实验次数和估计量的构造有关, 正如本文中的之和n有关,与m无关,当m很大时,估计值的方差会收敛到一个定值,后面还会提及
§1.2 例:随机投点法估计定积分
用随机投点法估计以下定积分,采用样本量为n=1000的投法估计,得到估计值,重复m=100次,计算所得估计值的方差
在矩形区域内随机投点,用投中的点的比例代替积分区域与矩形面积比
注:积分准确值为2
在python中,投1000个点的实验,重复100次所得到的估计值为:
1.9964821313563132
方差为
0.0021344993438235983
下面将正式介绍平均值估计法,并在同样是1000个样本且重复10次的情况下计算对于两种方法的效果
§2.平均值估计法的详细介绍
§2.1平均值估计的用法
在计算积分时
1.生成[a,b]上的一组等概率的随机数
2.分别计算,
3.求平均值即为积分的平均估计
§2.2平均值估计的无偏性以及方差减小证明
§2.2.1无偏性证明
对积分作如下变换
注意,R的密度函数是(b-a)^-1,故要乘以(b-a)^-1
将其看成一个随机变量的平均值,我们只需要生成的随机数,求平均即可
由上可得到,当生成的足够多时,其平均就会收敛于E(),从而收敛于,无偏性得证.
§2.2.2证明方差减小
方差的减小是相对于随机投点法,假设对积分做估计,下面计算于比较两种方法的方差
1.对于n个点的随机投点法,投点区域是[a,b]*[0,f(x)max]
对区域[a,b]*[0,f(x)max]进行随机投点则对于积分的估计 为
令:
计算方差
由示性函数性质得到:
结果解释:可以看到随机投点法估计的方差随着投点数n的增大而减小,这个是显然的,而对于左边部分等于:矩形的面积与积分面积之差*积分面积,可见积分区域与矩形区域越相近估计越准
2.对于n个点的平均值估计法,估计值,其中是来自[a,b]上均匀分布的随机数,我们有如下关系
计算方差
最后一个等号用到了I=E(f(R))(b-a)
3.比较两者方差
得到平均值估计法估计的方差一定小于等于随机投点法,故平均值估计法一定比投点法更可靠(平均值靠近准确值的概率大)!
§3.平均值估计的具体应用
§3.1平均值估计相关例子以及实现(1000个样本)
§3.1.1
估计定积分 准确值:0.9460831
R
set.seed(1)
x=runif(1000)
mean(sin(x)/x)
python:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1)
x=np.random.uniform(0,1,size=1000)
print(np.mean(np.sin(x)/x))
§3.1.2
估计定积分β(1/2,1/2) 准确值:
R
set.seed(1)
x=runif(1000)
mean(x^-0.5*(1-x)^-0.5)
python:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1)
x=np.random.uniform(0,1,size=1000)
print(np.mean(x**(-0.5)*(1-x)**(-0.5)))
§3.1.3
估计随机变量X的密度函数f(x)=sin(x)其中x取值区间[0,pi],估计E(X) 准确值:
R
set.seed(1)
x=runif(1000,0,pi)
mean(x*sin(x)*pi)
python:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1)
x=np.random.uniform(0,np.pi,size=100000)
print(np.mean(x*np.sin(x)*np.pi))
§3.2进一步改进(重要抽样法)
对于上面的例子,我们看到平均值估计法都是对积分的定义域[a,b]上产生一个均匀分布进行均匀投点(假设我们投1000个点)
原理介绍
我们知道一个客观事实:对于一个区域,投的点越多,估计的越准,如果我们对f(x)的函数值较大的区域多投一些点比如800个(这些区域对结果影响较大,多投点,减小影响,这样结果的波动就小),估计的准确一点,对f(x)函数值较小的区域投200个点,分别计算,相加,这样同样是投1000个点,否会得到一个比平均值估计更准确的结果
而平均值估计法对每一个区间的投点数差不多
例子
如下一个积分,真实值为4
我们对[0,1]上投200个点,对[1,2]上投800个点,和均匀投点比较
python:
import numpy as np
import matplotlib.pyplot as plt
#估计区间[0,2],平均值估计法1000个点
np.random.seed(1)
x=np.random.uniform(0,2,size=1000)
value=np.mean((x**3)*2)
#均匀投点结果
print("均匀投点结果:",value,end=' ')
print()
np.random.seed(1)
#估计区间[0,1],使用平均值估计法200个点
x=np.random.uniform(0,2,size=200)
value1=np.mean(x**3)
#估计区间[1,2],使用平均值估计法800个点
x=np.random.uniform(0,2,size=800)
value2=np.mean(x**3)
print("对积分值较大区域多投点结果:",value1+value2,end=' ')
R:
set.seed(2)
##估计区间[0,2],平均值估计法1000个点
x=runif(1000,0,2)
value=mean(x^3)*2
value
#估计区间[0,1],使用平均值估计法200个点
x=runif(200,0,1)
value1=mean(x^3)
#估计区间[1,2],使用平均值估计法800个点
y=runif(800,1,2)
value2=mean(y^3)
value1+value2
方差大只是意味着更有可能接近正确值,对于上面的R程序,如果种子取1,则会得到,均匀投点效果要好,这是有可能发生的,但是重复多次就会发现,非均匀分布大多情况比均匀分布效果更好
如果我们直接使用平均值估计法:估计值为 3.996027909428547
如果我们对[0,1]上投200个点,对[1,2]上投800个点,估计值为 3.9979582135457767
显然效果要好,当我们的区间划分连续时,就是所谓的重要抽样法,将在下一节介绍
§4.文章中其他代码
抛硬币图形
python:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1)
n=100
m=10 #重复10次
N_a=0
p=[]
for _ in range(0,10):
coin=np.array([0,1]) #0表示反面,1表示正面
sample_X=np.random.choice(coin,size=n,replace=True) #抛掷100次硬币
N_a=sum(sample_X)
p.append(N_a/n) #计算概率这次估计量的值
print(p)
print(np.var(p)) #估计的偏差
#可视化
plt.scatter(x=list(range(1,11)),y=p,color="black")
plt.axhline(y=0.5,color="red")
plt.ylim([0,1])
plt.show()
R
set.seed(1)
n=100
m=10 #重复10次
p=NULL
coin=c(0,1)
for(i in 1:m){
sample_X=sample(coin,n,replace = TRUE)
p[i]=(sum(sample_X)/n)
}
p
var(p)
plot(x=1:m,y=p,col="black",ylim=c(0,1))
abline(h=0.5,col='red')