降低方差的统计方法详解其一:平均值估计法

§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平均值估计的用法

在计算积分\int_{a}^{b}f(x)dx

1.生成[a,b]上的一组等概率的随机数x_1,x_2,x_3......x_n

2.分别计算,f(x_1)(b-a),f(x_2)(b-a),f(x_3)(b-a)...f(x_n)(b-a)

3.求平均值即为积分\int_{a}^{b}f(x)dx的平均估计 

§2.2平均值估计的无偏性以及方差减小证明

§2.2.1无偏性证明

对积分作如下变换

                               \int_{a}^{b}f(x)dx=E(f(R)(b-a))\\ R\sim U(a,b)

注意,R的密度函数是(b-a)^-1,故要乘以(b-a)^-1

将其看成一个随机变量f(R)(b-a)的平均值,我们只需要生成f(R)(b-a)的随机数,求平均即可

由上可得到,当生成的f(R)(b-a)足够多时,其平均就会收敛于E(f(R)(b-a)),从而收敛于\int_{a}^{b}f(x)dx,无偏性得证.

§2.2.2证明方差减小

方差的减小是相对于随机投点法,假设对积分\int_{a}^{b}f(x)dx做估计,下面计算于比较两种方法的方差

1.对于n个点的随机投点法,投点区域是[a,b]*[0,f(x)max]

对区域[a,b]*[0,f(x)max]进行随机投点(\xi _1,\eta _1),(\xi _2,\eta _2),(\xi _3,\eta _3)......(\xi _n,\eta _n)则对于积分\int_{a}^{b}f(x)dx的估计\widehat{I_1} 为 \widehat{I_1}=\frac{1}{n}\sum_{i=1}^{n}I_{\eta_i \leqslant f(\xi_i )}(b-a)f(x)_{max}

令:I=E(\widehat{I_1})=\int_{a}^{b}f(x)dx

计算方差

Var(\widehat{I_1})=Var(\frac{1}{n}\sum_{i=1}^{n}I_{\eta_i \leqslant f(\xi_i )}(b-a)f(x)_{max})=\\ \frac{1}{n}\left \{ E\left [ (b-a)^2f^2(x)_{max}I^2_{\eta\leqslant f(\xi)}\right ]-E\left [(b-a)f(x)_{max}I_{\eta\leqslant f(\xi)}\right ]^2\right \}

由示性函数性质得到:E(I_{\eta\leqslant \xi}^2)=E(I_{\eta\leqslant \xi})=\frac{I}{f(x)_{max}(b-a)}

Var(\widehat{I}_1)=\frac{1}{n}\left [ (b-a)f(x)_{max}I-I^2 \right ]

结果解释:可以看到随机投点法估计的方差随着投点数n的增大而减小,这个是显然的,而对于左边部分等于:矩形的面积与积分面积之差*积分面积,可见积分区域与矩形区域越相近估计越准

2.对于n个点的平均值估计法,估计值\widehat{I_2}=\frac{(b-a)}{n}\sum_{i=1}^{n}f(x_i),其中x_1,x_2.....x_n是来自[a,b]上均匀分布的随机数,我们有如下关系

I=E(\widehat{I_2})=\int_{a}^{b}f(x)dx

计算方差

Var(\widehat{I_2})=Var(\frac{(b-a)}{n}\sum_{i=1}^{n}f(x_i))=\frac{1}{n}Var((b-a)*f(R))=\frac{1}{n}\left \{ E(f^2(R))(b-a)^2-I^2 \right \}=\\ \frac{1}{n}\left \{ \frac{ E(f^2(R))}{E(f(R))}(b-a)I-I^2 \right \}

最后一个等号用到了I=E(f(R))(b-a)

3.比较两者方差

f^2(R)=f(R)f(R)\leqslant f(x)_{max}f(R)\Rightarrow \\ E(f^2(R))\leqslant E(f(x)_{max}f(R))=f(x)_{max}E(f(R))\Rightarrow

\frac{E(f^2(R))}{E(f(R))}(b-a)I\leqslant (b-a)f(x)_{max}I\Rightarrow

Var(\widehat{I_2})\leqslant Var(\widehat{I_1})

得到平均值估计法估计的方差一定小于等于随机投点法,故平均值估计法一定比投点法更可靠(平均值靠近准确值的概率大)!

§3.平均值估计的具体应用

§3.1平均值估计相关例子以及实现(1000个样本)

§3.1.1

估计定积分 准确值:0.9460831

                                                         \int_{0}^{1}\frac{sin(x)}{x}dx

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) 准确值:\pi

                                                   \int_{0}^{1}x^{-0.5}(1-x)^{-0.5}dx 

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) 准确值:\pi

                                                  E(X)=\int_{0}^{\pi}xsin(x)dx

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

                                                   I=\int_{0}^{2}x^3dx

我们对[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()

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')

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值