使用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实现监控程序执行时间并将其写入日志的方法
Jun 30 Python
Python 多线程的实例详解
Sep 07 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
Apr 23 Python
python 计算平均平方误差(MSE)的实例
Jun 29 Python
Django中使用CORS实现跨域请求过程解析
Aug 05 Python
基于django传递数据到后端的例子
Aug 16 Python
Python csv文件的读写操作实例详解
Nov 19 Python
解决python web项目意外关闭,但占用端口的问题
Dec 17 Python
春节到了 教你使用python来抢票回家
Jan 06 Python
Python使用enumerate获取迭代元素下标
Feb 03 Python
python学习将数据写入文件并保存方法
Jun 07 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
Jul 18 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+mysqli实现批量执行插入、更新及删除数据的方法
2015/01/29 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
功能强大的PHP发邮件类
2016/08/29 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
python基于socket实现网络广播的方法
2015/04/29 Python
python中执行shell的两种方法总结
2017/01/10 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
python实现验证码识别功能
2018/06/07 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
在 Python 中接管键盘中断信号的实现方法
2020/02/04 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
python开发前景如何
2020/06/11 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
学习十八大坚定理想信念心得体会
2014/03/11 职场文书
工作保证书范文
2014/04/29 职场文书
介绍信范文
2015/01/31 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android
IDEA中sout快捷键无效问题的解决方法
2022/07/23 Java/Android