使用python绘制cdf的多种实现方法


Posted in Python onFebruary 25, 2020

首先我们先用随机函数编造一个包含1000个数值的一维numpy数组,如下:

// An highlighted block
rng = np.random.RandomState(seed=12345)
samples = stats.norm.rvs(size=1000, random_state=rng)

接下来我们将使用各种方法画出以上数据的累积分布图

1、matplotlib.pyplot.hist()

def hist(self, x, bins=None, range=None, density=None, weights=None,
       cumulative=False, bottom=None, histtype='bar', align='mid',
       orientation='vertical', rwidth=None, log=False,
       color=None, label=None, stacked=False, normed=None,
       **kwargs):

第一种方法,我们使用matplotlib图形库中的hist函数,熟悉该库的人应该知道这是一个直方图绘制函数,以上是从API中找到的hist函数的所有参数,我们给出一维数组或者列表x,使用hist画出该数据的直方图。

直方图有两种形式,分别是概率分布直方图和累积分布直方图(可能说的不准确- -!),可以通过参数cucumulative来调节,默认为False,画出的是PDF,那么True画出的便是CDF直方图。

PDF(figure1)可以观察到整个数据在横轴范围内的分布,CDF(figure2)则可以看出不同的数据分布间的差异性,也可以观察到整个数据的增长趋势和波动情况。

使用python绘制cdf的多种实现方法

上图是概率分布直方图,纵轴代表概率,如果置参数normed=False,纵轴代表频数

使用python绘制cdf的多种实现方法

如果我们要观察两种数据分布的差异,可能使用直方图就不是很直观,各种直方柱会相互重叠,我们只需更改直方图的图像类型,令histtype=‘step',就会画出一条曲线来(Figure3,实际上就是将直方柱并在一起,除边界外颜色透明),类似于累积分布曲线。这时,我们就能很好地观察到不同数据分布曲线间的差异。

使用python绘制cdf的多种实现方法

2、numpy.histogram

def histogram(a, bins=10, range=None, normed=False, weights=None,
     density=None)

第二种方法我们使用numpy中画直方图的函数histogram,该函数不是一个直接的绘图函数(废话- -!过渡句,哈哈),给定一组数据a,它会返回两个数组hist和bin_edges,默认情况下hist是数据在各个区间上的频率,bin_edges是划分的各个区间的边界,说到这我们大概可以想到其实该函数算是上一个函数的底层函数,我们可以依据得到的这两个数组来画直方图,我们也可以用频率数组来直接画分布曲线(Figure4)

使用python绘制cdf的多种实现方法

这里我只给出了一个最原始的图像,直接用hist数组画的,如果想要变成合格的累积分布曲线图,纵轴为概率(频率乘区间长度),横轴为区间(从bin_edges数组中取n-1个)就可以了

3、stats.relfreq

def relfreq(a, numbins=10, defaultreallimits=None, weights=None)
Returns
-------
frequency : ndarray
  Binned values of relative frequency.
lowerlimit : float
  Lower real limit
binsize : float
  Width of each bin.
extrapoints : int
  Extra points.

第三种方法我们使用stats中的relfreq函数,该函数和第二种的方法类似,也并非是直接画图,而是返回关于直方图的一些数据,这里的frequency直接是概率而非频率,可以直接作为CDF图的纵轴,但是横轴需要自己计算,计算公式:

res.lowerlimit + np.linspace(0,res.binsize*res.frequency.size, res.frequency.size)

这个公式应该很好理解,我就不多说了,当然这些返回值都要依赖我们所给出的bins的数目。下面我给出一段代码,便是使用stats.relfreq画出概率分布直方图和累积分布曲线图。

rng = np.random.RandomState(seed=12345)
samples = stats.norm.rvs(size=1000, random_state=rng)
res = stats.relfreq(samples, numbins=25)
x = res.lowerlimit + np.linspace(0, res.binsize*res.frequency.size,res.frequency.size)
fig = plt.figure(figsize=(5, 4))
ax = fig.add_subplot(1, 1, 1)
ax.bar(x, res.frequency, width=res.binsize)
ax.set_title('Relative frequency histogram')
ax.set_xlim([x.min(), x.max()])
plt.show()

使用python绘制cdf的多种实现方法

rng = np.random.RandomState(seed=12345)
samples = stats.norm.rvs(size=1000, random_state=rng)
res = stats.relfreq(samples, numbins=25)
x = res.lowerlimit + np.linspace(0, res.binsize*res.frequency.size,res.frequency.size)
y=np.cumsum(res.frequency)
plt.plot(x,y)
plt.title('Figure6 累积分布直方图')
plt.show()

使用python绘制cdf的多种实现方法

以上就是本人整理出来的关于画cdf直方图和曲线的三种方法,整理这方面东西的初忠是在发现在进行数据分析的时候,概率分布直方图只能观察到数据大概的分布情况,而在不同的数据样本进行比较时却很难直观滴反映其差异性,通过看论文发现cdf可以做到这一点。

本人并不是数学专业出身,想要表达其意义,但有些描述和用词不当,大家借鉴就好。希望大家多多支持三水点靠木!

Python 相关文章推荐
Python bsddb模块操作Berkeley DB数据库介绍
Apr 08 Python
由浅入深讲解python中的yield与generator
Apr 05 Python
对python中的for循环和range内置函数详解
Apr 17 Python
对python中使用requests模块参数编码的不同处理方法
May 18 Python
python去除文件中重复的行实例
Jun 29 Python
python 函数内部修改外部变量的方法
Dec 18 Python
python issubclass 和 isinstance函数
Jul 25 Python
python scrapy重复执行实现代码详解
Dec 28 Python
CentOS7下安装python3.6.8的教程详解
Jan 03 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
Python tornado上传文件的功能
Mar 26 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 #Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
Feb 25 #Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
Feb 25 #Python
python模拟点击网页按钮实现方法
Feb 25 #Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 #Python
python 计算概率密度、累计分布、逆函数的例子
Feb 25 #Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 #Python
You might like
PHP编程过程中需要了解的this,self,parent的区别
2009/12/30 PHP
PHP四舍五入、取整、round函数使用示例
2015/02/06 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
jquery 获取json数据实现代码
2009/04/27 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
javascript定时器完整实例
2015/02/10 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
深入理解逻辑表达式的用法 与或非的用法
2016/06/06 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
JS执行控制之节流模式实例分析
2018/12/21 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
Python3写入文件常用方法实例分析
2015/05/22 Python
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
python实现飞机大战游戏
2020/10/26 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
2020/06/01 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
介绍一下常见的木马种类
2014/11/15 面试题
活动总结怎么写啊
2014/05/07 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
一个都不能少观后感
2015/06/04 职场文书
AJAX学习笔记
2021/05/18 Javascript