常数除以正态分布随机变量 2021-04-11 笔记,实验 暂无评论 1339 次阅读 ## 问题 **背景** 有一个计算任务,需要运行$$w$$条机器指令。 有一个设备,每秒钟能执行$$c$$条机器指令。 让设备执行计算任务,执行时间$$t=\frac{w}{c}$$秒。 **问题** 已知$$w$$是一个正数,$$c$$是服从正态分布$$N(\mu,\sigma)$$的随机变量。求$$t=\frac{w}{c}$$的概率密度函数。 ## 解 **1.**已知$$c$$服从正态分布,所以$$c$$概率密度函数为:$$f(c) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(c-\mu)^2}{2\sigma^2}} $$ **2.**设$$t$$的概率密度函数$$g(t)$$,有:$$g(t)|dt|=f(c)|dc|$$ 或者:$$g(t)=f(c)|\frac{dc}{dt}| $$ > 理论来源:[Schaum-'s Outline of Probability and Statistics, Third Edition 2009.pdf](https://www.proup.club/usr/uploads/2021/04/1698756951.pdf) 的Theorem 2-3 ![微信截图_20210411195243.png](https://www.proup.club/usr/uploads/2021/04/3476607717.png) 参考:[标准正态分布随机变量的倒数的分布](https://blog.csdn.net/stereohomology/article/details/46648715) **3.**对$$t=\frac{w}{c}$$做个变化:$$t=\frac{w}{c} \rightarrow c=\frac{w}{t}$$ 然后求导:$$\frac{dc}{dt}=\frac{d\frac{w}{t}}{dt}=-\frac{w}{t^2}$$ 因为已知$$w$$是正数,所以:$$|\frac{dc}{dt}|=|-\frac{w}{t^2}|=\frac{w}{t^2}$$ **4.**最后把$$c=\frac{w}{t}$$和$$|\frac{dc}{dt}|=\frac{w}{t^2}$$带进去,最终得到$$t$$的概率密度函数: $$g(t)=f(c)|\frac{dc}{dt}|=f(\frac{w}{t})\frac{w}{t^2} $$ --------------- ## Python仿真 参数设置: $$w=600$$ $$c\sim N(60,10)$$ 用100000个正态分布的随机点,来模拟$$c$$的取值,得到$$c$$的直方图(左)。 用100000个模拟的$$c$$,分别计算其对应的$$t$$,得到$$t$$的直方图(右)。 橙色的曲线,是概率密度函数。可以看到,概率密度曲线与随机点的分布是吻合的。 ![](https://www.proup.club/usr/uploads/2021/04/847408954.png) ```python import matplotlib.pyplot as plt import numpy as np import pylab as mpl #mpl.rcParams['font.sans-serif'] = ['FangSong'] # 设置字体为 FangSong mpl.rcParams['font.sans-serif'] = ['Microsoft Yahei'] # 设置字体为 Microsoft Yahei mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题 mpl.rcParams['font.size'] = 16 # 字体大小 def plot_hist(data,bins=100): """离散的概率分布直方图""" counts, bins = np.histogram(data,bins=bins,density=False) plt.hist(bins[:-1], bins, weights=counts/data.size) def normfun(x, mu, sigma): """n服从正态分布N(mu,sigma),返回n取到x的概率""" return np.exp(-((x - mu)**2)/(2*sigma**2)) / (sigma * np.sqrt(2*np.pi)) def normfun2(x,w, mu, sigma): """n服从正态分布N(mu,sigma),返回w/n取到x的概率""" return w/(x**2)*np.exp(-((w/x - mu)**2)/(2*sigma**2)) / (sigma * np.sqrt(2*np.pi)) """ 超参数 BINS 将连续区间离散化,要分割成多少段(默认:100) """ BINS = 70 def simulation( mu : float , # 设备CPU计算能力的期望值 sigma : float , # 设备CPU计算能力的方差 size : int , # 生成随机正态分布点的个数 workload : float , # 任务的计算量 ): # 第一幅图 plt.figure(figsize=(14,5)) plt.subplot(1,2,1) result = np.random.normal(mu,sigma,size) plot_hist(result,BINS) x=np.linspace(min(result), max(result),BINS) print(f"CPU计算能力: 均值={result.mean():.3f},方差={result.std():.3f},最大值={max(result):.3f},最小值={min(result):.3f}") y = normfun(x, result.mean(), result.std()) plt.plot(x, y/y.sum()) plt.title('CPU计算能力的概率分布') plt.xlabel('CPU计算能力') plt.ylabel('概率') # 第二幅图 plt.subplot(1,2,2) result2 = workload / result plot_hist(result2,BINS) print(f"任务量={workload}\n最慢完成时间={max(result2):.3f}\n最快完成时间={min(result2):.3f}") x=np.linspace(min(result2), max(result2),BINS+1)[:-1] y = normfun2(x,workload, mu, sigma) plt.plot(x, y/y.sum()) plt.title(f'执行时间的概率分布(任务的计算量w={workload})') plt.xlabel('执行时间') plt.ylabel('概率') plt.show() simulation( mu = 60 , # 设备CPU计算能力的期望值 sigma = 10 , # 设备CPU计算能力的方差 size = 100000 , # 生成随机正态分布点的个数 workload = 600, # 任务的计算量 ) ``` 标签: none 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