【机器学习入门】一文看懂聚类分析以及常见方法

目录

一、聚类分析:

1.基于划分的方法

2.基于层次的方法

3.基于密度的方法

4.基于网格的方法

5.基于模型的方法

二、聚类算法的特征

三、聚类分析的度量方法

1.外部指标

2.内部指标

3.聚类的目标

4.常用外部度量指标

5.内部指标

聚类的目标

四、常用外部度量指标

(1)欧氏距离

 2)曼哈顿距离

(3)切比雪夫距离

(4)明可夫斯基距离

五、基于划分的聚类方法:

k-均值算法

k-均值算法聚类步骤如下。

k-medoids算法


一、聚类分析:

聚类分析是一种典型的无监督学习,用于对未知类别的样本进行划分,将它们按照一定的规则划分成若干个类簇,把相似(距离相近)的样本聚在同一个类簇中,把不相似的样本分为不同类簇,从而揭示样本之间内在的性质以及相互之间的联系规律。

1.基于划分的方法

基于划分的方法大多数是基于距离来划分样本的,首先对样本进行初始划分,然后计算样本间的距离,重新对数据集中的样本进行划分,将样本划分到距离更近的簇中,得到一个新的样本划分,迭代计算直到聚类结果满足用户指定的要求。典型的算法有k-均值算法和k-medoids算法。

基于划分的方法大多数是基于距离来划分样本的,首先对样本进行初始划分,然后计算样本间的距离,重新对数据集中的样本进行划分,将样本划分到距离更近的簇中,得到一个新的样本划分,迭代计算直到聚类结果满足用户指定的要求。典型的算法有k-均值算法和k-medoids算法。

2.基于层次的方法

基于层次的方法(Hierarchical Method)是按层次对数据集进行划分。根据层次聚类的过程,可分为自底向上的凝聚方法和自顶向下的分裂方法。

3.基于密度的方法

基于密度的方法提出“密度”的思想,即给定邻域中样本点的数量,当邻域中密度达到或超过密度阈值时,将邻域内的样本包含到当前的簇中。

4.基于网格的方法

基于网格的方法(Grid-based Method)将数据集空间划分为有限个网格单元,形成一个网络结构,在后续的聚类过程中,以网格单元为基本单位进行聚类,而不是以样本为单位。由于算法处理时间与样本数量无关,只与网格单元数量有关。

5.基于模型的方法

假定数据集满足一定的分布模型,找到这样的分布模型,就可以对数据集进行聚类。基于模型的方法主要包括基于统计和基于神经网络两大类,前者以高斯混合模型(Gaussian Mixture Models,GMM)为代表,后者以自组织映射网络(Self Organizing Map,SOM)为代表。目前以基于统计模型的方法为主。

二、聚类算法的特征

一个良好的聚类算法应当具有以下特征:

  1. 良好的可伸缩性。不仅能在小数据集上拥有良好性能,得到较好聚类结果,而且在处理大数据集时同样有较好的表现。
  2. 处理不同类型数据的能力。不仅能够对数值型的数据进行聚类,也能够对诸如图像、文档、序列等复杂数据进行聚类;
  3. 处理噪声数据的能力。
  4. 对样本顺序的不敏感性。
  5. 约束条件下的表现。
  6. 易解释性和易用性。

三、聚类分析的度量方法

1.外部指标

指用事先指定的聚类模型作为参考来评判聚类结果的好坏;

2.内部指标

指不借助任何外部参考,只用参与聚类的样本评判聚类结果的好坏。

3.聚类的目标

得到较高的簇内相似度和较低的簇间相似度,使得簇间的距离尽可能大,簇内样本与簇中心的距离尽可能小。

4.常用外部度量指标

对于含有n个样本点的数据集S,其中有两个不同样本点xi,xj,假设C是聚类算法给出的簇划分结果,P是外部参考模型给出的簇划分结果,那么对于样本点xi,xj来说,存在以下四种关系。 SS:xi,xj在C和P中属于相同的簇。 SD:xi,xj在C中属于相同的簇,在P中属于不同的簇。 DS:xi,xj在C中属于不同的簇,在P中属于相同的簇。 DD:xi,xj在C和P中属于不同的簇。

