上一篇笔者以自己编写代码的方式实现了重心法下的系统聚类(又称层次聚类)算法,通过与Scipy和R中各自自带的系统聚类方法进行比较,显然这些权威的快捷方法更为高效,那么本篇就系统地介绍一下Python与R各自的系统聚类算法;

Python

cluster是Scipy中专门用来做聚类的包,其中包括cluster.vq矢量量化包,里面封装了k-means方法,还包括cluster.hierarchy,里面封装了层次聚类和凝聚聚类的方法,本文只介绍后者中的层级聚类方法,即系统聚类方法,先从一个简单的小例子出发:

import scipy
import scipy.cluster.hierarchy as sch
import matplotlib.pylab as plt
import numpy as np price = [1.1,1.2,1.3,1.4,10,11,20,21,33,34]
increase = [1 for i in range(10)]
X = np.array([price,increase],dtype='float32')
X = X.T#这里必须使得输入的矩阵行代表样本,列代表维度 d = sch.distance.pdist(X)#计算样本距离矩阵 Z = sch.linkage(d, method='complete')#进行层级聚类,这里complete代表层级聚类中的最长距离法 sch.dendrogram(Z)#显示树状聚类图

生成的树状聚类图如下:

sch.distance.pdist(X,'method'):计算样本的距离阵,默认使用'euclidean',即欧氏距离法来计算距离,常用的其他可选择的距离计算方法有:'minkowski',即使用明氏距离法,若使用该方法,需额外添加参数p=n,其中n为范数的方式,取2时即为欧氏距离法;'cityblock',曼哈顿距离,即出租车距离,是一种衡量特殊距离的方法,计算的是数据对应坐标的直接差距而不进行范数处理;'seuclidean',计算标准化后的欧氏距离,具体计算方法参照帮助手册;'sqeuclidean',计算平方后的欧氏距离;'cosine',计算变量间的余弦距离,这在R型聚类中经常使用;'correlation',计算变量间的相关距离,这也是R型聚类中经常使用的;'chebyshev',计算切比雪夫距离;'mahalanobis',计算马氏距离,这是系统聚类中常用的方法,它的优点是即排除了各指标间的相关性干扰,又消除了各指标的量纲。以上就是常用的距离计算方式,而涉及到dice距离等特殊聚类(如文本聚类)的以后会单独解释。

sch.linkage(y,method='',metric='',optimal_ordering=False):系统聚类过程的实际操作函数,其中y为经sch.distance.pdist()计算出的样本间距离矩阵,method为聚类过程中类与类间距离的计算方法,分别有'single'最短距离法,'complete'最长距离法,'average'类平均法,'centroid'重心法,'median'中位数法,'ward'离差平方和法等,具体使用什么方法需要视具体问题而定;

sch.dendrogram(X,labels):根据上述函数生成的系统聚类过程绘制树状聚类图,X为sch.linkage()计算出的系统聚类过程的相关数据,labels为所有样本未分类前的名称,是一个ndarry型数据,下面基于上面的小例子做一些参数的改变:

name = np.array([chr(i) for i in range(65,75)])#定义样本名称标签
sch.dendrogram(Z,labels=name)#显示树状聚类图
plt.title('Cluster')

R

在R中进行系统聚类是一种享受,因为其专为统计而生的性质,像这种常规的聚类算法是其自带的,下面介绍在R中进行系统聚类需要的函数:

dist():用来计算样本间距离矩阵,返回值是R中一种'dist'格式的数据结构,即去除对角和下三角元素后的样本间距离矩阵,其第一个输入值为要计算的样本矩阵,样本X变量形式的矩阵或数据框;另一个常用的参数method用来设置计算距离的方式,包括'euclidean'欧氏距离,'maximum'切比雪夫距离,'manhattan'曼哈顿距离(绝对值距离),'canberra'兰氏距离

hclust():用来进行系统聚类的函数,主要输入值有dist形式的样本距离矩阵,类间距离计算方式method,包括了'single'最短距离法,'complete'最长距离法,'average'类平均法,'median'中间距离法,'centroid'重心法,'ward'离差平方和法

