小实验:关于期望的乘法性质

news2025/1/24 9:29:14

小实验:关于期望的乘法性质

  • 引言
    • 个人疑惑
    • 验证过程
      • 样本生成
      • 实验过程
    • 附:完整代码

引言

本节通过代码实现期望的乘法性质

个人疑惑

在数学期望的定义中,有一条随机变量期望的乘法性质
随机变量 X , Y \mathcal X,\mathcal Y X,Y相互独立时,有:
E ( X ⋅ Y ) = E ( X ) ⋅ E ( Y ) \mathbb E(\mathcal X \cdot \mathcal Y) = \mathbb E(\mathcal X) \cdot \mathbb E(\mathcal Y) E(XY)=E(X)E(Y)

个人误区:随机变量 X , Y \mathcal X,\mathcal Y X,Y分别属于不同分布,在各分布下随机变量独立采样时,它们的期望会满足上述形式

问题:如果两随机变量 X , Y \mathcal X,\mathcal Y X,Y独立同分布 ( Independent Identically Distribution,IID ) (\text{Independent Identically Distribution,IID}) (Independent Identically Distribution,IID)条件下,上述结果是否也成立 ? ? ?

验证过程

样本生成

我们使用基于一维高斯分布 ( Gaussian Distribution ) (\text{Gaussian Distribution}) (Gaussian Distribution)的两随机变量 X , Y \mathcal X,\mathcal Y X,Y进行验证。高斯分布的概率密度函数表示如下:
F ( x ) = 1 σ 2 π exp ⁡ { − ( x − μ ) 2 2 σ 2 } \mathcal F(x) = \frac{1}{\sigma \sqrt{2\pi}} \exp \left\{- \frac{(x - \mu)^2}{2 \sigma^2} \right\} F(x)=σ2π 1exp{2σ2(xμ)2}
对应代码表示如下:

import math
import random
import numpy as np
import matplotlib.pyplot as plt

def pdf(x,mu,sigma):
    return (1 / (sigma * math.sqrt(2 * math.pi))) * math.exp(-1 * (((x - mu) ** 2) / (2 * (sigma ** 2))))

但在牛客网八股刷题系列——概率密度函数中介绍过,概率密度函数结果进描述输入事件发生的可能性,而不是真正的概率结果。这里使用积分近似的方式对概率进行近似描述:
这里使用 1000 1000 1000个点对积分区间(设置左边界 − 5 -5 5,右边界是需要计算概率的值)
需要注意的是:仅作实验使用,左边界数值不能设置太高,否则会导致积分误差较大。

    def GetIntegral(x,mu,sigma,DivideNum=1000):

        dx = list()
        y = list()
        x = list(np.linspace(-5,x,DivideNum))
        for k in range(0,DivideNum - 1):
            y.append(pdf(x[k],mu,sigma))
            dx.append(x[k+1] - x[k])

        return np.sum(np.multiply(y,dx))

基于上述概率结果,我们从均值为 μ \mu μ方差为 σ \sigma σ的高斯分布中采集一组样本
由于‘概率密度函数’形状是关于 x = μ x = \mu x=μ对称图形,需要将大于一半积分 ( 0.5 ) (0.5) (0.5)的结果减去 0.5 0.5 0.5,并将剩余部分乘以2;若积分小于 0.5 0.5 0.5,仅需要将该部分乘以2即可。也就是说, x = μ x = \mu x=μ时的作为该分布的概率最大。

    def GetSample(mu,sigma,SampleNum=500):

        SampleList = list()
        count = 0

        while True:
            n = random.uniform(0,1)
            # PDF的有效范围设置
            Samplex = random.uniform(-10,10)
            SampleIntegral = GetIntegral(Samplex,mu,sigma)
            if SampleIntegral >= 0.5:
                Prob = 2 * (1 - SampleIntegral)
            else:
                Prob = 2 * SampleIntegral
            if n < Prob:
                SampleList.append(Samplex)
                count += 1
            if count == SampleNum:
                break
        return SampleList

至此,可以通过该采样得到不同参数 ( μ , σ ) (\mu,\sigma) (μ,σ),并且数量相同一维高斯分布样本。

