(数据科学学习手札09)系统聚类算法Python与R的比较
上一篇笔者以自己编写代码的方式实现了重心法下的系统聚类(又称层次聚类)算法,通过与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的比较的更多相关文章
- (数据科学学习手札135)tenacity:Python中最强大的错误重试库
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在编写程序尤其是与网络请求相关的程序, ...
- (数据科学学习手札101)funcy:Python中的函数式编程百宝箱
本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在使用Python完成日常任务时,经常会遇到 ...
- (数据科学学习手札137)orjson:Python中最好用的json库
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,我们在日常使用Pytho ...
- (数据科学学习手札142)dill:Python中增强版的pickle
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,相信不少读者朋友们都在Pyth ...
- (数据科学学习手札42)folium进阶内容介绍
一.简介 在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些 ...
- (数据科学学习手札36)tensorflow实现MLP
一.简介 我们在前面的数据科学学习手札34中也介绍过,作为最典型的神经网络,多层感知机(MLP)结构简单且规则,并且在隐层设计的足够完善时,可以拟合任意连续函数,而除了利用前面介绍的sklearn.n ...
- (数据科学学习手札75)基于geopandas的空间数据分析——坐标参考系篇
本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中我们对geopandas中的数据结 ...
- (数据科学学习手札55)利用ggthemr来美化ggplot2图像
一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...
- (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)
一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...
随机推荐
- 关于Visio的vba操作,遍历目录,对所有vsd文件操作,导入excel文件
1.vba遍历要添加引用,runtime 2.不能打开单独的application,因为在获取到shape的picture属性时候,新打开的application不能够获取到.提示自动化错误. 3.定 ...
- ubuntu 18 环境下使用 @vue-cli 3.2 新建 vue 项目
ubuntu 18 环境下使用 @vue-cli 3.2 新建 vue 项目 标签(空格分隔): Vue 首先安装全局@vue-cli工具: npm install -g @vue/cli 然后创建项 ...
- python+requests+json 接口测试思路示例
实际项目中用python脚本实现接口测试的步骤: 1 发送请求,获取响应 >>2 提取响应里的数据,对数据进行必要的处理 >>3 断言响应数据是否与预期一致 以豆瓣接口为例 ...
- POJ 最小球覆盖 模拟退火
最小球覆盖:用半径最小的球去覆盖所有点. 纯粹的退火算法,是搞不定的,精度不够,不然就会TLE,根本跑不出答案来. 任取一点为球心,然后一点点靠近最远点.其实这才是最主要的. 因为:4个点确定一个球, ...
- ACM-ICPC (10/15) Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2)
A. Search for Pretty Integers You are given two lists of non-zero digits. Let's call an integer pret ...
- Codeforces Round #432 (Div. 2)
A. Arpa and a research in Mexican wave Arpa is researching the Mexican wave. There are n spectators ...
- CF578C Weakness and Poorness
嘟嘟嘟 题面:给一个序列中的,每一个数都减去一个实数x,使得到的新序列的max(最大连续和,|最小连续和|)最小.(|ai| <= 10000) 感性的想想,会发现最大连续和随x变大而变小,最小 ...
- 去掉谷歌浏览器 video标签下的下载按钮
一.判断浏览器版本(区分谷歌和360浏览器) function myBrowser(){ var userAgent = navigator.userAgent; //取得浏览器的userAgent字 ...
- HDU 1160(两个值的LIS,需dfs输出路径)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1160 FatMouse's Speed Time Limit: 2000/1000 MS (Java/ ...
- JavaEE权限管理系统的搭建(五)--------RBAC权限管理中的权限菜单的显示
上一小节实现了登录的实现,本小节实现登录后根据用户名查询当前用户的角色所关联的所有权限,然后进行菜单的显示.登录成功后,如下图所示,管理设置是一级菜单,管理员列表,角色管理,权限管理是二级菜单. 先来 ...