【数据挖掘导论】HW1

本文介绍了如何使用蒙特卡洛方法求解积分问题,包括π的近似值、一元和二元积分。通过在不同采样点数下进行多次实验,分析了积分结果的均值和方差,展示了随着采样点增加,积分结果的精确度提高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蒙特卡洛方法求积分

Exercise 1.

蒙特卡洛方法可以用于产生接近π\piπ的近似值。图1显示了一个带有1/4内切圆在内的边长为1的正方形。正方形的面积是1,该1/4圆的面积为π/4\pi/4π/4。通过编程实现在这个正方形中产生均匀分布的点。落在圈内(红点)的点和总的投在正方形(红和绿点)上的点的比率给出了π/4\pi/4π/4的近似值。这一过程称为使用蒙特卡洛方法来仿真逼近π\piπ实际值。令N表示总的投在正方形的点。当投点个数分别是20, 50, 100, 200, 300, 500, 1000, 5000时,π\piπ值分别是多少?对于每个N,每次实验算出π​\pi​π值,重复这个过程20次,并在表中记下均值和方差。
在这里插入图片描述

Exercise 2.

我们现在尝试通过蒙特卡洛的方法求解如下的积分:
∫01x3​\int_0^1 x^3​01x3
该积分的求解我们可以直接求解,即有∫x=01x3=1/4​\int_{x=0}^1 x^3=1/4​x=01x3=1/4。如果你用蒙特卡洛的方法求解该积分,你认为x可以通过什么分布采样获得?如果采样次数是分别是N = 5, 10, 20, 30, 40, 50, 60, 70, 80, 100,积分结果有多好?对于每个采样次数N,重复蒙特卡洛过程100次,求出均值和方差,然后在表格中记录对应的均值和方差。

Exercise 3:

我们现在尝试通过蒙特卡洛的方法求解如下的更复杂的积分:
∫x=24∫y=−11f(x,y)=y2∗e−y2+x4∗e−x2x∗e−x2​\int_{x=2}^4\int_{y=-1}^1 f(x,y)=\frac{y^2*e^{-y^2}+x^4*e^{-x^2}}{x*e^{-x^2}}​x=24y=11f(x,y)=xex2y2ey2+x4ex2

你能够通过公式直接求解上述的积分吗?如果你用蒙特卡洛的方法求解该积分,你认为(x, y)可以通过什么分布采样获得?如果点(x, y)的采样次数是分别是N = 10, 20, 30, 40, 50, 60, 70, 80, 100, 200, 500, 积分结果有多好?对于每个采样次数N,重复蒙特卡洛过程100次,求出均值和方差,然后在表格中记录对应的均值和方差。

解答

Monte Carlo Methods的两种表达:

  • Monte Carlo投点估计法。利用落在有效范围内的点和总的投点数的比率的方法来仿真逼近实际值。
  • Monte Carlo公式计算法。
    • 一重积分F=∫abf(x)dxF=\int_a^bf(x)dxF=abf(x)dx,利用公式&lt;FN&gt;=(b−a)∗1N∑i=0N−1f(Xi)&lt;F^N&gt;=(b-a)*\frac{1}{N}\sum_{i=0}^{N-1}f(X_i)<FN>=(ba)N1i=0N1f(Xi)求解。
    • 双重积分F=∫ab∫cdf(x,y)dxdyF=\int_{a}^b\int_{c}^df(x,y)dxdyF=abcdf(x,y)dxdy,利用公式&lt;FN&gt;=(b−a)∗(d−c)∗1N∑i=0N−1f(Xi,Yi)&lt;F^N&gt;=(b-a)*(d-c)*\frac{1}{N}\sum_{i=0}^{N-1}f(X_i,Y_i)<FN>=(ba)(dc)N1i=0N1f(Xi,Yi)求解。
第一题
  • Way1—投点估计法

    function [mu,sigma_2,pis] = MonteCarloPI(N)
        round = 100;
    
        pis = zeros(1,round);
        for i=1:round
            x=rand(1,N);
            y=rand(1,N);
    
            dis_2=x.*x+y.*y;    % 采样点与远点的距离平方
            pis(i)=numel(find(dis_2<1))/N*4;    %pi=距离平方<r^2的点的个数/采样点总数*4
    
        end
        mu=mean(pis);       % 计算pi数组均值
        sigma_2=var(pis);   % 计算pi数组方差
    
    
    • 每轮循环,通过rand函数产生服从均匀分布的N个x,y坐标样本
    • 计算每点到原点的距离的平方
    • 记录距离平方<r2r^2r2的点的个数与采样点总数的比值,即为π/4​\pi/4​π/4
    • 计算pis数组的均值和方差

    测试表格:

    N205010020030050010005000
    μ\muμ3.14003.12963.12523.14663.14243.14973.14433.1416
    σ2\sigma^2σ20.12320.06210.02570.01450.00850.00670.00230.0005
  • Way2—公式计算法

    function [mu,sigma_2,pis] = MonteCarloMethodsPI(N)
        round = 100;
    
        pis = zeros(1,round);
        for i=1:round
            x=rand(1,N);        % 得到随机x样本
            y=sqrt(1-x.^2);     % 计算对应的y值,y=sqrt(1-x^2)
            F_N=mean(y);        % 计算y的均值
    
            pis(i)=F_N*4;       % 通过均值*x的宽度计算面积
    
        end
        mu=mean(pis);
        sigma_2=var(pis);
    
    
    • 产生随机N个x样本
    • 计算对应的函数值y,y=1−x2y=\sqrt{1-x^2}y=1x2
    • 计算随机样本对应的y的均值
    • 通过近似均值*x的范围宽度模拟面积