实验过程

  • 首先使用服从于相同分布的两组样本集合SampleListxSampleListy。将两组样本集合中的样本对应元素相乘,从而得到一个新的样本集合
    这里样本属于随机相乘。因为我们并不知晓两集合中各样本的具体数值结果。
    def CheckExpectationValue(Inputx,Inputy):
        """
        Inputx,Inputy -> IID
        From the same Gaussian Distribution.
        :return:
        """
        # RandomProduct
        ProductSample = [i * j for _,(i,j) in enumerate(zip(Inputx,Inputy))]
        return sum(ProductSample) / len(ProductSample)

此时,构建两个参数相同的高斯分布的样本集合,执行上述操作:
末尾附完整代码。

	SampleListx = GetSample(mu=1.0, sigma=1.0)
    SampleListy = GetSample(mu=1.0, sigma=1.0)
    MixExpect = CheckExpectationValue(SampleListx,SampleListy)
	
	print(sum(SampleListx) / len(SampleListx))
    print(sum(SampleListy) / len(SampleListy))
    print(MixExpect)

原集合新集合的期望结果分别表示为:

# 1.0 * 1.0 = 1.0
0.9918332790661574
0.9996555919557066
1.0031321613765627

可以发现,个人误区中的想法是错误的:只要随机变量之间相互独立(单独被采样出来),即便它们属于相同分布,期望的乘法性质依旧成立

将这个示例泛化

  • 选择两个不同参数的高斯分布;
  • 每隔 10 10 10个样本,输出一次原始集合、新集合的期望结果, 观察它们的收敛过程
    def CheckExpectAstringency(SampleListx,SampleListy,mu):

        ContainerX = list()
        ContainerY = list()
        ExpectXList = list()
        ExpectYList = list()
        ExpectList = list()

        for idx,(i,j) in enumerate(zip(SampleListx,SampleListy)):

            ContainerX.append(i)
            ContainerY.append(j)
            if len(ContainerX) % 10 == 0:
                ExpectXList.append(sum(ContainerX) / len(ContainerX))
                ExpectYList.append(sum(ContainerY) / len(ContainerY))
                ExpectList.append(CheckExpectationValue(ContainerX,ContainerY))

        plt.plot([i for i in range(len(ExpectList))],[mu for _ in range(len(ExpectList))])
        plt.plot([i for i in range(len(ExpectList))],ExpectList,c="tab:orange")
        plt.plot([i for i in range(len(ExpectList))],ExpectXList,c="tab:red")
        plt.plot([i for i in range(len(ExpectList))],ExpectYList,c="tab:green")
        plt.show()

	SampleListx = GetSample(mu=1.5, sigma=1.0)
    SampleListy = GetSample(mu=2.0, sigma=1.0)
    # mu:1.5 * 2.0 = 3.0
 	CheckExpectAstringency(SampleListx,SampleListy,mu=3.0)

最终图像结果返回如下:
其中绿色线,红色线分别表示各原始集合的期望收敛过程;橙色线表示新集合的期望收敛过程。而蓝色线则表示新集合的理论期望结果。
返回图像结果
可以看出,随着样本的增多,分布的描述越加明显,期望结果逐渐向理论期望结果收敛。并且在原始分布均是高斯分布的条件下,即便分布参数之间存在差异,但不影响期望的乘法性质。
本篇文章目的是针对深度学习笔记——数值稳定性、模型初始化与激活函数中期望问题的验证,该文章中有理解错误,后续修改。

附:完整代码

import math
import random
import numpy as np
import matplotlib.pyplot as plt

def pdf(x,mu,sigma):
    return (1 / (sigma * math.sqrt(2 * math.pi))) * math.exp(-1 * (((x - mu) ** 2) / (2 * (sigma ** 2))))

