周志华《Machine Learning》学习笔记(11)--聚类

上篇主要介绍了一种机器学习的通用框架–集成学习方法,首先从准确性和差异性两个重要概念引出集成学习“好而不同”的四字真言,接着介绍了现阶段主流的三种集成学习方法:AdaBoost、Bagging及Random Forest,AdaBoost采用最小化指数损失函数迭代式更新样本分布权重和计算基学习器权重,Bagging通过自助采样引入样本扰动增加了基学习器之间的差异性,随机森林则进一步引入了属性扰动,最后简单概述了集成模型中的三类结合策略:平均法、投票法及学习法,其中Stacking是学习法的典型代表。本篇将讨论无监督学习中应用最为广泛的学习算法–聚类。

10、聚类算法

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

聚类直观上来说是将相似的样本聚在一起,从而形成一个类簇(cluster)。那首先的问题是如何来度量相似性(similarity measure)呢?这便是距离度量,在生活中我们说差别小则相似,对应到多维样本,每个样本可以对应于高维空间中的一个数据点,若它们的距离相近,我们便可以称它们相似。那接着如何来评价聚类结果的好坏呢?这便是性能度量,性能度量为评价聚类结果的好坏提供了一系列有效性指标。

10.1 距离度量

谈及距离度量,最熟悉的莫过于欧式距离了,从年头一直用到年尾的距离计算公式:即对应属性之间相减的平方和再开根号。度量距离还有其它的很多经典方法,通常它们需要满足一些基本性质:

这里写图片描述

最常用的距离度量方法是“闵可夫斯基距离”(Minkowski distance)

这里写图片描述

当p=1时,闵可夫斯基距离即曼哈顿距离(Manhattan distance)

这里写图片描述

当p=2时,闵可夫斯基距离即欧氏距离(Euclidean distance)

这里写图片描述

我们知道属性分为两种:连续属性离散属性(有限个取值)。对于连续值的属性,一般都可以被学习器所用,有时会根据具体的情形作相应的预处理,例如:归一化等;而对于离散值的属性,需要作下面进一步的处理:

若属性值之间存在序关系,则可以将其转化为连续值,例如:身高属性“高”“中等”“矮

### 周志华机器学习》中的聚类算法推导 #### K均值聚类算法的推导 K均值聚类是一种无监督学习方法,旨在将数据集划分为若干簇,使得同一簇内的对象相似度尽可能高,而不同簇之间的对象相似度尽可能低。具体来说,给定一组未标记的数据点 \( \{x_1, x_2, ..., x_n\} \),其中每个 \( x_i \in R^d \),目标是找到 k 个中心点 \( c_j (j=1,...,k) \),使所有数据点到最近中心的距离平方和最小化。 定义代价函数 J 如下: \[ J(C)=\sum_{i=1}^{n}\left \| x_i-c_{z(i)} \right \|^2 \] 这里 \( z(i)\in {1,\ldots,k } \) 表示第 i 个样本所属类别编号;\( C=\{c_1,c_2,…,c_k\} \) 是指由这 k 类质心组成的集合[^1]。 为了求解上述最优化问题,可以采用迭代的方式更新簇分配以及重新计算新的质心位置直到收敛为止。每次迭代过程中先固定当前得到的一组质心去划分各个实例归属哪个簇,再依据新形成的各簇调整其对应的质心坐标。此过程不断重复直至满足停止条件,比如达到最大循环次数或是前后两次变化幅度小于设定阈值等。 ```python import numpy as np def k_means(X, k, max_iters=100): # 随机初始化质心 centroids = X[np.random.choice(range(len(X)), size=k, replace=False)] for _ in range(max_iters): clusters = [[] for _ in range(k)] # 存储每轮迭代后的簇 # 将每个点分配至离它最近的那个质心所在的簇中 for point in X: distances = [np.linalg.norm(point - centroid)**2 for centroid in centroids] cluster_idx = np.argmin(distances) clusters[cluster_idx].append(point) new_centroids = [] # 更新质心的位置为对应簇内所有成员坐标的平均值 for idx, cluster in enumerate(clusters): if not cluster: continue # 如果某一轮某个簇为空,则跳过 mean_point = sum(cluster)/len(cluster) new_centroids.append(mean_point.tolist()) # 判断是否已经收敛 if np.allclose(new_centroids, centroids): break centroids = new_centroids return centroids, clusters ``` 对于其他类型的聚类算法如基于密度的方法DBSCAN,在面对具有不同密度区域的数据分布时可能会遇到困难,因为这类算法通常依赖于一致性的邻域半径参数设置来发现紧密相连的对象群组[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值