Python实现高维高斯分布:随机数生成、概率密度函数、累积分布函数

  • 一、高斯分布随机数生成
  • 二、高斯概率密度函数
  • 三、高斯累积分布函数

不过多分类整理了,遇到什么问题,找到了解决方法,就随手写上来吧

也许大多数情况下,课题中我们用到2维的高斯分布就足够了,但可能会碰到要生成高维正态分布的情况。自己写又太麻烦,那么就需要依赖于Python强大且丰富的库了。

一、高斯分布随机数生成

这应该是最常见的需求了 。这里有两个Python库里的函数可供使用。

numpy.random.multivariate_normal() [官方文档]==
scipy.stats.multivariate_normal() [官方文档]

numpy函数的使用方法,在我之前的高斯函数介绍中,有比较详细的介绍
正态分布采样实现-链接

而 scipy中,需要在上述的基础上,再使用

  • rvs(mean=None, cov=1) Draw random samples from a multivariate normal distribution.

具体的使用方法为:

from scipy.stats import multivariate_normal
mask_convariance_maxtix = [[5, 0, 0],[0, 5, 0],[0, 0, 5]]       # 协方差矩阵,这里才出来的效果类似于一个球
center = np.array([13, 13, 13])
a = multivariate_normal.rvs(mean=center, cov=mask_convariance_maxtix, size=10)
print(a.shape)
print(a)

结果为:

(10, 3)
[[ 8.15261998 18.26086412 15.88518128][15.00379818 12.09684453 10.94093654][14.9469831  14.50985686 12.7224211 ][13.21464762  9.21787821 14.03641898][14.28698062  7.68165221 14.26271082][15.99104711 11.93828931 12.81829347][15.79749893  9.88532724 13.33877037][14.16506209 11.21256036 12.03738855][12.15025526 18.09718891 11.4358217 ][11.08669052 12.21070146 12.0328507 ]]

二、高斯概率密度函数

在某些情况下,可能要在加入高斯掩膜,那么如何在Python中生成呢?
scipy.stats.multivariate_normal()的官方文档中给我们四个函数或者叫实现方法:

  • pdf(x, mean=None, cov=1) Probability density function.
  • logpdf(x,mean=None, cov=1) Log of the probability density function.
  • rvs(mean=None, cov=1) Draw random samples from a multivariate normal distribution.
  • entropy() Compute the differential entropy of the multivariate normal.

随机采样 .rvs,已在上面介绍过了,这一部分要借助.pdf实现,logpdf是概率密度函数的对数形式。

假设,我要获得三个轴都是从0到27(左闭右开),共27×27×27个点的密度函数,如何做呢?代码如下:

from scipy.stats import multivariate_normal
from mayavi import mlabmask_convariance_maxtix = [[5, 0, 0],[0, 5, 0],[0, 0, 5]]       # 协方差矩阵,这里才出来的效果类似于一个球
center = np.array([13, 13, 13])pos = np.empty(shape=(27, 27, 27), dtype='float64')for i in range(27):for j in range(27):for t in range(27):pos[i, j, t] = multivariate_normal.pdf([i, j, t], mean=center, cov=mask_convariance_maxtix)mlab.pipeline.volume(mlab.pipeline.scalar_field(pos), name='guass sphere')
mlab.show()

生成的就是一个高斯密度球,如下图所示

之前,我一直看不懂官方文档,如何获取密度函数。但后来我发现,.pdf函数就是计算,在给定均值和协方差矩阵即确定具体的高斯分布后,在某个坐标点处的密度函数

三、高斯累积分布函数

学过高斯分布的童鞋,一定会知道这个概念吧,不再赘述。与.pdf的使用方法无太大区别,但在官方文档中好像没有提及,其实把.pdf改成.cdf就可以了
代码如下:

 from scipy.stats import multivariate_normal
from mayavi import mlabmask_convariance_maxtix = [[5, 0, 0],[0, 5, 0],[0, 0, 5]]       # 协方差矩阵,这里才出来的效果类似于一个球
center = np.array([13, 13, 13])pos = np.empty(shape=(27, 27, 27), dtype='float64')for i in range(27):for j in range(27):for t in range(27):pos[i, j, t] = multivariate_normal.cdf([i, j, t], mean=center, cov=mask_convariance_maxtix)mlab.pipeline.volume(mlab.pipeline.scalar_field(pos), name='guass sphere')
mlab.show()


可以看到,在坐标最大的地方,累积分布概率越大。

