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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开题报告方案论证_观点讨论研究方案、立项申报书、开题报告的联系和区别

点击蓝字获取更多精彩信息观点讨论┃研究方案、立项申报书、开题报告的联系和区别第一部分 开题报告与立项申报书的区别开题报告与立项申报书看似类似(一级目录大致相同),但相比之下,重点和详略有明显变化,主要有以下实际区别:1…

resnet50能用cpu跑吗_2020年12月1日更新。性价比最高入门游戏CPU--intel 10100F装机配置推荐。...

牙膏厂终于发布了入门级性价比最高的十代CPU,inte i3 10100F。10100F采用LGA1200芯片接口,四核八线程,主频3.6GHz,睿频可以到4.3Ghz。TDP功耗65w,支持双通道DDR4 2666内存。可以搭配H410或B460主板。首发价格为699元,性价比非常的…

匹配正则_程序员入门基础:python正则表达式贪婪匹配和非贪婪匹配

此文为python正则表达式的高阶入门,正则基础入门请参考程序员入门基础:python的正则表达式。一、贪婪匹配和非贪婪匹配举例说明概念:print(非贪婪匹配,re.search(el?, hello world,re.I))print(贪婪匹配,re.search(el, hello world,re.I))贪…

python数据结构与算法分析_数据结构和算法分析

问题引出假设有一道题目:有一组N个数而要确定其中第k个最大者,我们称之为选择问题,那么这个程序如何编写?最直观地,至少有两种思路:1、将N个数读入一个数组中,再通过某种简单的算法,…

单片机与树莓派蓝牙连接_用树莓派玩转蓝牙

作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载。蓝牙是一个使用广泛的无线通信协议,这两年又随着物联网概念进一步推广。我将介绍蓝牙协议,特别是低功耗蓝牙,并用树莓派来实践。树莓派3中内置了蓝牙模块。树…

禁止更改计算机名_计算机改名、加域脚本集合

windows计算机改名、改密码、设置ip、加域脚本集合今天和大家分享一下,如何将前面的改名加域整合在一起,根据选择执行对应的命令。新建txt文档,输入一下代码,另存为“自动加域脚本.bat”。echo offcolor 1Fmode con cols100 lines…

加载文件流_jvm类加载的过程

一个类从加载到虚拟机到使用结束从虚拟机卸载包括了加载、验证、准备、解析、初始化、使用、卸载,即为一个类的生命周期下面来看一下类加载的过程,即加载、验证、准备、解析、初始化5个阶段都做了什么事:阶段1:加载加载阶段虚拟机…

php 消息队列_消息队列篇——windows本地搭建RabbitMQ Server

前言:最近的PHP项目中有使用AMQP,解耦一些业务性的功能模块。因为工作使用的是线上Linux搭建,为了方便测试所以我决定本地搭建一个MQ服务。RabbitMQ简介:MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。…

小程序底部弹窗css_微信小程序之animation底部弹窗动画(两种方法)

简单分享一下常用的底部弹窗层或下拉框弹出层(代码需要修改)的内容弹窗的动画效果,这里分享的是点击按钮后底部弹窗的动画效果。第一种方式是动态设置显示区域的高度,第二种方法是动态设置显示区域的移动的位置(使用到 transform:translateY )&#xff1…

js cookie 存储checkbox_浏览器数据存储方式总结,网友:“精辟”!

今天主要来讲下前端的数据存储,说起数据存储,大家肯定第一时间想起cookie,localstorage,sessionstorage,而其实还有userData和IndexedDB这两种数据存储,接下来将对它们进行一个比较详细的总结一、为什么要进…

mysql获取一个表的数据作为值插入_请问如何在mysql中得到一个即将插入数据表中的那条数据的id值(id自增长)?...

我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数,一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。但在多线程情况下,就不行了。下面介绍三种方法(1) getGeneratedKeys()方法:程序片断:Connection conn ;Serial…

navigator工具_Javascript常用工具类

就算现今是以框架为主流的前端,依然离不开JS,因为他是框架底层的一部分。我先上传代码截图(截图显示会更好看点),截图后面有带源码(源码方便大家复制)。/** * 文件描述:js项目开发中的常用方法工具 * *//** * 全局常量 */var DEFAULT_LINE_KE…

tail将输出的日志放到文件中_如何将Spring Boot应用中日志输出格式改为JSON?

作者:DEV出自:解道JDON原文:jdon.com/55006今天,我们有了一类称为日志聚合系统的应用程序。当我们拥有大量微服务并且我们希望跨微服务跟踪日志时,日志聚合很有用。传统的Java应用程序日志如下所示:2020-09…

造轮子是什么意思_程序员为什么热衷于造轮子,升职加薪吗?

作者:小傅哥博客: https://bugstack.cn-沉淀、分享、成长,让自己和他人都能有所收获!一、前言哪个架构师没造过轮子?你想过这样一件事吗? 是先具备能力在安排职位,还是先安排职位在学习&#xf…

mysql 查看当前数据库编码方式_MySQL查看与修改当前数据库编码的方法

MySQL中,数据库的编码是一个相当重要的问题,有时候我们需要查看一下当前数据库的编码,甚至需要修改一下数据库编码。查看当前数据库编码的SQL语句为:mysql> use xxxDatabase changedmysql> show variables like character_s…

阿里云 服务器 系统 php mysql_阿里云服务器配环境(Ubuntu 16.04+Nginx+MySQL+PHP)并部署hexo博客...

购买服务器阿里云向学生出售优惠价格的服务器,一个月只需9.5块,具体配置看图吧更新Ubuntu源,安装Git123sudo apt updatesudo apt upgradesudo apt-get install git配置Nginx安装Nginxsudo apt install nginx开启Nginx服务sudo service nginx …

python web开发项目 源码_Python + Flask 项目开发实践系列七

对于 Python Flask 这种灵活的web开发框架,在前面的六个系列文章中详细的进行了说明,主要讲到了页面的首页加载时的页面渲染,增加功能,删除功能,修改功能,查询功能,查询详情功能等一些页面常见…

python垃圾回收 采用方式_python-面向对象-10-__del__析构方法/垃圾回收机制

Python语言自带垃圾回收机制,为了能够比较清楚说明白Python的垃圾回收机制的原理,我们今天就从最底层的解释器开始,采用由内到外的方式来说明。1.Python默认解释器CPythonPython语言拥有多种解释器,但是默认采用CPython实现。CPyt…

回调函数 相当于线程_阿里面试题:请简述下 Node 的线程模型

前言如果你有一定的前端基础,比如 HTML、CSS、JavaScript、jQuery;那么,Node.js 能让你以最低的成本快速过渡成为一个全栈工程师(我称这个全栈为伪全栈,我认为的全栈也要精通数据库,不喜勿喷),从而触及后端…

微信小程序 本地mysql_微信小程序系列之使用缓存在本地模拟服务器数据库

微信小程序系列之使用缓存在本地模拟服务器数据库现在将data.js这个文件视作是本地数据库的初始化数据,要做的第一件事就是讲这些初始化数据装进缓存中,以形成数据库的初始化数据整个应用程序的生命周期,类比一下页面的生命周期,在…