机器学习——第九章 聚类

1 聚类任务

训练样本标记信息未知,目标通过对无标记训练样本的学习来揭示数据内在性质以及规律。
聚类将数据集中样本划分为若干通常不相交的子集,每个子集称为一个簇。每个簇可能对应潜在的类别。
聚类既可以作为单独过程,用于寻找数据内在的分布结构,也可以作为费雷等其他学习任务的前驱过程。
基于不同的学习策略,设计了多种类型聚簇算法。

2 性能度量

聚类性能度量亦称为聚类有效性指标。该指标有两个作用:1.可以通过某种性能度量来评估好坏。2.若明确了最终将要使用的性能度量,可直接将其作为聚类过程的优化目标,以此更好得到符合要求的聚类结果。

一个好的聚类是簇内相似度高而簇间相似度低。

性能度量大致有两类:一类是将聚类结果与某个参考模型进行比较,称为外部指标。另一类是直接考察聚类结果而不利用任何参考模型,称为内部指标。

以下为常用聚类性能度量外部指标:

  • Jaccard系数
    J C = a a + b + c JC=\frac{a}{a+b+c} JC=a+b+ca
  • FM指数
    F M I = a a + b ∗ a a + c FMI=\sqrt{\frac{a}{a+b}*\frac{a}{a+c}} FMI=a+baa+ca
  • Rand指数
    R I = 2 ( a + d ) m ( m − 1 ) RI=\frac{2(a+d)}{m(m-1)} RI=m(m1)2(a+d)

上述性能度量的结果值均在[0,1]区间,值越大越好。

以下为常用的聚类性能度量内部指标:

  • d i s t ( . , . ) dist(.,.) dist(.,.)用于计算两个样本之间的距离
  • a v g ( C ) avg(C) avg(C)对应于簇C内样本间的平均距离
  • d i a m ( C ) diam(C) diam(C)对应于簇C内样本间的最远距离
  • d m i n ( C i , C j ) d_{min}(C_i,C_j) dmin(Ci,Cj)对应于两个簇最近样本间的距离
  • d c e n ( C i , C j ) d_{cen}(C_i,C_j) dcen(Ci,Cj)对应于两个中心点间的距离
  • DB指数(DBI)
    D B I = 1 k ∑ i = 1 k m a x ( a v g ( C i ) + a v g ( C j ) d c e n ( μ i , μ j ) ) DBI=\frac{1}{k}\sum_{i=1}^{k}max(\frac{avg(C_i)+avg(C_j)}{d_{cen}(\mu_i,\mu_j)}) DBI=k1i=1kmax(dcen(μi,μj)avg(Ci)+avg(Cj))
  • Dunn指数(DI)
    D I = m i n { m i n ( d m i n ( C i , C j ) m a x   d i a m ( C l ) ) } DI=min\{min(\frac{d_{min}(C_i,C_j)}{max\ diam(C_l)})\} DI=min{min(max diam(Cl)dmin(Ci,Cj))}

DBI的值越小越好,DI的值越大越好

3 距离计算

函数 d i s t ( . , . ) dist(.,.) dist(.,.),若它是一个距离度量,则需满足一些基本性质

  • 非负性: d i s t ( . , . ) ≥ 0 dist(.,.)\ge0 dist(.,.)0
  • 同一性: d i s t ( x i , x j ) = 0 当且仅当 x i = x j dist(x_i,x_j)=0 当且仅当x_i=x_j dist(xi,xj)=0当且仅当xi=xj
  • 对称性: d i s t ( x i , x j ) = d i s t ( x j , x i ) dist(x_i,x_j)=dist(x_j,x_i) dist(xi,xj)=dist(xj,xi)
  • 直递性: d i s t ( x i , x j ) ≤ d i s t ( x i , x k ) + d i s t ( x k , x j ) dist(x_i,x_j)\le dist(x_i,x_k)+dist(x_k,x_j) dist(xi,xj)dist(xi,xk)+dist(xk,xj)

闵可夫斯基距离较为常用: d i s t m k ( x i , x j ) = ( ∑ u = 1 n ∣ x i u − x j u ∣ p ) 1 / p dist_{mk}(x_i,x_j)=(\sum_{u=1}^{n}|x_{iu}-x_{ju}|^p)^{1/p} distmk(xi,xj)=(u=1nxiuxjup)1/p
p=2时,闵可夫斯基距离为欧氏距离:
d i s t e d ( x i , x j ) = ∑ u = 1 n ∣ x i u − x j u ∣ 2 dist_{ed}(x_i,x_j)=\sqrt{\sum_{u=1}^{n}|x_{iu}-x_{ju}|^2} disted(xi,xj)=u=1nxiuxju2
p=1时,闵可夫斯基距离为曼哈顿距离:
d i s t m a n ( x i , x j ) = ∑ u = 1 n ∣ x i u − x j u ∣ dist_{man}(x_i,x_j)=\sum_{u=1}^{n}|x_{iu}-x_{ju}| distman(xi,xj)=u=1nxiuxju

闵可夫斯基距离可用于有序属性。
对于无序属性采用VDM,VDM距离为:
V D M p ( a , b ) = ∑ i = 1 k ∣ m u , a , i m u , a − m u , b , i m u , b ∣ p VDM_p(a,b)=\sum_{i=1}^{k}|\frac{m_{u,a,i}}{m_{u,a}}-\frac{m_{u,b,i}}{m_{u,b}}|^p VDMp(a,b)=i=1kmu,amu,a,imu,bmu,b,ip

4 原型聚类

此类算法假设聚类结构能通过一组原型刻画,在现实聚类任务中较为常用。通常算法先对原型进行初始化,然后对原型进行迭代更新求解。

4.1 k均值算法

k均值算法针对聚类所得簇划分最小化平方误差
E = ∑ i = 1 k ∑ ∣ ∣ x − μ i ∣ ∣ 2 2 E=\sum_{i=1}^{k}\sum||x-\mu_i||_2^2 E=i=1k∣∣xμi22

其中 μ i = 1 ∣ C i ∣ ∑ x \mu_i=\frac{1}{|C_i|}\sum x μi=Ci1x是簇的均值平方。E刻画了簇内样本围绕簇均值向量的紧密程度,E越小簇内样本相似度越高。
k均值算法采用贪心策略,通过迭代优化来近似求解式。
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

#创建数据集
data, labels = make_blobs(n_samples=300, centers=4, random_state=50)

#创建K均值聚类模型
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans.fit(data)

#获取聚类结果和聚类中心
predicted_labels = kmeans.labels_
centroids = kmeans.cluster_centers_

#可视化聚类结果和聚类中心
plt.scatter(data[:, 0], data[:, 1], c=predicted_labels, cmap='viridis', alpha=0.5)
plt.scatter(centroids[:, 0], centroids[:, 1], marker='X', s=200, linewidths=0.2, color='red')
plt.title('K-Means')
plt.show()

在这里插入图片描述
分析:k-means算法对球形簇有较好的识别划分效果。

4.2 学习向量量化(LVQ)

与一般聚类算法不同,LVQ假设数据样本带有类别标记,学习过程利用样本的这些监督信息来辅助聚类。
LVQ的目标是学得一组n维原型向量,每个原型向量代表一个聚类簇。
在这里插入图片描述

4.3 高斯混合聚类

高斯混合聚类采用概率模型来表达聚类原型

高斯混合分布为:
P M ( x ) = ∑ i = 1 k α i ∗ p ( x ∣ μ i , ∑ i ) P_M(x)=\sum_{i=1}^{k}\alpha_i*p(x|\mu_i,\sum_i) PM(x)=i=1kαip(xμi,i)
该分布共由k个混合成分组成,每个混合分布对应一个高斯分布, α i > 0 \alpha_i>0 αi>0为相应的混合系数。
在这里插入图片描述

5 密度聚类

称为基于密度的聚类,此类算法假设聚类结构能通过样本分布的紧密程度确定。密度聚类算法从样本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果。

