首页 > 试题广场 >

请你说说对于聚类算法的了解

[问答题]
请你说说对于聚类算法的了解
推荐

什么是聚类算法

  • 聚类(Clustering)是无监督学习(unsupervisied learning),即不需要标签。
  • 聚类是按照某个指标(如样本间的距离)把一个整个数据集分割成不同的类或簇(cluster),使类内元素的相似性尽可能大,类间元素的相似性尽可能地小
  • 简单来说,聚类使同一类的数据尽可能聚集到一起,不同类数据尽量分离。

聚类的一般步骤

  1. 数据准备:特征标准化(白化,whiting)
  2. 特征选择:特征降维,选择最有效的特征
  3. 特征提取:对选择的特征进行转换,提取出更有代表性的特征
  4. 聚类:基于特定的度量函数进行相似度度量,使同一类的数据尽可能聚集到一起,不同类数据尽量分离,得到各个簇的中心,以及每个元素的类标签
  5. 评估:分析聚类结果,如距离误差和(SSE)等

常用聚类算法有哪些、对应的度量函数分别是

聚类算法
Geometry (metric used)
K-Means(K-均值)
Distances between points(点之间的距离)
Mean-shift
Distances between points(点之间的距离)
Spectral clustering
Graph distance (e.g. nearest-neighbor graph)(图距离(例如最近邻图)
Ward hierarchical clustering
Distances between points(点之间的距离)
DBSCAN
Distances between nearest points(最近点之间的距离)
Gaussian mixtures(高斯混合)
Mahalanobis distances to centers( 与中心的马氏距离)

聚类跟分类的本质区别

聚类是无监督,分类是有监督

聚类好坏的评价指标

由于聚类的目的是为了能让簇内样本距离尽量的近,簇与簇之间的样本尽量的远,所以评价聚类算法的性能不是简单地统计错误的数量或计算分类算法中的 precision和 recall。
聚类算法的评价指标主要关注紧凑度分离度,其中
  • 紧凑度是衡量一个簇内样本点之间的是否足够紧凑的,比如到簇中心的平均距离、方差等;
  • 分离度是衡量该样本是否到其他簇的距离是否足够的远。
常用的算法包括轮廓系数(Silhouette Coefficient)、CH分数(Calinski Harabasz Score )也称之为 Calinski-Harabaz Index、戴维森堡丁指数(DBI)——davies_bouldin_score
这三种指标在 sklearn 中都有内置的接口,可以直接调用,比如轮廓系数(Silhouette Coefficient),接口定义如下
from sklearn.metrics import silhouette_score
def silhouette_score(X, labels, metric='euclidean', sample_size=None,
random_state=None, **kwds):
    '''
    X:表示要聚类的样本数据,一般形如(samples,features)的格式
    labels:即聚类之后得到的label标签,形如(samples,)的格式
    metric:默认是欧氏距离
    '''

代码示例

生成随机样例,并可视化

# 生成随机样例,并可视化
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
import numpy as np
from sklearn.datasets import make_blobs

X, y_true = make_blobs(n_samples=300, centers=3,
                       cluster_std=0.60, random_state=0)

plt.scatter(X[:, 0], X[:, 1], s=50)
plt.show()

kmeans聚类成三类

# 聚成三类,并可视化
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')

centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5);
plt.show()

同样的数据,聚成 6 类

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=6)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')

centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5);
plt.show()
可以看到,结果可能很混乱,解决该问题的思路即为前文提到的手肘法。

延伸考点

本题问的比较宽泛,可以自由发挥,只挑自己熟悉的回答;
面试官往往会接着往下问,比如“挑一个你最熟悉的,详细介绍一下吧”,或者“讲讲 kmeans 吧”,所以需要至少深入了解一个算法(推荐 kmeans)

编辑于 2021-09-15 18:23:15 回复(0)
聚类算法是一种常见的无监督学习算法。
常见的聚类算法有kmeans,算法首先初始化k个聚合中心。然后遍历每个样本,每个样本离哪个聚合中心近就被归为哪类。聚合完成后,求出每个聚合的几何中心作为下一轮迭代的聚合中心,直至几何中心和样本原聚合中心基本一致。此算法面临如何求取k值和如何选取初始点的问题。k值的求取可以使用手肘法,即使用不同的k值求得最终的聚合损失,如果相邻k值之间聚合损失有一个较大的降低,可以考虑选取那个较大的那个k值。初始点选取同样包括两种方法,第一种就是随机选取多种初始点,选择损失较小的那组。第二种就是kmeans++算法。
除此之外,聚类的评估指标有轮廓系数。轮廓系数的含义是对数据集中任意一个样本,计算它与当前所在聚类所有其他样本的平均距离a,再计算它与离它所在聚类最近聚类样本的平均距离b,该样本的轮廓系数即为(b-a)/max(a,b),将数据集所有样本求取轮廓系数计算算术平均值,即可得到相应的评估指标。
除此之外,还有DBSCAN算法,我将它称为“作圆算法”,DBSCAN算***引出外周样本,孤立样本和核心样本。DBSCAN算法也可使用轮廓系数作为评估。DBSCAN算法面临半径值选取的问题。
编辑于 2022-08-31 13:07:00 回复(0)