使用python绘制cdf的多种实现方法

 更新时间:2020年02月25日 16:28:37   作者:站在风口的骚人  
今天小编就为大家分享一篇使用python绘制cdf的多种实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

首先我们先用随机函数编造一个包含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)则可以看出不同的数据分布间的差异性,也可以观察到整个数据的增长趋势和波动情况。

上图是概率分布直方图,纵轴代表概率,如果置参数normed=False,纵轴代表频数

如果我们要观察两种数据分布的差异,可能使用直方图就不是很直观,各种直方柱会相互重叠,我们只需更改直方图的图像类型,令histtype=‘step',就会画出一条曲线来(Figure3,实际上就是将直方柱并在一起,除边界外颜色透明),类似于累积分布曲线。这时,我们就能很好地观察到不同数据分布曲线间的差异。

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)

这里我只给出了一个最原始的图像,直接用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()

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()

以上就是本人整理出来的关于画cdf直方图和曲线的三种方法,整理这方面东西的初忠是在发现在进行数据分析的时候,概率分布直方图只能观察到数据大概的分布情况,而在不同的数据样本进行比较时却很难直观滴反映其差异性,通过看论文发现cdf可以做到这一点。

本人并不是数学专业出身,想要表达其意义,但有些描述和用词不当,大家借鉴就好。希望大家多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Python MySQLdb Linux下安装笔记

    Python MySQLdb Linux下安装笔记

    这篇文章主要介绍了Python MySQLdb Linux下安装笔记,本文分别讲解了快速安装和手动编译安装两种方法,并分别讲解了操作步骤,需要的朋友可以参考下
    2015-05-05
  • python 获取本机ip地址的两个方法

    python 获取本机ip地址的两个方法

    用python 获取本机ip地址的多种方法,需要的朋友可以参考下
    2013-02-02
  • Python实现设置显示屏分辨率

    Python实现设置显示屏分辨率

    这篇文章主要为大家详细介绍了Python如何调用win32库实现分辨率获取和读写,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考下
    2023-01-01
  • python thread 并发且顺序运行示例

    python thread 并发且顺序运行示例

    以上源文件是对python中的线程的一个简单应用,实现了对并发线程的顺序运行,也许对你会有小小帮助
    2009-04-04
  • Python中的变量、运算符与流程控制

    Python中的变量、运算符与流程控制

    本文详细讲解了Python中的变量、运算符与流程控制,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • Python subprocess库六个实例快速掌握

    Python subprocess库六个实例快速掌握

    这次来说Python的第三方库subprocess库,在python2.4以上的版本commands模块被subprocess取代了。一般当我们在用Python写运维脚本时,需要履行一些Linux shell的命令,Python中subprocess模块就是专门用于调用Linux shell命令,并返回状态和结果,可以完美的解决这个问题
    2022-10-10
  • python装饰器property和setter用法

    python装饰器property和setter用法

    这篇文章主要介绍了python装饰器property和setter用法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • 对python中assert、isinstance的用法详解

    对python中assert、isinstance的用法详解

    今天小编就为的就分享一篇对python中assert、isinstance的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python数据结构之二叉树的建立实例

    python数据结构之二叉树的建立实例

    这篇文章主要介绍了python数据结构之二叉树的建立实例,采用了类似递归方式建立,需要的朋友可以参考下
    2014-04-04
  • python元组和字典的内建函数实例详解

    python元组和字典的内建函数实例详解

    这篇文章主要介绍了python元组和字典的内建函数,结合实例形式详细分析了Python元组和字典的各种常见内建函数功能与相关使用技巧,需要的朋友可以参考下
    2019-10-10

最新评论