DBSCAN是一种著名的密度聚类算法,它是基于一组领域参数 ( ϵ , M i n P t s ) (\epsilon,MinPts) (ϵ,MinPts)来刻画样本分布的紧密程度。
有以下概念:

  • ϵ − \epsilon- ϵ领域:对 x j ∈ D x_j\in D xjD,其 ϵ − \epsilon- ϵ领域包含样本集D中与 x j x_j xj的距离不大于 ϵ \epsilon ϵ的样本。
  • 核心对象:若 x j x_j xj ϵ − \epsilon- ϵ领域至少包含 M i n P t s MinPts MinPts个样本,则 x j x_j xj是一个核心对象。
  • 密度直达:若 x j x_j xj位于 x i x_i xi ϵ − \epsilon- ϵ领域中,且 x i x_i xi是核心对象,则称 x j x_j xj x i x_i xi密度直达。
  • 密度可达:对 x i 与 x j x_i与x_j xixj,若存在样本序列之间可以密度直达,则称 x j x_j xj x i x_i xi密度可达。
  • 密度相连:对 x i 与 x j x_i与x_j xixj,若存在 x k x_k xk使得 x i 与 x j x_i与x_j xixj均有 x k x_k xk密度可达,则称 x i 与 x j x_i与x_j xixj密度相连。

将簇定义为:由密度可达关系导出的最大的密度相连样本集合。

C ⊆ D C\subseteq D CD是满足以下性质的非空样本子集:

  • 连接性: x i ∈ C , x j ∈ C ⇒ x i 与 x j 密度相连 x_i\in C,x_j\in C\Rightarrow x_i与x_j密度相连 xiCxjCxixj密度相连
  • 最大性: x i ∈ C , x j 由 x i 密度可达 ⇒ x j ∈ C x_i\in C,x_j由x_i密度可达\Rightarrow x_j\in C xiCxjxi密度可达xjC

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN

# 创建数据集
data, _ = make_moons(n_samples=200, noise=0.02, random_state=50)

# 创建DBSCAN聚类模型
dbscan = DBSCAN(eps=0.3, min_samples=5)
dbscan.fit(data)

# 获取聚类结果
predicted_labels = dbscan.labels_

# 可视化聚类结果
plt.scatter(data[:, 0], data[:, 1], c=predicted_labels, cmap='viridis', alpha=0.7)
plt.title('DBSCAN')
plt.show()

在这里插入图片描述
分析:k-means算法无法识别非球形簇,对非球形的半月牙模型无法划分,但是DBSCAN根据样本分布的密度可以很好划分为两个类别。

6 层次聚类

层次聚类试图在不同层次对数据集进行划分,从而形成树形的聚类结构,数据集划分可以按照自底向上的聚合策略,也可以按照自顶向下的分拆策略。

AGNES是采用自底向上聚合策略的层次聚类算法。

  • 算法步骤:
    1.将数据集中的每个样本看作一个初始聚类簇。
    2.算法运行的每一步中找到距离最近的两个聚类簇进行合并,该过程不断重复,直到达到预设的聚类簇个数。

有三种距离:

最小距离: d m i n ( C i , C j ) = m i n   d i s t ( x , z ) d_{min}(C_i,C_j)=min\ dist(x,z) dmin(Ci,Cj)=min dist(x,z)
最大距离: d m a x ( C i , C j ) = m a x   d i s t ( x , z ) d_{max}(C_i,C_j)=max\ dist(x,z) dmax(Ci,Cj)=max dist(x,z)
平均距离: d a v g ( C i , C j ) = 1 ∣ C i ∣ ∣ C j ∣ ∑ ∑ d i s t ( x , z ) d_{avg}(C_i,C_j)=\frac{1}{|C_i||C_j|}\sum\sum dist(x,z) davg(Ci,Cj)=Ci∣∣Cj1∑∑dist(x,z)

当聚类簇距离有 d m i n , d m a x 或 d a v g 计算时 d_{min},d_{max}或d_{avg}计算时 dmin,dmaxdavg计算时,AGNES算法相应称为单链接,全链接或均链接算法。
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import AgglomerativeClustering

# 创建数据集
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels = make_blobs(n_samples=750, centers=centers,cluster_std=0.4, random_state=0)

# 创建聚类模型
clustering = AgglomerativeClustering(n_clusters=3, linkage='ward').fit(X)
plt.figure(figsize=(10, 8))

# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=clustering.labels_, cmap='prism',alpha=0.7)
plt.title('Agglomerative')
plt.show()

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值