使用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 urlopen 使用小示例
Sep 06 Python
python连接mysql并提交mysql事务示例
Mar 05 Python
Python实现的HTTP并发测试完整示例
Apr 23 Python
Python如何通过subprocess调用adb命令详解
Aug 27 Python
python3 pillow生成简单验证码图片的示例
Sep 19 Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
numpy.std() 计算矩阵标准差的方法
Jul 11 Python
flask中过滤器的使用详解
Aug 01 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 Python
基于python实现把图片转换成素描
Nov 13 Python
Django高并发负载均衡实现原理详解
Apr 04 Python
python re模块和正则表达式
Mar 24 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
main.php
2006/12/09 PHP
php对gzip文件或者字符串解压实例参考
2008/07/25 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
2015/12/18 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
JS之获取样式的简单实现方法(推荐)
2016/09/13 Javascript
docker中编译nodejs并使用nginx启动
2017/06/23 NodeJs
react-native android状态栏的实现
2018/06/15 Javascript
深入理解Vue router的部分高级用法
2018/08/15 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
2018/09/25 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
[46:32]Fnatic vs OG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[51:06]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第二场 1月26日
2021/03/11 DOTA
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
利用Python读取文件的四种不同方法比对
2017/05/18 Python
Python实现的端口扫描功能示例
2018/04/08 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
建筑工程技术应届生自荐信
2013/09/27 职场文书
高中生自我鉴定范文
2013/10/30 职场文书
幼儿园教师奖惩制度
2014/02/01 职场文书
《东方明珠》教学反思
2014/04/20 职场文书
服务承诺口号
2014/05/22 职场文书
运动会口号大全
2014/06/07 职场文书
简单的离婚协议书范本
2014/11/16 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书