层次聚类(hierarchical clustering)可在不同层次上对数据集进行划分,形成树状的聚类结构。AggregativeClustering是一种常用的层次聚类算法。

其原理是:最初将每个对象看成一个簇,然后将这些簇根据某种规则被一步步合并,就这样不断合并直到达到预设的簇类个数。这里的关键在于:如何计算聚类簇之间的距离?

由于每个簇就是一个集合,因此需要给出集合之间的距离。给定聚类簇Ci,CjCi,Cj,有如下三种距离:

最小距离:

dmin(Ci,Cj)=minx⃗ i∈Ci,x⃗ j∈Cjdistance(x⃗ i,x⃗ j)dmin(Ci,Cj)=minx→i∈Ci,x→j∈Cjdistance(x→i,x→j)

它是两个簇的样本对之间距离的最小值。

最大距离:

dmax(Ci,Cj)=maxx⃗ i∈Ci,x⃗ j∈Cjdistance(x⃗ i,x⃗ j)dmax(Ci,Cj)=maxx→i∈Ci,x→j∈Cjdistance(x→i,x→j)

它是两个簇的样本对之间距离的最大值。

平均距离:

davg(Ci,Cj)=1|Ci||Cj|∑x⃗ i∈Ci∑x⃗ j∈Cjdistance(x⃗ i,x⃗ j)davg(Ci,Cj)=1|Ci||Cj|∑x→i∈Ci∑x→j∈Cjdistance(x→i,x→j)

它是两个簇的样本对之间距离的平均值。

当该算法的聚类簇采用dmindmin时,称为单链接single-linkage算法,当该算法的聚类簇采用dmaxdmax时,称为单链接complete-linkage算法,当该算法的聚类簇采用davgdavg时,称为单链接average-linkage算法。

下面给出算法:

输入:

数据集D=D={x⃗ 1,x⃗ 2,...,x⃗ Nx→1,x→2,...,x→N}

聚类簇距离度量函数

聚类簇数量KK

输出:簇划分C=C={C1,C2,...,CKC1,C2,...,CK}

算法步骤如下:

初始化:将每个样本都作为一个簇

Ci=[x⃗ i],i=1,2,...,NCi=[x→i],i=1,2,...,N

迭代:终止条件为聚类簇的数量为K。迭代过程如下:

计算聚类簇之间的距离,找出距离最近的两个簇,将这两个簇合并。

Python实战

AgglomerativeClustering是scikit-learn提供的层级聚类算法模型,其原型为:

class sklearn.cluster.AgglomerativeClustering(n_clusters=2, affinity=’euclidean’, memory=None, connectivity=None, compute_full_tree=’auto’, linkage=’ward’, pooling_func=)

1

参数

n_clusters:一个整数,指定分类簇的数量

connectivity:一个数组或者可调用对象或者None,用于指定连接矩阵

affinity:一个字符串或者可调用对象,用于计算距离。可以为:’euclidean’,’l1’,’l2’,’mantattan’,’cosine’,’precomputed’,如果linkage=’ward’,则affinity必须为’euclidean’

memory:用于缓存输出的结果,默认为不缓存

n_components:在 v-0.18中移除

compute_full_tree:通常当训练了n_clusters后,训练过程就会停止,但是如果compute_full_tree=True,则会继续训练从而生成一颗完整的树

linkage:一个字符串,用于指定链接算法

‘ward’:单链接single-linkage,采用dmindmin

‘complete’:全链接complete-linkage算法,采用dmaxdmax

‘average’:均连接average-linkage算法,采用davgdavg

pooling_func:一个可调用对象,它的输入是一组特征的值,输出是一个数

属性

labels:每个样本的簇标记

n_leaves_:分层树的叶节点数量

n_components:连接图中连通分量的估计值

children:一个数组,给出了每个非节点数量

方法

fit(X[,y]):训练样本

fit_predict(X[,y]):训练模型并预测每个样本的簇标记

from sklearn import cluster

from sklearn.metrics import adjusted_rand_score

import numpy as np

import matplotlib.pyplot as plt

