题目 3:逆函数随机采样

题目 3:随机采样

小透明

任务定义

已知 LaplaceX 随机变量X,它的均值为 0,方差为 1

通过一个均匀分布的随机抽样,实现对x~p(x)的抽样,并得到对应的 100 个独立等分布的样本

实验环境

windows系统、spyder软件

方法描述

  • 推导求解逆函数

在这里插入图片描述

  • 逆函数采样

    Y符合[0-1]均匀分布,通过随机取样、逆函数变换实现对X的采样

  • 编程实现

    逆函数构造

    def inserve(y):#分布的逆分布函数
        if y>0.5:
            x=-1/(np.sqrt(2))*np.log(2-2*y)
        else:
            x=1/(np.sqrt(2))*np.log(2*y)
    	return x
    

    随机采样

    X=np.zeros(num)
    for i in range(num):
        y=random.random()
        x=inserve(y)
        X[i]=x
    

实验结果及分析

实验结果

  • 100 个独立等分布的样本

    [-3.38703056e-01  1.25719737e+00 -5.95557220e-01  9.29009022e-03
      2.33077360e-01  4.19338186e-01 -2.88219292e+00  1.01633331e+00
     -3.57167334e-01  9.07019226e-01 -6.80304902e-02 -3.11649246e-02
     -1.03941839e-01 -3.25470976e-01 -3.91938043e-01 -7.05427932e-01
     -8.67716651e-01  5.24122765e-01  7.43172960e-01  2.67250765e-01
     -1.87787053e+00  1.09831838e+00  1.54990829e+00 -5.62240957e-01
      2.43603705e-01  6.86360286e-01 -1.14586607e-01 -1.46388942e+00
     -1.64536828e-01 -1.38174863e-01  8.06547809e-01  2.64402058e-01
     -6.91517587e-02 -1.75669500e-01  8.89946362e-01 -1.15527876e+00
     -3.78578829e-01  6.99080994e-02 -1.89452630e-03 -2.36555011e-01
      5.52770828e-01 -1.24656605e-01 -1.08180214e+00 -6.87375350e-01
     -6.30115765e-01 -2.57973625e-01 -6.97239371e-01 -3.19449897e-01
      3.34303406e-01 -5.14395853e-01  1.50611513e-01  1.00867531e+00
      1.27424379e-01  5.44879745e-01  4.17240284e-01  9.81261243e-01
      1.43866804e-02  6.41492600e-01 -2.96476452e-01  2.73054878e+00
     -9.64058039e-01  2.17378149e+00 -7.92221308e-02 -4.63823570e-01
     -3.13243717e-01 -1.11803396e-01  1.06766772e-01 -2.91342171e-01
      6.31716602e-01  5.49117285e-01 -3.90605470e-01  9.14193373e-02
      1.90674476e+00  1.12240620e-01 -9.48045416e-01  2.31648027e+00
      2.05490973e+00 -1.83925851e+00 -1.10969893e+00  8.82463653e-01
      9.26237922e-01 -7.55337073e-03 -2.74670974e-01  2.61457429e-01
      9.81956271e-01  3.70477140e-02  1.00804189e+00 -3.24020226e-02
      7.77463811e-03 -2.98610900e+00  3.43289462e+00 -3.15996113e-01
     -1.57024575e-02 -4.43106666e-01 -1.88075617e-01  5.77781594e-03
      4.37862073e-01  1.84532553e+00  4.15082412e-01  1.63258658e-01]
    

结果分析

  • 将采样数据可视化统计在一定区间上的频率

在这里插入图片描述

  • 绘制标准LaplaceX 随机变量X概率密度函数

由于采样点不足发现采样数据与标准概率密度函数有所偏差增大采样数

在这里插入图片描述

增大采样数发现采样结果更符合X分布,体现了大数定律。

最后环节——上源码

# -*- coding: utf-8 -*-
"""
Created on Thu May  6 15:09:50 2021

@author: Administrator
"""


import random
import numpy as np
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import math


num=200

def pdf(x):#分布的概率密度函数
    if x>0:
        y=1/(np.sqrt(2))*np.exp(-1*x*np.sqrt(2))
    else:
        y=1/(np.sqrt(2))*np.exp(x*np.sqrt(2))
        
    return y

def inserve(y):#分布的逆分布函数
    if y>0.5:
        x=-1/(np.sqrt(2))*np.log(2-2*y)
    else:
        x=1/(np.sqrt(2))*np.log(2*y)

    return x


X=np.zeros(num)


for i in range(num):
    y=random.random()
    x=inserve(y)
    X[i]=x
    

bins = np.linspace(X.min(), X.max(), 20)  
b = np.linspace(X.min(), X.max(), 40)  
out=np.zeros(40)
for i in range(40):
    out[i]=pdf(b[i])
frequency_each, _1, _2 = plt.hist(X,
                                  bins,
                                  alpha=1,
                                  density=True)  


plt.xlim(X.min(), X.max()) 
gap=(X.max()-X.min())/20
for i in range(20):
    bins[i]+=gap/2
plt.plot(b,out,color='g')
plt.xlabel('sample')
plt.ylabel('frequency')
plt.legend('p')
plt.title('N:200')
plt.show()



print(X)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值