(数据科学学习手札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,正则表达式等),在那篇文 ...
随机推荐
- (一)selenium发展史(专治selenium小白)
Jason Huggins在2004年发起了Selenium项目,当时身处ThoughtWorks的他,为了不想让自己的时间浪费在无聊的重复性工作中,幸运的是,所有被测试的浏览器都支持Javascri ...
- msysGit删除github文件
首先打开msysGit命令行工具 首先使用命令 git rm xxx 删除远程文件 提交删除操作 git commit -m "test" ,并推送到远程仓库 git push o ...
- oracle 12c使用dblink克隆pdb
Multitenant : Hot Clone a Remote PDB or Non-CDB in Oracle Database 12c Release 2 (12.2)https://oracl ...
- May 11th 2017 Week 19th Thursday
If you fell down yesterday, stand up today. 昨天跌倒了,今天仍然要站起来. From Herbert George Wells. If you fell d ...
- 配置环境变量时,cmd下运行java -version,报错:找不到或无法加载主类 -version
这个方面适用于报错为:java 找不到或无法加载主类,一般是找不到类的路径,问题出在CLASSPATH环境变量上,当然这是大多数.大概率的出错点 不排除根据个人情况不况,所以想起来伟大领袖毛主席的话: ...
- 初学MillerRabin素数测试
前言 \(MillerRabin\)素数测试是一种很实用的素数判定方法. 它只针对单个数字进行判定,因而可以对较大的乃至于\(long\ long\)范围内的数进行判定,而且速度也很快,是个十分优秀的 ...
- HDU 5025 Saving Tang Monk 【状态压缩BFS】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Time Limit: 2000/1000 MS (Java/O ...
- HDU 5687 Problem C 【字典树删除】
传..传送:http://acm.hdu.edu.cn/showproblem.php?pid=5687 Problem C Time Limit: 2000/1000 MS (Java/Others ...
- out 和ref 的区别
练习 1: 练习 2: 练习 3:
- ROS indigo安装完成后运行小乌龟示例程序
安装ROS成功后,在Beginner Tutorials中有一个简单的示例程序. 在Terminal中运行以下命令:$ roscore新开一个terminal,运行以下命令,打开小乌龟窗口:$ ros ...