from sklearn.datasets.samples_generator import make_blobs

"""

产生数据

"""

def create_data(centers,num=100,std=0.7):

X,labels_true = make_blobs(n_samples=num,centers=centers, cluster_std=std)

return X,labels_true

"""

数据作图

"""

def plot_data(*data):

X,labels_true=data

labels=np.unique(labels_true)

fig=plt.figure()

ax=fig.add_subplot(1,1,1)

colors='rgbycm'

for i,label in enumerate(labels):

position=labels_true==label

ax.scatter(X[position,0],X[position,1],label="cluster %d"%label),

color=colors[i%len(colors)]

ax.legend(loc="best",framealpha=0.5)

ax.set_xlabel("X[0]")

ax.set_ylabel("Y[1]")

ax.set_title("data")

plt.show()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

这里写代码片

"""

测试函数

"""

def test_AgglomerativeClustering(*data):

X,labels_true=data

clst=cluster.AgglomerativeClustering()

predicted_labels=clst.fit_predict(X)

print("ARI:%s"% adjusted_rand_score(labels_true, predicted_labels))

"""

考察簇的数量对于聚类效果的影响

"""

def test_AgglomerativeClustering_nclusters(*data):

X,labels_true=data

nums=range(1,50)

ARIS=[]

for num in nums:

clst=cluster.AgglomerativeClustering(n_clusters=num)

predicted_lables=clst.fit_predict(X)

ARIS.append(adjusted_rand_score(labels_true, predicted_lables))

fig=plt.figure()

ax=fig.add_subplot(1,1,1)

ax.plot(nums,ARIS,marker="+")

ax.set_xlabel("n_clusters")

ax.set_ylabel("ARI")

fig.suptitle("AgglomerativeClustering")

plt.show()

"""

考察链接方式对聚类结果的影响

"""

def test_agglomerativeClustering_linkage(*data):

X,labels_true=data

nums=range(1,50)

fig=plt.figure()

ax=fig.add_subplot(1,1,1)

linkages=['ward','complete','average']

markers="+o*"

for i,linkage in enumerate(linkages):

ARIs=[]

for num in nums:

clst=cluster.AgglomerativeClustering(n_clusters=num,linkage=linkage)

predicted_labels=clst.fit_predict(X)

ARIs.append(adjusted_rand_score(labels_true, predicted_labels))

ax.plot(nums,ARIs,marker=markers[i],label="linkage:%s"%linkage)

ax.set_xlabel("n_clusters")

ax.set_ylabel("ARI")

ax.legend(loc="best")

fig.suptitle("AgglomerativeClustering")

plt.show()

centers=[[1,1],[2,2],[1,2],[10,20]]

X,labels_true=create_data(centers, 1000, 0.5)

test_AgglomerativeClustering(X,labels_true)

plot_data(X,labels_true)

test_AgglomerativeClustering_nclusters(X,labels_true)

test_agglomerativeClustering_linkage(X,labels_true)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

可以看到当n_clusters=4时,ARI指数最大,因为确实是从四个中心点产生的四个簇。

1

2

可以看到,三种链接方式随分类簇的数量的总体趋势相差无几。但是单链接方式ward的峰值最大

python实现一个层次聚类方法

层次聚类(Hierarchical Clustering) 一.概念 层次聚类不需要指定聚类的数目,首先它是将数据中的每个实例看作一个类,然后将最相似的两个类合并,该过程迭代计算只到剩下一个类为止,类 ...

机器学习(6): 层次聚类 hierarchical clustering

假设有N个待聚类的样本,对于层次聚类来说,步骤:        1.(初始化)把每个样本归为一类,计算每两个类之间的距离,也就是样本与样本之间的相似度:        2.寻找各个类之间最近的两个类, ...

吴裕雄 python 机器学习——K均值聚类KMeans模型

import numpy as np import matplotlib.pyplot as plt from sklearn import cluster from sklearn.metrics ...

吴裕雄 python 机器学习——混合高斯聚类GMM模型

import numpy as np import matplotlib.pyplot as plt from sklearn import mixture from sklearn.metrics ...