令a,b,c,d分别表示SS,SD,DS,DD所对应的关系数目,由于xi,xj之间的关系必定存在于四种关系中的一种,且仅能存在一种关系,因此有:

根据上述式子,有:

 Rand统计量(Rand Statistic):

F值(F-measure):

上述两个值越大,聚类效果越好。

5.内部指标

指不借助任何外部参考,只用参与聚类的样本评判聚类结果的好坏。

聚类的目标

得到较高的簇内相似度和较低的簇间相似度,使得簇间的距离尽可能大,簇内样本与簇中心的距离尽可能小。

四、常用外部度量指标

对于含有n个样本点的数据集S,其中有两个不同样本点xi,xj,假设C是聚类算法给出的簇划分结果,P是外部参考模型给出的簇划分结果,那么对于样本点xi,xj来说,存在以下四种关系。 SS:xi,xj在C和P中属于相同的簇。 SD:xi,xj在C中属于相同的簇,在P中属于不同的簇。 DS:xi,xj在C中属于不同的簇,在P中属于相同的簇。 DD:xi,xj在C和P中属于不同的簇。

令a,b,c,d分别表示SS,SD,DS,DD所对应的关系数目,由于xi,xj之间的关系必定存在于四种关系中的一种,且仅能存在一种关系,因此有:

(1)欧氏距离

欧氏距离(Euclidean Distance)是计算欧氏空间中两点之间的距离,是最容易理解的距离计算方法,其计算公式如下:

 2)曼哈顿距离

曼哈顿距离(Manhattan Distance)也称城市街区距离,欧氏距离表明了空间中两点间的直线距离,但是在城市中,两个地点之间的实际距离是要沿着道路行驶的距离,而不能计算直接穿过大楼的直线距离,曼哈顿距离就用于度量这样的实际行驶距离。

(3)切比雪夫距离

切比雪夫距离(Chebyshev Distance)是向量空间中的一种度量,将空间坐标中两个点的距离定义为其各坐标数值差绝对值的最大值。切比雪夫距离在国际象棋棋盘中,表示国王从一个格子移动到另外一个格子所走的步数。

(4)明可夫斯基距离

明可夫斯基距离(Minkowski Distance)是欧氏空间的一种测度,是一组距离的定义,被看作是欧氏距离和曼哈顿距离的一种推广。

其中n是一个可变的参数,根据n取值的不同,明可夫斯基距离可以表示一类距离。当n=1时,明可夫斯基距离就变成了曼哈顿距离;当n=2时,明可夫斯基距离就变成了欧氏距离;当n→∞时,明可夫斯基距离就变成了切比雪夫距离。

五、基于划分的聚类方法:

划分结果旨在使簇之间的样本相似性低,簇内部的样本相似度高。

基于划分的聚类的常用算法有k-均值、k-medoids、k-prototype等。

k-均值算法

k-均值中样本间的相似度是由它们之间的距离决定的,距离越近,说明相似度越高;反之,则说明相似度越低。

k-均值算法聚类步骤如下。

① 首先选取k个类簇(k需要用户指定)的质心,通常是随机选取。

② 对剩余的每个样本点,计算它们到各个质心的欧氏距离,并将其归入到相互间距离最小的质心所在的簇。计算各个新簇的质心。

③ 在所有样本点都划分完毕后,根据划分情况重新计算各个簇的质心所在位置,然后迭代计算各个样本点到各簇质心的距离,对所有样本点重新进行划分。

④ 重复第②步和第③步,直到迭代计算后,所有样本点的划分情况保持不变,此时说明k-均值算法已经得到了最优解,将运行结果返回。

K均值算法的缺点:k-均值算法簇的聚类中心选取受到噪声点的影响很大,因为噪声点与其他样本点的距离远,在计算距离时会严重影响簇的中心。

