《机器学习》周志华(西瓜书)学习笔记 第九章 聚类

机器学习笔记

总目录

第九章 聚类

聚类是一种经典的无监督学习方法,无监督学习的目标是通过对无标记训练样本的学习,发掘和揭示数据集本身潜在的结构与规律,即不依赖于训练数据集的类标记信息。聚类则是试图将数据集的样本划分为若干个互不相交的类簇,从而每个簇对应一个潜在的类别。

9.1 距离度量

聚类性能度量亦称聚类"有效性指标" (validity index).

目标: 聚类结果的"簇内相似 度" (intra-cluster similarity)高且"簇间相似度" (inter-cluster similarity)低.

聚类性能度量大致有两类.

  1. 一类是将聚类结果与某个"参考模 型" (reference model)进行比较,称为"外部指标" (external i丑dex)。
  2. 另一 类是直接考察聚类结果而不利用任何参考模型,称为"内部指标" (internal index).

在这里插入图片描述
基于上图中得公式可以导出下面这些常用的聚类性能度量外部指标:
在这里插入图片描述
在这里插入图片描述
基于上图中的公式可以到处下面这些常用的聚类度量内部指标:

在这里插入图片描述

9.2 距离计算

在这里插入图片描述
最常用的距离度量方法是“闵可夫斯基距离”(Minkowski distance):
在这里插入图片描述
当p=1时,闵可夫斯基距离即曼哈顿距离(Manhattan distance):
在这里插入图片描述
当p=2时,闵可夫斯基距离即欧氏距离(Euclidean distance):
在这里插入图片描述
我们常将属性划分为"连续属性" (continuous attribute)和"离散属 性" (categorical attribute),前者在定义域上有无穷多个可能的取值,后者在定 义域上是有限个取值.

  • 若属性值之间存在序关系,则可以将其转化为连续值,例如:身高属性“高”“中等”“矮”,可转化为{1, 0.5, 0}。
  • 若属性值之间不存在序关系,则通常将其转化为向量的形式,例如:性别属性“男”“女”,可转化为{(1,0),(0,1)}。

对于无序属性,我们一般采用VDM进行距离的计算.

m u , a m_{u,a} mu,a表示在属性 u 上取值为 α 的样本数, m u , a , i m_{u,a,i} mu,a,i 表示在第 4 个样本簇 中在属性 u 上取值为 α 的样本数, k 为样本簇数,则属性 u 上两个离散值 α 与 b 之间的 VDM 距离为:

在这里插入图片描述
于是,将闵可夫斯基距离和 VDM 结合即可处理混合属性.假定有 n c n_{c} nc 个有 序属性、 n − n c n -n_c nnc 个无序属性,不失一般性,令有序属性排列在无序属性之前,则:
在这里插入图片描述
当样本空间中不 同属性的重要性不同时,可使用"加权距离" (weighted distance). 以加权闵可夫斯基距离为例:

在这里插入图片描述
在这里插入图片描述

9.3 原型聚类

原型聚类亦称"基于原型的聚类" (prototype~ based clustering)) 此类算法 假设聚类结构能通过一组原型刻画,在现实聚类任务中极为常用.通常情形下, 算法先对原型进行初始化,然后对原型进行迭代更新求解.采用不同的原型表 示、不同的求解方式?将产生不同的算法.T面介绍几种著名的原型聚类算法

9.3.1 K均值算法

K-Means的思想十分简单,首先随机指定类中心,根据样本与类中心的远近划分类簇,接着重新计算类中心,迭代直至收敛。但是其中迭代的过程并不是主观地想象得出,事实上,若将样本的类别看做为“隐变量”(latent variable),类中心看作样本的分布参数,这一过程正是通过EM算法的两步走策略而计算出,其根本的目的是为了最小化平方误差函数E:
E = ∑ i = 1 k ∑ x ϵ C i ∣ ∣ x − u i ∣ ∣ 2 2 E=\sum_{i=1}^k\sum_{x \epsilon C_i}||x-u_i||_2^2 E=i=1kxϵCixui22

其中 u i = 1 ∣ C i ∣ ∑ x ϵ C i x u_i=\frac{1}{|C_i|}\sum_{x\epsilon C_i}x ui=Ci1xϵCix是簇 C i C_i Ci的均值向量

直观来看,上式在一定程度上 刻画了簇内样本围绕簇均值向量的紧密程度, E 值越小则簇内样本相似度越高.

K-Means的算法流程如下所示:
在这里插入图片描述

9.3.2 学习向量量化

LVQ也是基于原型的聚类算法,与K-Means不同的是,LVQ使用样本真实类标记辅助聚类,首先LVQ根据样本的类标记,从各类中分别随机选出一个样本作为该类簇的原型,从而组成了一个原型特征向量组,接着从样本集中随机挑选一个样本,计算其与原型向量组中每个向量的距离,并选取距离最小的原型向量所在的类簇作为它的划分结果,再与真实类标比较。

算法流程如下:
在这里插入图片描述
算法停止条件:
己达到最大迭代轮数,或原型向量更新很小甚至不再更新