项目中涉及到的Python小技巧(3)—— 高维高斯分布相关推荐

  1. python中template是什么意思啊_Python中Template使用的一个小技巧

    Python中Template是string中的一个类,可以将字符串的格式固定下来,重复利用. from string import Template s = Template("there ...

  2. 不藏了!分享100个Python小技巧!!

    目前Python可以说是非常流行,在目前的编程语言中,Python的抽象程度是最高的,是最接近自然语言的,很容易上手. 你可以用它来完成很多任务,比如数据科学.机器学习.Web开发.脚本编写.自动化等 ...

  3. 【推荐】五个实用的Python小技巧

    当我们开始学习Python时,可能需要一段时间来学习一些技巧和窍门,但是掌握这些技巧可以使得我们的编程生活更加轻松.在本文中,我们将探索一些可以在Python中使用的技巧.喜欢本文记得收藏.点赞.关注 ...

  4. 收藏喜+1!值得使用的100个Python小技巧

    目前Python可以说是非常流行,在目前的编程语言中,Python的抽象程度是最高的,是最接近自然语言的,很容易上手. 你可以用它来完成很多任务,比如数据科学.机器学习.Web开发.脚本编写.自动化等 ...

  5. 快收藏!整理了 100 个 Python 小技巧

    作者:小F 来源: 法纳斯特 目前Python可以说是非常流行,在目前的编程语言中,Python的抽象程度是最高的,是最接近自然语言的,很容易上手. 你可以用它来完成很多任务,比如数据科学.机器学习. ...

  6. python hist函数_虎哥的python小技巧放送之绘制统计图(2)

    先放出第一期让大家回顾一下上次的内容 虎哥的python小技巧放送之绘制统计图(1) 第一期主要给大家讲了一些图形设置的东西.这一次开始正式带大家画图~ 折线图:折线图可以通过matplotlib中的 ...

  7. 3分钟学会python_3分钟学会一个Python小技巧

    Python时间日期转换在开发中是非常高频的一个操作,你经常会遇到需要将字符串转换成 datetime 或者是反过来将 datetime 转换成字符串. datetime 分别提供了两个方法 strp ...

  8. 一些你可能不知道的 Python 小技巧!

    [CSDN 编者按]Python 风头正盛,未来一段时间内想必也会是热门编程语言之一.因此,熟练掌握 Python 对开发者来说极其重要,说不定能给作为开发者的你带来意想不到的财富. 作者 | Seb ...

  9. Java 中代码优化的 30 个小技巧(中)

    11 位运算效率更高 如果你读过 JDK 的源码,比如 ThreadLocal.HashMap 等类,你就会发现,它们的底层都用了位运算. 为什么开发 JDK 的大神们,都喜欢用位运算? 答:因为位运 ...

最新文章

  1. JDK 序列化, 碰到serialVersionUID 不一致问题,怎么处理?
  2. Lua date format
  3. MNE-Python专辑 (2) MNE中数据结构Raw及其用法简介(更新)
  4. 高精度人脸表情识别 开源代码
  5. Quartz-JobListener解读
  6. Asp.Net上传组件
  7. stm32 定时器_如何计算STM32定时器、独立看门狗和窗口看门狗
  8. filter my task = true implementation logic
  9. LINQ to SQL语句(1)之Where
  10. h5外卖源码php_从零搭建外卖CPS平台小程序开发
  11. [转]jQuery: how to get which button was clicked upon form submission?
  12. 如何利用OUTLOOK提高你的工作效率
  13. windows 7 help 帮助文件无法打开的解决
  14. java邮箱和手机发送链接和验证码_java发送邮箱验证码
  15. 我的第一个游戏FoodieThebug完成之后的心得体会 -子龙山人
  16. java实现T检验(Ttest)
  17. XP系统清理优化工具箱
  18. ThingWorx入门
  19. 测试案例中@SpringBootTest与@RunWith**的含义
  20. 金融风控项目-# 相关业务介绍

热门文章

  1. 干货!毫米波雷达超强解读
  2. power bi 如何构建不同年份的月度对比_数据中台构建拥有一站式数据应用平台的三种捷径...
  3. 如何将word中的表格转化为excel中?
  4. Unity 音频理解与优化
  5. 基于MFC的医院门诊系统设计与实现
  6. ​力扣解法汇总522-最长特殊序列 II
  7. Go 语言的 13 年
  8. 很腻害的视频,回味百遍
  9. Scheduling restart of crashed service
  10. VUE课堂笔记1-课前准备