密度分析(七) Python实现

密度分析(七) Python实现

R语言的核密度渲染弄完了,今天来看看Python的核密度。本来没准备些Python,但是今天在玩seaborn包的时候,发现了强大的kedplot这样一样工具,让虾神我惊为天人,不写感觉都对不起这个方法。

在讲python的核密度分析工具工具之前,前置条件是先说说seaborn包,这个包是matplotlib的扩展包,基本是在matplotlib上继承开发的,所以大家要用seaborn,就必须要安装了全套的matplotlib环境。安装过程大家可以自己去找找。

个人推荐,要安装的包如下:numpy、sicpy、pandas、matplotlib、seaborn
安装过程可以考虑使用pip。

seaborn的官网如下:
http://seaborn.pydata.org/index.html

seaborn的kdeplot工具,最大的特点是可选参数很多,他支持六种核密度方法和多种带宽模式,如下:
六种核:

  • gau (Gaussian)
  • cos(Cosine)
  • biw(Quartic(biweight))
  • epa(Epanechnikov)
  • tri (Tricube)
  • triw (Triweight)


不同的核,对应的核表面函数是不一样的,以下两个图表来源于wikipedia,原始地址如下:(当然,这里面更多,但是比较有代表性的6种,都包含进去了)

https://en.wikipedia.org/wiki/Kernel_(statistics)

下面我用美国人口分布数据,来对它支持的六种核函数进行密度分析,结果如下:

好吧,从二维平面上来看完的,他们几乎是完全没有区别的(区别相当细微,垂直看下去,几乎可以忽略不计),但是如果平铺开来,比如我就用纬度进行密度分析,就可以看出不同来了,如下:

总体来说,高斯核讲究的是平滑,tri (Tricube)最为尖锐,在ArcGIS里面,使用的是eqa(Epanechnikov:抛物面核或者叫做二次核函数)。当然,如果不是做专业、深入的分析和理论研究,仅用核密度做定性分析的话,任何一种核函数,在使用意义上都是一样的。

然后是核密度第二个关键参数:带宽(或者叫做窗口宽度,意义见以前的文章)。

seaborn的kdeplot支持四类核密度带方法,分别是:

  • scott (斯考特带宽法)
  • silverman (西尔弗曼带宽法)
  • scalar (标量带宽法)
  • pair of scalars (标量对带宽法)


对以上几个带宽法做一个简单解释,更详细的资料大家请自行查阅相关文档:

1、scott带宽估计法:这是一种不进行自定义带宽的核带宽估计方法,最早在1979年由美国莱斯大学(莱斯大学 Rice University)的David W. Scott提出,是一种基于最优直方图的估计算法。

2、silverman 带宽估计法:这是一种基于经验法则的带宽估计方法。最早在1986年由美国巴斯大学(university of bath )的B W Silverman教授提出。

以上两种方法均不用我们自定义核带宽,也就是说,完全可以视为默认值。

3、scalar:自定义标量,这个方法与我们前面文章写的所有方法一样,自己去定义各种带宽,可以从不同的研究尺度去进行观察。

4、pair of scalars :这种方法没有研究出结果来……谁有兴趣可以继续研究。

然后结果如下:

最后贴出seaborn种kdeplot方法的api:
原始地址:
http://seaborn.pydata.org/generated/seaborn.kdeplot.html#seaborn.kdeplot

关键参数说明如下:
seaborn.kdeplot(data, data2=None, shade=False, vertical=False, kernel=’gau’, bw=’scott’, gridsize=100, cut=3, clip=None, legend=True, cumulative=False, shade_lowest=True, ax=None, **kwargs)

date、date2都是输入输入,如果两个数据都在,就行双变量的核密度(即二维核密度,如果只有一个数据,就是一维核密度)。
shade: 是否进行填充,如果为False,那么就表示进行核密度线表示,如下:

vertical:表示以X轴进行绘制还是以Y轴进行绘制,如下:

?kernel和bw就不解释了,看前面的内容。

gridsize:这里这个参数与ArcGIS里面的cellsize以及R语言里面的gridsize都不一样,这个参数指的是每个格网里面,应该包含多少个点,越大,表示格网里面的点越多,越小表示格网里面的点越少(看作cellsize的反义词就好了,也就是越大越平滑)如下:

cumulative :是否绘制累积分布,如下:

shade_lowest : 是否有最低值渲染,这个参数只有在二维密度图上才有效,结果如下:

clip:表示查看部分结果,如下:图1只查看-100至-100区间内的数据:

cut参数表示,绘制的时候,切除带宽往数轴极限数值的多少,这个参数可以配合bw参数使用,如下:

还有其他的参数,比如颜色,比如图例啥的,大家自行查阅matplotlib的参数,不在赘述。



转载自:https://blog.csdn.net/allenlu2008/article/details/53692154

You may also like...

跳至工具栏