Python机器学习算法 — K-Means聚类

K-Means简介 步,直到每个簇的中心基本不再变化: 6)将结果输出. K-Means的说明 如图所示,数据样本用圆点表示,每个簇的中心点用叉叉表示:       (a)刚开始时是原始数据,杂乱无章 ...

吴裕雄 python 机器学习——层次聚类AgglomerativeClustering模型

import numpy as np import matplotlib.pyplot as plt from sklearn import cluster from sklearn.metrics ...

机器学习算法总结(五)——聚类算法(K-means,密度聚类,层次聚类)

本文介绍无监督学习算法,无监督学习是在样本的标签未知的情况下,根据样本的内在规律对样本进行分类,常见的无监督学习就是聚类算法. 在监督学习中我们常根据模型的误差来衡量模型的好坏,通过优化损失函数来改善 ...

Python机器学习--聚类

K-means聚类算法 测试: # -*- coding: utf-8 -*- """ Created on Thu Aug 31 10:59:20 2017 @auth ...

100天搞定机器学习|day54 聚类系列:层次聚类原理及案例

几张GIF理解K-均值聚类原理 k均值聚类数学推导与python实现 前文说了k均值聚类,他是基于中心的聚类方法,通过迭代将样本分到k个类中,使每个样本与其所属类的中心或均值最近. 今天我们看一下无监 ...

随机推荐

Cocos2d-x不要随便在onEnter里面addChild

使用任何版本的Cocos2d-x(1.x,2.x,3.0),在onEnter中调用addChild,都要小心谨慎,因为它有可能导致两种莫名其妙的BUG,莫名其妙的BUG当然难以定位了!更何况这个BUG ...

安装centos6.5如何选择安装包

(1)系统安装类型选择及自定义额外包组 进入如图2-28所示界面.上半部分是系统定制的不同的系统安装类型选择项,默认是"Desktop",这里我们选择"Minimal&q ...

javascript数据结构与算法---列表

javascript数据结构与算法---列表 前言:在日常生活中,人们经常要使用列表,比如我们有时候要去购物时,为了购物时东西要买全,我们可以在去之前,列下要买的东西,这就要用的列表了,或者我们小时候 ...

Python多版本共存之pyenv

经常遇到这样的情况: 系统自带的Python是2.6,自己需要Python 2.7中的某些特性: 系统自带的Python是2.x,自己需要Python 3.x: 此时需要在系统中安装多个Python, ...

来讲讲C#中的类

1.什么是类? 面向对象的语言,最基本的就是类.在C#中,类是这样来定义的:类代表一组具有公共属性和行为的对象. 举个例子,现实生活中,人就是一个“类”,但这只是一个统称,指所有的人.我们要找个人一起 ...

【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)

3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 682  Solved: 364 Description 我们称一 ...

python image show()方法的预览问题

在windows下面使用PIL中Image的show()函数时,执行下列代码: from PIL import Image img = Image.open("1.png") ...

python3操作数据库 借助pycharm快速连接并操作mysql数据库

1.https://blog.csdn.net/qiushi_1990/article/details/78041299

Android开发小技巧之根据position判断ListView是否在显示