第二题
  • Way1—投点估计法

    function [mu,sigma_2,result] = MonteCarloIntegration(N)
        round = 100;
        
        result =zeros(1,round);
        for i=1:round
            x=rand(1,N);
            y=rand(1,N);
            dis_2=y-x.^3;   % 检测随机点是否在图像下方
            
            result(i)=numel(find(dis_2<0))/N; % 计算下方点的个数与样点总数的比值*样本区间面积1
            
        end
        mu=mean(result);
        sigma_2=var(result);
    
    
    • 每轮循环,通过rand函数产生服从均匀分布的N个x,y坐标样本
    • 检测随机点是否在图像下方
    • 积分结果=下方点的个数/样点总数的比值*样本区间面积1
    • 计算result数组的均值和方差
  • Way2—公式计算法

    function [mu,sigma_2,result] = MonteCarloMethodsIntegration(N)
        round = 100;
        
        result =zeros(1,round);
        for i=1:round
            x=rand(1,N);    % 产生随机样本x
            y=x.^3;         % 计算样本x对应函数值
            
            result(i)=mean(y);  % 面积=y的均值*x区间范围(1-0)
            
        end
        mu=mean(result);
        sigma_2=var(result);
        
    
    • 产生随机N个x样本
    • 计算对应的函数值y,y=x3y=x^3y=x3
    • 计算随机样本对应的y的均值
    • 积分结果=近似均值*x的区间范围

    测试表格:

    N1020304050607080100
    μ\muμ0.24800.25520.25180.25410.25150.24600.25240.25170.2494
    σ2\sigma ^2σ20.00830.00460.00270.00260.00160.00110.00130.00090.0008
第三题

定义积分函数:

function [f] = DoubleIntegrationFunc(x,y)

    numerator = y.^2.*exp(-y.^2)+x.^4.*exp(-x.^2);
    denominator = x.*exp(-x.^2);
    
    f = numerator./denominator;
  • Way1—投点估计法

    function [mu,sigma_2,result] = MonteCarloDoubleIntegration(N)
        round = 100;
        zmax=1000000;   % 定义最大z值
        
        v=2*2*zmax;     % 测试体积=x区间宽度*y区间宽度*z区间宽度
        result =zeros(1,round);
        for i=1:round
            x=rand(1,N)*2+2;    % 产生随机x样本
            y=rand(1,N)*2-1;    % 产生随机y样本
            
            z=rand(1,N)*zmax;   % 产生随机z样本
            f=DoubleIntegrationFunc(x,y);   % 计算x,y对应函数值
            
            dis_2=z-f;  % 检测点的有效性
            
            result(i)=numel(find(dis_2<0))/N*v; % 积分体积=有效点个数/总个数*测试体积
            
        end
        mu=mean(result);
        sigma_2=var(result);
    
    • 定义最大z值,计算测试体积=x区间宽度 * y区间宽度 * z区间宽度
    • 产生x,y,z随机样本
    • 计算x,y对应函数值,检测点的有效性
    • 积分体积=有效点个数/总个数*测试体积
    • 计算均值和方差
  • Way2—公式计算法

    function [mu,sigma_2,result] = MonteCarloMethodsDoubleIntegration(N)
        round = 100;
        
        result =zeros(1,round);
        for i=1:round
            x=rand(1,N)*2+2;
            y=rand(1,N)*2-1;
            
            z=DoubleIntegrationFunc(x,y);   % 计算x,y对应函数值
                    
            result(i)=2*2*mean(z);  % 积分体积=函数值的均值*x区间宽度*y区间宽度
            
        end
        mu=mean(result);
        sigma_2=var(result);
        
    
    • 产生x,y随机样本
    • 计算x,y对应函数值,调用DoubleIntegrationFunc函数
    • 计算函数值的均值
    • 积分体积=函数值的均值 * x区间宽度 * y区间宽度

    测试表格:

    N1030507080100200500
    μ\muμ108174114960109254112050115700107773113405111568
    σ2\sigma^2σ2(108)(10^8)(108)128.222048.569619.057120.157115.666410.48486.64382.4848

结论

第二题的x样本和第三题的(x,y)样本都采自均匀分布,用rand函数产生。

从表格数据可以看出,样点数N越大,样本均值μ​\mu​μ越接近正确值,方差σ2​\sigma ^2​σ2越小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值