在这里插入图片描述
在这里插入图片描述

9.3.3 高斯混合聚类

与 k 均值、 LVQ 用原型向量来刻画聚类结构不同,高斯混合(Mixture-oι Gaussian)聚类采用概率模型来表达聚类原型.

多维高斯分布该路密度函数:
在这里插入图片描述
其中u表示均值向量,∑表示协方差矩阵,可以看出一个多维高斯分布完全由这两个参数所确定。接着定义高斯混合分布为:
在这里插入图片描述
该分布共由 k 个混合成分组成,每个混合成分对应一个高斯分布. 其中 u i u_i ui ∑ i \sum_i i是第 i i i个高斯混合成分的参数, 而 α i > 0 α_i > 0 αi>0 为相应的"混合系数"(mixture coefficient) , ∑ i = 1 k α i = 1 \sum_{i=1}^k \alpha_i=1 i=1kαi=1

算法流程

在这里插入图片描述

9.3.4 密度聚类

密度聚类亦称"基于密度的聚类" (density-based clustering),此类算法假 设聚类结构能通过样本分布的紧密程度确定.通常情形下,密度聚类算法从样 本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇 以获得最终的聚类结果.

DBSCAN 是一种著君的密度粟类算法?它基于一组"邻域" (neighborhood) 参数 ( ϵ , M i n P t s ) (\epsilon,MinPts) (ϵMinPts) 来刻画样本分布的紧密程度.给定数据集 D = { x 1 , x 2 , . . . , x m } D = \{x_1,x_2,..., x_m\} D={x1x2...xm}, 定义下面这几个概念:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
算法流程:
在这里插入图片描述

9.3.5 层次聚类

层次聚类(hierarchical clustering)试图在不同层次对数据集进行划分,从而 形成树形的聚类结构. 数据集的划分可采用"自底向上"的聚合策略,也可采 用 “自顶向下” 的分拆策略.
AGNES 是一种采用自底向上聚合策略的层次聚类算法.它先将数据集中 的每个样本看作一个初始聚类簇,然后在算法运行的每一步中找出距离最近的两个聚类簇进行合并,该过程不断重复,直至达到预设的聚类簇个数.这里的关 键是如何计算聚类簇之间的距离.实际上7 每个簇是一个样本集合,因此,只需 采用关于集合的某种距离即可.例如,给定聚类簇 c i 与 c j c_i与c_j cicj,可通过下面的式子 来计算距离:
在这里插入图片描述
显然,最小距离由两个簇的最近样本决定,最大距离由两个簇的最远样本决定7,而平均距离则由两个簇的所有样本共同决定.当聚类簇距离由 d m i n , d m a x 或 d a v g d_{min},d_{max} 或d_{avg} dmin,dmaxdavg 计算时, AGNES 算法被相应地称为"单链接" (single-linkage)、 “全链 接” (complete-linkage) 或"均链接" (average-linkage)算法.
在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴听到你正在学习机器学习》这本经典的教材,下面我为你提供第十四章概率图模型的Python实现学习笔记。 ## 1. 朴素贝叶斯分类器 ### 1.1 数据准备 在本章中,我们将使用著名的鸢尾花数据集进行分类。首先,我们可以从sklearn库中导入该数据集。 ```python from sklearn.datasets import load_iris iris = load_iris() X = iris.data y = iris.target ``` ### 1.2 朴素贝叶斯分类器实现 接下来,我们可以使用sklearn库中的朴素贝叶斯分类器进行分类,具体实现如下: ```python from sklearn.naive_bayes import GaussianNB from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) gnb = GaussianNB() gnb.fit(X_train, y_train) y_pred = gnb.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print('Accuracy:', accuracy) ``` ### 1.3 结果分析 运行上述代码后,我们可以得到该模型在测试集上的准确率,结果如下所示: ``` Accuracy: 1.0 ``` 可以看出,该模型在鸢尾花数据集上表现出色,准确率达到了100%。 ## 2. 隐马尔可夫模型 ### 2.1 数据准备 在本节中,我们将使用一个简单的例子来介绍隐马尔可夫模型的实现。假设我们有一个长度为100的序列,每个位置上的值都是0或1,其中0和1出现的概率分别为0.6和0.4。我们可以使用numpy库生成这个序列。 ```python import numpy as np np.random.seed(42) sequence = np.random.choice([0, 1], size=100, p=[0.6, 0.4]) ``` ### 2.2 隐马尔可夫模型实现 接下来,我们可以使用hmmlearn库中的隐马尔可夫模型进行序列建模,具体实现如下: ```python from hmmlearn import hmm model = hmm.MultinomialHMM(n_components=2) model.fit(sequence.reshape(-1, 1)) logprob, states = model.decode(sequence.reshape(-1, 1)) print('Sequence:', sequence) print('States:', states) ``` ### 2.3 结果分析 运行上述代码后,我们可以得到该模型对序列的建模结果,结果如下所示: ``` Sequence: [0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] States: [1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] ``` 可以看出,模型对序列进行了建模,并输出了每个位置上的状态,其中0表示“假”,1表示“真”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值