def Console():
    def GetIntegral(x,mu,sigma,DivideNum=1000):
    
        dx = list()
        y = list()
        x = list(np.linspace(-5,x,DivideNum))
        for k in range(0,DivideNum - 1):
            y.append(pdf(x[k],mu,sigma))
            dx.append(x[k+1] - x[k])
        return np.sum(np.multiply(y,dx))

    def GetSample(mu,sigma,SampleNum=5000):

        SampleList = list()
        count = 0
        while True:
            n = random.uniform(0,1)
            Samplex = random.uniform(-10,10)
            SampleIntegral = GetIntegral(Samplex,mu,sigma)
            if SampleIntegral >= 0.5:
                Prob = 2 * (1 - SampleIntegral)
            else:
                Prob = 2 * SampleIntegral
            if n < Prob:
                SampleList.append(Samplex)
                count += 1
            if count == SampleNum:
                break
        return SampleList

    def CheckExpectationValue(Inputx,Inputy):
        """
        Inputx,Inputy -> IID
        :return:
        """
        # RandomProduct
        ProductSample = [i * j for _,(i,j) in enumerate(zip(Inputx,Inputy))]
        return sum(ProductSample) / len(ProductSample)

    def CheckExpectAstringency(SampleListx,SampleListy,mu):

        ContainerX = list()
        ContainerY = list()
        ExpectXList = list()
        ExpectYList = list()
        ExpectList = list()

        for idx,(i,j) in enumerate(zip(SampleListx,SampleListy)):
            ContainerX.append(i)
            ContainerY.append(j)
            if len(ContainerX) % 10 == 0:
                ExpectXList.append(sum(ContainerX) / len(ContainerX))
                ExpectYList.append(sum(ContainerY) / len(ContainerY))
                ExpectList.append(CheckExpectationValue(ContainerX,ContainerY))

        plt.plot([i for i in range(len(ExpectList))],[mu for _ in range(len(ExpectList))])
        plt.plot([i for i in range(len(ExpectList))],ExpectList,c="tab:orange")
        plt.plot([i for i in range(len(ExpectList))],ExpectXList,c="tab:red")
        plt.plot([i for i in range(len(ExpectList))],ExpectYList,c="tab:green")
        plt.show()

    SampleListx = GetSample(mu=1.0, sigma=1.0)
    SampleListy = GetSample(mu=1.0, sigma=1.0)
    MixExpect = CheckExpectationValue(SampleListx,SampleListy)
    # mu:1.0 * 1.0 = 1.0
 	CheckExpectAstringency(SampleListx,SampleListy,mu=1.0)

if __name__ == '__main__':
    Console()

返回结果:
示例代码返回结果

相关参考:
数学期望——百度百科

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/521641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring如何处理循环依赖

何为循环依赖 所谓的循环依赖&#xff0c;就是两个或者两个以上的bean互相依赖对方&#xff0c;最终形成闭环。比如“A对象依赖B对象&#xff0c;而B对象也依赖A对象”&#xff0c;或者“A对象依赖B对象&#xff0c;B对象依赖C对象&#xff0c;C对象依赖A对象”&#xff1b;类…

MySQL笔记-多表查询

本文标签 : 多表查询 事务四大特性 并发事务问题 事务隔离级别 文章目录 目录 文章目录 一、多表查询 1.多表关系 2.多表查询概念 3.多表查询的分类 4.内连接 5.外连接 6.自连接 7.联合查询 8.子查询 1.标量子查询 2.列子查询 3.行子查询 4.表子查询 9.多表查询案例练习 二…

