使用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通过定义一个类实例作为ftp回调方法
May 04 Python
Python浅拷贝与深拷贝用法实例
May 09 Python
Python中绑定与未绑定的类方法用法分析
Apr 29 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
May 24 Python
在Python中调用Ping命令,批量IP的方法
Jan 26 Python
Python socket模块实现的udp通信功能示例
Apr 10 Python
Kali Linux安装ipython2 和 ipython3的方法
Jul 11 Python
python中的Elasticsearch操作汇总
Oct 30 Python
Python 实现Serial 与STM32J进行串口通讯
Dec 18 Python
解决pytorch 模型复制的一些问题
Mar 03 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
May 28 Python
Python实现打乒乓小游戏
Sep 25 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制作简单的内容采集器的代码
2007/11/28 PHP
php max_execution_time执行时间问题
2011/07/17 PHP
php文件操作实例代码
2012/05/10 PHP
浅谈php扩展imagick
2014/06/02 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
PHP图片处理之图片旋转和图片翻转实例
2014/11/19 PHP
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
2015/01/02 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
Django中对数据查询结果进行排序的方法
2015/07/17 Python
python实现斐波那契数列的方法示例
2017/01/12 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
Python读取csv文件分隔符设置方法
2019/01/14 Python
Python中的元组介绍
2019/01/28 Python
Python3多线程基础知识点
2019/02/19 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
python求质数列表的例子
2019/11/24 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
求网格中的黑点分布
2013/11/06 面试题
为什么要做架构设计
2015/07/08 面试题
职称评定个人总结
2015/03/05 职场文书
升学宴祝酒词
2015/08/11 职场文书
大学自主招生自荐信(2016精选篇)
2016/01/28 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL