使用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中几种操作字符串的方法的介绍
Apr 09 Python
在Python的Flask框架下收发电子邮件的教程
Apr 21 Python
python判断一个集合是否为另一个集合的子集方法
May 04 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
Jun 25 Python
pytorch中的transforms模块实例详解
Dec 31 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 Python
浅析matlab中imadjust函数
Feb 27 Python
Python序列化pickle模块使用详解
Mar 05 Python
Python Switch Case三种实现方法代码实例
Jun 18 Python
解决Pytorch半精度浮点型网络训练的问题
May 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
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
JavaScript this调用规则说明
2010/03/08 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
解析JavaScript的ES6版本中的解构赋值
2015/07/28 Javascript
jQuery简单获取键盘事件的方法
2016/01/22 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
Vue组件开发技巧总结
2018/03/04 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
一步步解析Python斗牛游戏的概率
2016/02/12 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
解决python 虚拟环境删除包无法加载的问题
2020/07/13 Python
10个示例带你掌握python中的元组
2020/11/23 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
德国排名第一的主题公园门票网站:Attraction Tickets Direct
2019/09/09 全球购物
创业计划书如何编写
2014/02/06 职场文书
机关单位动员会主持词
2014/03/20 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
解除劳动合同证明书
2014/09/26 职场文书
2015年爱牙日活动总结
2015/03/23 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
如何用python插入独创性声明
2021/03/31 Python