• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

聚类三—— 层次聚类

武飞扬头像
shi_jiaye
帮助1

主要内容
聚类分析概述
K-Means聚类
层次聚类
基于密度的聚类
其他聚类方法
聚类评估
小结

三、层次聚类

算法原理

层次聚类 (Hierarchical Clustering)就是按照某种方法进行层次分类,直到满足某种条件为止。层次聚类主要分成两类:

(1)凝聚:从下到上。首先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到所有的对象都在一个簇中,或者满足某个终结条件。
(2)分裂:从上到下。首先将所有对象置于同一个簇中,然后逐渐细分为越来越小的簇,直到每个对象自成一簇,或者达到了某个终止条件。

簇间的距离度量

1.最短距离法(最大相似度)
最短距离被定义为两个类中最靠近的两个对象间的距离为簇间距离。

学新通
2.最长距离法(最小相似度)
最长距离被定义为两个类中最远的像个对象间的距离为簇间距离。

学新通
学新通
3.类平均法
计算两类中任意两个对象间的距离的平均值作为簇间距离
学新通
4.中心法
定义两类的两个中心点的距离为簇间距离。

学新通
学新通
分裂层次聚类

分裂的层次聚类方法使用自顶向下的策略把对象划分到层次结构中。从包含所有对象的簇开始,每一步分裂一个簇,直到仅剩单点簇或者满足用户指定的簇数为止。
DIANA算法是典型的层次分裂聚类算法。

DIANA算法中用到如下两个定义:
(1)簇的直径:计算一个簇中任意两个数据点之间的欧式距离,选取距离中的最大值作为簇的直径。
(2)平均相异度:两个数据点之间的平均距离。

算法描述:

学新通
凝聚层次聚类

凝聚的层次聚类方法使用自底向上的策略把对象组织到层次结构中。开始时以每个对象作为一个簇,每一步合并两个最相似的簇。AGNES算法是典型的凝聚层次聚类,起始将每个对象作为一个簇,然后根据合并准则逐步合并这些簇。两个簇间的相似度由这两个不同簇中距离最近的数据点的相似度确定。聚类的合并过程反复进行直到所有对象最终满足终止条件设置的簇数目。

算法描述:

学新通
层次聚类应用

Python中层次聚类的函数是A gglomerativeClustering(),最重要的参数有3个:1.n_clusters为聚类数目
2.affinity为样本距离定义
3.linkage是类间距离的定义,有3种取值:

ward:组间距离等于两类对象之间的最小距离
average:组间距离等于两组对象之间的平均距离
complete:组间距离等于两组对象之间的最大距离

Python层次聚类实现。

# from sklearn.datasets.samples_generator import make_blobs
from sklearn.datasets import make_blobs
from sklearn.cluster import AgglomerativeClustering
import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle  # python自带的迭代器模块
# 产生随机数据的中心
centers = [[1,1],[-1,-1],[1,-1]]
# 产生的数据个数
n_samples = 3000
# 生产数据
X,lables_true = make_blobs(n_samples=n_samples,centers=centers,cluster_std=0.6,random_state=0)
# 设置分层聚类函数
linkages = ['ward','average','complete']
n_clusters_=3
ac = AgglomerativeClustering(linkage=linkages[2],n_clusters = n_clusters_)
# 训练数据
ac.fit(X)
# 每个数据的分类
lables = ac.labels_
plt.figure(1)  # 绘图
plt.clf()
colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
for k,col in zip(range(n_clusters_),colors):
    # 根据lables中的值是否等于k,重新组成一个True、False的数组
    my_members = lables == k
    # X[my_members,0]取出my_members对应位置为True的值的横坐标
    plt.plot(X[my_members,0],X[my_members,1],col '.')
plt.title('Estimated number of clusters:%d' % n_clusters_)
plt.show()
学新通

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghehah
系列文章
更多 icon
同类精品
更多 icon
继续加载