[未知用户] 所谓维数灾难一般也就是指高维空间下数据的稀疏性。这个很容易理解,比如有10000个样本点均匀分布在样本空间里,如果数据的维数是2,那么正方形的每条边平均有100个样本点;如果数据维数是4,那么一个4维“正方体”每条边上平均只能分布10个数据点;如果维数更高,那么每一维都只能分布到更少的数据点。
在蒙特卡洛积分这里,如果是高维积分,那么抽取随机数的时候就很难照顾到每个变量,也就是说每个变量根本抽不到几个数字样本量就已经很大了,这样由于随机性很差(试想rnorm(2)能算是正态分布的代表么?),积分的结果可能就不靠谱。不知道我这种解释是不是对的。
用程序来说,计算一个n重积分[latex]\int_0^1\int_0^1\cdots\int_0^1x_1x_2\cdots x_ndx_1dx_2\cdots dx_n[/latex],这个积分的结果我们知道,就是[latex]1/2^n[/latex],用蒙特卡洛积分算算模拟的值,并和真实值比较:
# 程序写得稍微有点晦涩,大概意思:
# 10个均匀分布随机数相乘(x1x2...xn),看看比1个均匀分布
# (y)小的概率,考虑到数值精度问题,把乘法改成了exp(log(加法))
# ndim:数据维数;nrep:抽样次数
intProd = function(ndim, nrep = 1e+05) {
c(MC.value = mean(runif(nrep, 0, 1) <= exp(replicate(nrep,
sum(log(runif(ndim)))))), TRUE.value = 1/2^ndim)
}
set.seed(123)
res1 = replicate(10, intProd(15))
res2 = replicate(10, intProd(1))
# 模拟值/真实值
> res1[1, ]/res1[2, ]
[1] 1.96608 0.65536 0.98304 1.31072 1.63840
[6] 0.65536 1.63840 1.63840 1.96608 0.32768
> res2[1, ]/res2[2, ]
[1] 1.00626 1.00260 1.00078 0.99894 0.99892
[6] 1.00616 1.00214 0.99872 1.00050 1.00618
可以看出,样本量固定为十万,当维数为15的时候,模拟结果和真实结果的倍数波动相对比较大,维数为1的时候,结果波动相对较小。
至于animation包的问题,你最好是装最新版的R。不然的话就在加载animation包之前运行update.packages(),否则包的目录被R进程占用了就不能再安装写入了。
如果用Windows,装R的时候我有个习惯,就是把安装过程中的安装目录的版本号去掉,直接装到C:\Program Files\R\目录下,而不带R-2.8.1之类的子目录。这样每次都安装到同一个目录下,卸载R的时候不会卸载以前安装的附加包;在重新安装R之后,只需要update.packages()就可以更新所有可更新的包了。