而在实际的Q型系统聚类中,变量间存在相关性是很常见的情况,这种时候我们就需要用到马氏距离,很遗憾的是R中计算马氏距离的函数挺傻逼的,并且存在很多不必要的参数需要设定,因此笔者自己根据马氏距离的定义式:[(x-μ)'Σ^(-1)(x-μ)]^(1/2)

通过R中的自建函数编写了一个计算马氏距离dist数据的方便灵活的函数如下以供大家参考:

#自定义马氏距离矩阵计算函数
MS <- function(input){
l <- length(input[,1])
ms <- matrix(0,nrow=l,ncol=l)
cov <- cov(input)
for(i in 1:l){
for(j in 1:l){
ms[i,j] = t(input[i,]-input[j,])%*%solve(cov)%*%(input[i,]-input[j,])
}
}
return(as.dist(ms))
}

其中输入变量为样本矩阵(样本为行,变量为列),输出的结果为dist数据,可直接在hclust()里使用MS(input)来进行聚类。

在通过hclust()完成系统聚类并保存在变量中,只需要用plot()绘制该变量即可画出树状聚类图。

(数据科学学习手札09)系统聚类算法Python与R的比较的更多相关文章

  1. (数据科学学习手札135)tenacity:Python中最强大的错误重试库

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在编写程序尤其是与网络请求相关的程序, ...

  2. (数据科学学习手札101)funcy:Python中的函数式编程百宝箱

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在使用Python完成日常任务时,经常会遇到 ...

  3. (数据科学学习手札137)orjson:Python中最好用的json库

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,我们在日常使用Pytho ...

  4. (数据科学学习手札142)dill:Python中增强版的pickle

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,相信不少读者朋友们都在Pyth ...

  5. (数据科学学习手札42)folium进阶内容介绍

    一.简介 在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些 ...

  6. (数据科学学习手札36)tensorflow实现MLP

    一.简介 我们在前面的数据科学学习手札34中也介绍过,作为最典型的神经网络,多层感知机(MLP)结构简单且规则,并且在隐层设计的足够完善时,可以拟合任意连续函数,而除了利用前面介绍的sklearn.n ...

  7. (数据科学学习手札75)基于geopandas的空间数据分析——坐标参考系篇

    本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中我们对geopandas中的数据结 ...

  8. (数据科学学习手札55)利用ggthemr来美化ggplot2图像

    一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...

  9. (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)

    一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...

随机推荐

  1. nginx配置+uwsgi+负载均衡配置

    nginx静态文件配置 location /static{ alias /var/www/myApp/static; } sudo mkdir -vp /var/www/myApp/static/ s ...

  2. HCNA-RIP定时器

    1.拓扑图 2. 1.RIP有哪些定时器?三种:更新定时器.老化定时器.垃圾回收定时器 2.RIP的定时器有哪些作用?更新定时器(30s):运行RIP的路由器会以30s为周期,向邻居发送RIP路由.老 ...

  3. adb工具包使用方法

    ADB工具包总共有四个文件,两个exe后缀,两个dll后缀.里面还带有fastboot.exe下载后在PC上安装,如安装到D:\adb_tools-2.0目录,确认目录中带有fastboot.exe文 ...

  4. 一、Python安装下载

    下载地址:https://www.python.org/downloads/ 因为Python3.X和2.X有部分不兼容,有些不向下兼容,现在3.5的资料和插件少,故我就学习的2.7.11了; 下载后 ...

  5. 为什么A经理的团队总是会陷入加班与救火之中

    最近在看一本名为<稀缺>的书,作者从行为经济学的角度解释了穷人为什么会更穷,忙碌的人越来越没有时间,节食的人总是失败.由于缺乏闲余导致的带宽负担会进一步导致稀缺,由于总是优先处理紧急的事情 ...

  6. Git 还没push 前可以做的事(转)

    Git 版本控制系統(3) 還沒 push 前可以做的事 转载:http://ihower.tw/blog/archives/2622   這一集要講的是:還沒 push 前可以做的壞事,也就是 re ...

  7. Android(java)学习笔记21:Java异常处理机制

    1. try....catch  /  try...catch...finally package cn.itcast_02; /* * 我们自己如何处理异常呢? * A:try...catch... ...

  8. Node.js使用MySQL数据库中对RowDataPacket对象的使用

    使用Node.js开发使用MySQL数据库的网站,在查询后返回一RowDataPacket类型的对象 原先使用toString()方法一直得到仅为object的字符串,无法使用 后思考,才发现忽略了其 ...

  9. 2018.12.30 Intellij IDEA设置main方法自动补全

    Eclipse与 Intellij IDEA设置方法自动补全 1.首先,点击File-->Settings-->Editor-->Live Templates 设置你想输出的模板 右 ...

  10. JS动态修改微信浏览器中的title

    JS动态修改微信浏览器中的title我们的原理是设置一个ifame然后我们再加载一下就可以实现了,具体的例子如下所示. 平时使用JS修改title,直接document.title=新标题就好了 这样 ...