springboot+vue汉服文化平台网站(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的汉服文化平台网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

初阶数据结构之带头+双向+循环链表增删查实现(三)

文章目录 [TOC](文章目录) 前言一、带头双向循环链表的初始化1.1带头双向循环链表的结构体定义1.2初始化代码的实现 二、带头双向循环链表的增功能实现2.1头插代码的实现2.2尾插代码的实现 三、带头双向循环链表的打印功能实现3.1打印代码的实现 四、带头双向循环链表删功能实现…

国开电大《WEB开发基础》形考任务【答案】实验1-5:电商网站前端页面内容编写

国开电大《WEB开发基础》形考任务1 国开电大《WEB开发基础》形考任务1 国开电大《WEB开发基础》形考任务3 国开电大《WEB开发基础》形考任务4 国开电大《WEB开发基础》形考任务5 作业答案 联系QQ:1603277115 【目标】根据素材中的设计图&#xff0c;编写网站首页&#xff0c;查…

AcWing算法提高课-1.3.6货币系统

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 给你一个n种面值的货币系统&#xff0c;求组成面值为m的货币有多少种方案。 输入格式 第一行&#xff0c;包含两个整数n和m。 接…

Vue3-黑马(七)

目录&#xff1a; &#xff08;1&#xff09;vue3-基础-子组件1 &#xff08;2&#xff09;vue3-基础-子组件2 &#xff08;3&#xff09;vue3-进阶-antdv-入门 &#xff08;1&#xff09;vue3-基础-子组件1 之前我们的例子里只使用了一个vue的组件&#xff0c;那么在这个…

近40个开源的工业软件-工业4.0

不同的工业流程&#xff0c;需要不同的工业软件。面向研发设计环节的开源软件&#xff0c;今天就来介绍一下面向生产控制环节的开源软件&#xff0c;主要为可编程逻辑控制器&#xff08;PLC)、分布式控制系统&#xff08;DCS&#xff09;、生产执行系统&#xff08;MES&#xf…

人工智能(AI)的应用以及前景

当今世界正迎来人工智能技术的全面爆发&#xff0c;它在各个领域的应用已经展现出了巨大的潜力和优势。下面&#xff0c;我们来探讨一下人工智能在不同领域中的应用。 首先&#xff0c;人工智能在医疗领域中的应用已经逐渐成为了现实。医疗机构可以利用人工智能技术&#xff0…

Java学习(13)(异常的概念、异常的体系结构、异常的分类、异常的处理【防御式编程、异常的抛出、异常的捕获、异常的处理流程】、自定义异常类 )

接上次博客&#xff1a;Java学习&#xff08;12&#xff09;&#xff08;String类、String的查找方法、字符串转化、 替换、拆分、截取、trim方法、字符串的不可变性、StringBuilder和StringBuffer&#xff09;_di-Dora的博客-CSDN博客 目录 异常的概念 异常的体系结构 异常…

【Python基础知识点总结】

Python基础知识点总结 思维导图基础数据类型数据结构基础语法高级语法简单编程题工程项目类石头剪子布扑克发牌学生成绩管理系统 思维导图 基础数据类型 布尔(bool) True False字符(str) ‘hello Python’整型(int) -1,5,88浮点(float) -2.3,4.1 数据结构 字典 {“position”…

springboot+vue交流互动系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的交流互动系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&a…

Springmvc练习二

1、网站练习&#xff0c;先清楚原理&#xff0c;便于拓展 注意一点就是页面定位的问题&#xff0c;如果你springmvc文件没有配置加上后缀“.jsp”的设置记得在网站控制器源代码的基础上加上“.jsp” 2、简单尝试一下就知道&#xff0c;这里所谓的参数绑定无非就是在java代码的…

【ChatGPT】ChatGPT国内镜像网站集合

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 什么是ChatGPT镜像&#xff1f; 亲测&#xff1a; 一、二狗问答(AI对话) 二、AiDuTu 三、WOChat 四、ChatGPT(个人感觉最好用) 我们可以利用ChatGPT干什么&#xff1f; 一、三分…

Java EE 初阶---多线程(二)

目录 四、多线程案例之--单例模式 4.1 单例模式 4.2 怎么去设计一个单例&#xff1f; 饿汉模式 懒汉模式 4.3 两种模式的总结 四、多线程案例之--单例模式 4.1 单例模式 是校招中最常考的设计模式之一. 啥是设计模式&#xff1f; 设计模式好比象棋中的 " 棋谱 "…

MaterialDesignInXamlToolkit 初学项目实战(1)首页搭建

前言 最近在学WPF&#xff0c;由于人比较烂&#xff0c;有一个星期没怎么动代码了。感觉有点堕落。现在开始记录WPF项目&#xff0c;使用MaterialDesignInXamlToolkit。 环境搭建 如果没下载MaterialDesign 的源码 github源码运行 在Nuget里面引入MaterialDesign Materia…

【ChatGPT镜像网站+MindShow高效生成PPT,保姆级安装教程】

&#x1f680; AI破局先行者 &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#x1f3c6;&am…

一、基础算法9:区间合并 模板题+算法模板(区间合并)

文章目录 算法模板离散化题目模板 模板题区间和原题链接题目题解思路 算法模板 离散化题目模板 // 将所有存在交集的区间合并 void merge(vector<PII> &segs) {vector<PII> res;sort(segs.begin(), segs.end());int st -2e9, ed -2e9;for (auto seg : segs…

SD-MTSP:遗传算法GA求解单仓库多旅行商问题(提供MATLAB代码,可以修改旅行商个数及起点)

一、单仓库多旅行商问题 多旅行商问题&#xff08;Multiple Traveling Salesman Problem, MTSP&#xff09;是著名的旅行商问题&#xff08;Traveling Salesman Problem, TSP&#xff09;的延伸&#xff0c;多旅行商问题定义为&#xff1a;给定一个&#x1d45b;座城市的城市集…

SpringSecurity和Shiro---权限设置

在 Web 开发中&#xff0c;安全一直是非常重要的一个方面。安全虽然属于应用的非功能性需求&#xff0c;但是应该在应用开发的初期就考虑进来。如果在应用开发的后期才考虑安全的问题&#xff0c;就可能陷入一个两难的境地&#xff1a;一方面&#xff0c;应用存在严重的安全漏洞…