k-medoids算法

k-medoids算法不通过计算簇中所有样本的平均值得到簇的中心,而是通过选取原有样本中的样本点作为代表对象代表这个簇,计算剩下的样本点与代表对象的距离,将样本点划分到与其距离最近的代表对象所在的簇中。


参考《机器学习》赵卫东 董卫亮

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Python 实现 Gap 统计量法可以分为以下几个步骤: 1. 导入所需模块,包括 numpy、scipy、sklearn 等。 ``` python import numpy as np from scipy import stats from sklearn.cluster import KMeans ``` 2. 定义计算 Gap 统计量的函数 gap_statistic。 ``` python def gap_statistic(X, k_max=10, B=10): """ 计算 Gap 统计量 :param X: 数据集 :param k_max: 最大的聚类数量 :param B: 随机数据集的数量 :return: Gap 统计量数组 """ # 定义 SSE 数组 sse = np.zeros(k_max) # 定义随机 SSE 数组 sse_rand = np.zeros((k_max, B)) # 定义 Gap 统计量数组 gap = np.zeros(k_max) # 计算实际 SSE for k in range(1, k_max + 1): kmeans = KMeans(n_clusters=k).fit(X) sse[k - 1] = kmeans.inertia_ # 计算随机 SSE for b in range(B): X_rand = np.random.rand(*X.shape) kmeans_rand = KMeans(n_clusters=k).fit(X_rand) sse_rand[k - 1, b] = kmeans_rand.inertia_ # 计算 Gap 统计量 gap[k - 1] = np.mean(np.log(sse_rand[k - 1])) - np.log(sse[k - 1]) return gap ``` 其中,参数 X 是数据集,k_max 是最大的聚类数量,B 是随机数据集的数量。函数中,先定义实际 SSE 数组、随机 SSE 数组和 Gap 统计量数组,然后分别计算实际 SSE、随机 SSE 和 Gap 统计量。 3. 加载数据集,调用 gap_statistic 函数计算 Gap 统计量。 ``` python # 加载数据集 X = np.loadtxt("data.txt") # 计算 Gap 统计量 gap = gap_statistic(X) ``` 4. 绘制 Gap 统计量随聚类数量 k 变化的曲线。 ``` python import matplotlib.pyplot as plt # 绘制 Gap 统计量曲线 plt.plot(range(1, len(gap) + 1), gap, '-o') plt.xlabel('Number of clusters k') plt.ylabel('Gap statistic') plt.show() ``` 完整的代码如下: ``` python import numpy as np from scipy import stats from sklearn.cluster import KMeans import matplotlib.pyplot as plt def gap_statistic(X, k_max=10, B=10): """ 计算 Gap 统计量 :param X: 数据集 :param k_max: 最大的聚类数量 :param B: 随机数据集的数量 :return: Gap 统计量数组 """ # 定义 SSE 数组 sse = np.zeros(k_max) # 定义随机 SSE 数组 sse_rand = np.zeros((k_max, B)) # 定义 Gap 统计量数组 gap = np.zeros(k_max) # 计算实际 SSE for k in range(1, k_max + 1): kmeans = KMeans(n_clusters=k).fit(X) sse[k - 1] = kmeans.inertia_ # 计算随机 SSE for b in range(B): X_rand = np.random.rand(*X.shape) kmeans_rand = KMeans(n_clusters=k).fit(X_rand) sse_rand[k - 1, b] = kmeans_rand.inertia_ # 计算 Gap 统计量 gap[k - 1] = np.mean(np.log(sse_rand[k - 1])) - np.log(sse[k - 1]) return gap # 加载数据集 X = np.loadtxt("data.txt") # 计算 Gap 统计量 gap = gap_statistic(X) # 绘制 Gap 统计量曲线 plt.plot(range(1, len(gap) + 1), gap, '-o') plt.xlabel('Number of clusters k') plt.ylabel('Gap statistic') plt.show() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值