层次聚类python实现_Python机器学习——Agglomerative层次聚类

层次聚类(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 ...

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值