使用ListView的时候,会有判断指定项是否正在显示的需求,其实很简单,代码如下: private boolean isShowing(int position) { int showViewCou ...

层次聚类python实现_Python机器学习——Agglomerative层次聚类相关推荐

  1. 谱聚类python代码_python中的谱聚类图

    没有太多光谱聚类的经验,只是按照文档进行(结果请跳到最后!)以下内容: 代码:import numpy as np import networkx as nx from sklearn.cluster ...

  2. 【Python】sklearn机器学习之层次聚类算法AgglomerativeClustering

    文章目录 基本原理 绘图层次 定义距离 基本原理 和Birch聚类相似,层次聚类也是一种依赖树结构实现的聚类方法,其核心概念是相似度.根据相似度,可以将所有样本组织起来,从而构建一棵层次聚类树. 其中 ...

  3. python kmeans聚类_python机器学习之k-means聚类算法(1)

    k-means算法是一种无监督的机器学习算法,虽然是机器学习,但它简单易于实现.本篇采用python语言,自主编程实现k-menas算法,当然python用专门的库函数来实现该算法,但本次主要使用该算 ...

  4. 机器学习 python 库_Python机器学习库

    机器学习 python 库 什么是机器学习? (What is Machine Learning?) As the web is immensely growing with each day, an ...

  5. Python机器学习——Agglomerative层次聚类

    层次聚类(hierarchical clustering)可在不同层次上对数据集进行划分,形成树状的聚类结构.AggregativeClustering是一种常用的层次聚类算法.    其原理是:最初 ...

  6. python层次聚类法画图_Python实现简单层次聚类算法以及可视化

    本文实例为大家分享了Python实现简单层次聚类算法,以及可视化,供大家参考,具体内容如下 基本的算法思路就是:把当前组间距离最小的两组合并成一组. 算法的差异在算法如何确定组件的距离,一般有最大距离 ...

  7. 层次聚类python代码_python实现层次聚类

    BAFIMINARMTO BA0662877255412996 FI6620295468268400 MI8772950754564138 NA2554687540219869 RM412268564 ...

  8. 聚类算法 距离矩阵_机器学习基础-层次聚类

    层次聚类(Hierarchical clustering) 何时使用? 当我们希望进一步挖掘观测数据的潜在关系,可以使用层次聚类算法. 工作方式 首先我们会计算距离矩阵(distance matrix ...

  9. 谱聚类python代码_Python 谱聚类算法从零开始

    谱聚类算法是一种常用的无监督机器学习算法,其性能优于其他聚类方法. 此外,谱聚类实现起来非常简单,并且可以通过标准线性代数方法有效地求解. 在谱聚类算法中,根据数据点之间的相似性而不是k-均值中的绝对 ...

最新文章

  1. mysql 定长文件_mysql 定时备份文件 参考文档
  2. 闲话WPF之二六(WPF性能优化点)
  3. 如何恢复Linux下被误删除的文件以及如何防止文件被删除
  4. ad中电容用什么封装_二极管在电路中到底做什么用的
  5. php正则学习,php中正则表达式的学习及应用
  6. 操作系统之文件管理:8、文件系统实例
  7. mongoDB Error:not master and slaveOk=false
  8. oracle无会话锁表,深入浅出oracle锁 原理篇 停止无反应的sql会话
  9. 【设计模式笔记】代理模式
  10. 2018.5.15Html标签初学
  11. 指定的網域的名稱或安全性識別碼(用磁碟映像檔部署的電腦無法加入AD網域 )...
  12. 安卓平台病毒猖獗 日感染15000台
  13. linux文本编辑器英文名,科学网—带格式的文本编辑器Typora 之介绍 - 丁祥欢的博文...
  14. 第22篇-安卓手机端抓包软件VNET介绍
  15. 高德地图应用:接口调用权限安全升级( web端API接口加密)(文档篇)
  16. 用Python教你画一棵绝美碎花树~学会就能送给喜欢的人啦
  17. android 邮箱 推荐,Android邮箱谁最棒?最新热门邮箱App横向测试
  18. 【H3C模拟器】配置交换机的链路聚合
  19. 禁用IE设置代理检测不通过怎么办!
  20. 机房布线的最高境界 | 最后的暗黑系,真是亮瞎眼

热门文章

  1. pytorch每次迭代训练前都重新对数据集进行采样形成平衡数据集
  2. 傅里叶变换频谱的可视化保存
  3. 一篇文章搞懂数据仓库:常用ETL工具、方法
  4. Could not create directory F:\Qt\Test\Error in Util.asciify(build-First_02-Desktop_Qt_5_6_3_Min
  5. TCP/IP校验和(浅析+实例)
  6. 王爽 汇编语言第三版 第9章 转移指令的原理
  7. PL/SQL-FOR UPDATE 与 FOR UPDATE OF的区别
  8. redisserver是什么问题_面试官老是问:为什么采用单线程的Redis也会如此之快?...
  9. oracle简单序列,-30天下载
  10. java三态_Java中对象的三种状态