使用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 MD5文件生成码
Jan 12 Python
python cookielib 登录人人网的实现代码
Dec 19 Python
使用Python发送邮件附件以定时备份MySQL的教程
Apr 25 Python
python统计文本文件内单词数量的方法
May 30 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
Apr 01 Python
Python-copy()与deepcopy()区别详解
Jul 12 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
Sep 24 Python
python空元组在all中返回结果详解
Dec 15 Python
python绘制高斯曲线
Feb 19 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 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
YII模块实现绑定二级域名的方法
2014/07/09 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
tensorflow常用函数API介绍
2020/04/19 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
2020/06/11 Python
浅析Python中字符串的intern机制
2020/10/03 Python
用Python自动清理系统垃圾的实现
2021/01/18 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
经济学人订阅:The Economist
2018/07/19 全球购物
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
运动会通讯稿600字
2015/07/20 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis