【机器学习sklearn】K-means聚类算法


一、聚类任务

【有监督学习】在“监督学习”(supervised learning)中,训练样本是带有标记信息的,目标是对带有标记的数据集进行模型学习,从而便于对新的样本进行分类。
【无监督学习】在“无监督学习”(unsupervised learning)中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律。无监督学习任务应用最多的是“聚类”(clustering)。
聚类将数据集中的样本划分为若干个不相交的子集,每个子集称为一个“簇”(cluster)。

假定样本集 D = { x 1 , x 2 , x m } D=\lbrace x_1,x_2,x_m \rbrace D={x1,x2,xm}包含 m m m个无标记样本,每个样本 x i = ( x i 1 , x i 2 , x i n ) x_i=(x_i1,x_i2,x_in) xi=(xi1,xi2,xin)是一个 n n n维特征向量,则聚类算法将样本集 D D D划分为 k k k个不相交的簇 { C l ∣ l = 1 , 2 , . . . , k } \lbrace C_l | l=1,2,...,k \rbrace {Cll=1,2,...,k}

聚类的结果可用包含 m m m个元素的簇标记向量 λ i = ( λ 1 , λ 2 , . . . , λ m ) \lambda_i = (\lambda_1,\lambda_2,...,\lambda_m) λi=(λ1,λ2,...,λm)表示。

性能度量

聚类性能度量亦称为聚类“有效性指标”。
什 么 样 的 聚 类 结 果 比 较 好 ? \color{blue}{什么样的聚类结果比较好?}
“簇内相似度”(intra-cluster similarity)高且“簇间相似度”(inter-cluster similarity)低。

聚类性能度量分类:
一是将聚类结果与某个“参考模型”进行比较,称为“外部指标”(external index);

  • Jaccard系数(Jaccard Coefficient,JC)
  • FM指数(Fowlkes and Mallows Index,FMI)
  • Rand指数(Rand Index,RI)

二是直接考虑聚类结果而不利用任何参考模型,称为“内部指标”(internal index)。

  • DB指数(Davies-Bouldin,DBI)
  • Dunn指数(Dunn Index,DI)

DBI的值越小越好,而DI则相反,值越大越好。

距离度量(distance measure)

非负性: d i s t ( x i , x j ) ≥ 0 dist(x_i,x_j)\geq0 dist(xi,xj)0
同一性: d i s t ( x i , x j ) = 0 dist(x_i,x_j)=0 dist(xi,xj)=0当且仅当 x i = x j x_i=x_j 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) \leq dist(x_i,x_k)+dist(x_k,x_j) dist(xi,xj)dist(xi,xk)+dist(xk,xj) (或称为“三角不等式”)。

给定样本 x i = ( x i 1 , x i 2 , . . . , x i n ) x_i=(x_{i1},x_{i2},...,x_{in}) xi=(xi1,xi2,...,xin) x j = ( x j 1 , x j 2 , . . . , x j n ) x_j=(x_{j1},x_{j2},...,x_{jn}) xj=(xj1,xj2,...,xjn),最常用的是“闵可夫斯基距离”(Minkowski distance)。

d i s t m k ( x i , x j ) = ( ∑ u = 1 n ∣ x i u − x j u ∣ ) 1 p dist_{mk}(x_i,x_j)=(\sum^{n}_{u=1}|x_{iu}-x_{ju}|)^{\frac {1}{p}} distmk(xi,xj)=(u=1nxiuxju)p1

欧氏距离(Euclidean distance)又称为L2范数,即p=2。
d i s t e d ( x i , x j ) = ∣ ∣ x i − x j ∣ ∣ 2 = ( ∑ u = 1 n ∣ x i u − x j u ∣ ) 1 2 dist_{ed}(x_i,x_j)=||x_i-x_j||_2=(\sum^{n}_{u=1}|x_{iu}-x_{ju}|)^{\frac {1}{2}} disted(xi,xj)=xixj2=(u=1nxiuxju)21

曼哈顿距离(Manhattan distance),即p=1。
d i s t m a n ( x i , x j ) = ∣ ∣ x i − x j ∣ ∣ 1 = ∑ u = 1 n ∣ x i u − x j u ∣ dist_{man}(x_i,x_j)=||x_i-x_j||_1=\sum^{n}_{u=1}|x_{iu}-x_{ju}| distman(xi,xj)=xixj1=u=1nxiuxju

原型聚类(基于原型的聚类 prototype-based clustering)

  • k均值(k-means)算法
  • 学习向量量化(Learning Vector Quantization,LVQ)
  • 高斯混合聚类(Mixture-of-Gaussian)- 概率模型

密度聚类(基于密度的聚类 density-based clustering)

样本分布的紧密程度

  • DBSCAN(Density-Based Spatial Clustering of Applications with Noise)密度聚类算法

层次聚类(hierarchical clustering)

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

二、K均值聚类算法

给定样本集 D = { x 1 , x 2 , x m } D=\lbrace x_1,x_2,x_m \rbrace D={x1,x2,xm},“k均值”(k-means)算法针对聚类所得簇划分 C = { C 1 , C 2 , C k } C=\lbrace C_1,C_2,C_k \rbrace C={C1,C2,Ck}最小化平方误差:
E = ∑ u = 1 k ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 2 E=\sum^{k}_{u=1}\sum_{x \in C_i}||x-\mu_i||_2^2 E=u=1kxCixμi22
其中, μ i = 1 ∣ C i ∣ ∑ x ∈ C i x \mu_i=\frac {1}{|C_i|}\sum_{x \in C_i}x μi=Ci1xCix是簇 C i C_i Ci的均值向量。上式在一定程度上刻画了簇内样本围绕簇均值向量的紧密程度, E E E值越小则簇内样本相似度越高。
k均值聚类算法步骤:

(1)为每个聚类选择一个初始聚类中心;

(2)将样本集按照最小距离原则分配到最邻近聚类;

(3)使用每个聚类的样本均值更新聚类中心;

(4)重复步骤(2)、(3),直到聚类中心不再发生变化;

(5)输出最终的聚类中心和k个簇划分。

(k均值算法图)
k均值算法

cluster.KMeans()函数

class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm='auto')

K均值聚类函数。

  • n_clusters:int,默认值=8。要形成的簇数以及要生成的质心数
  • init:{‘k-means++’, ‘random’}, 可调用或类似数组的形状 (n_clusters, n_features), default=‘k-means++’
  • n_init:int,默认值=10
    k-means 算法将使用不同的质心种子运行的次数。最终结果将是 n_init 连续运行在惯性方面的最佳输出。
  • max_iter:int,默认值=300
    单次运行的 k-means 算法的最大迭代次数。
  • tol:float,默认值=1e-4。两个连续迭代的聚类中心差异的 Frobenius 范数的相对容差,以声明收敛。
  • verbose:int, default=0。详细模式。
  • random_stateint, RandomState instance or None, default=None。确定用于质心初始化的随机数生成。使用 int 使随机性具有确定性。
  • copy_x:bool, default=True。在预先计算距离时,首先将数据居中在数值上更准确。如果 copy_x 为 True(默认),则不修改原始数据。如果为False,则修改原始数据,并在函数返回之前放回原处,但通过减去然后加上数据均值可能会引入小的数值差异。
  • algorithm:{“auto”, “full”, “elkan”}, default=”auto”。要使用的 K 均值算法。

make_blobs()函数

sklearn.datasets.make_blobs(n_samples=100, n_features=2, *, centers=None, cluster_std=1.0, center_box=(- 10.0, 10.0), shuffle=True, random_state=None, return_centers=False)

聚类数据生成器。

  • n_samples是待生成的样本的总数。
  • n_features是每个样本的特征数。
  • centers表示类别数。
  • cluster_std表示每个类别的方差。
  • center_box中心确定之后的数据边界。
  • shuffle是否打乱数据。
  • random_state随机种子。

代码如下(示例):

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans  # 导入K均值聚类算法

# make_blobs:生成聚类的数据集
# n_samples:生成的样本点个数,n_features:样本特征数,centers:样本中心数
# cluster_std:聚类标准差,shuffle:是否打乱数据,random_state:随机种子
X, y = make_blobs(n_samples=150, n_features=2,centers=3, cluster_std=0.5,shuffle=True, random_state=0)

# 散点图
# c:点的颜色,marker:点的形状,edgecolor:点边缘的形状,s:点的大小
plt.scatter(X[:, 0], X[:, 1],c='white', marker='o',edgecolor='black', s=50)
plt.show()

# 定义模型
# n_clusters:要形成的簇数,即k均值的k,init:初始化方式,tot:Frobenius 范数收敛的阈值
model = KMeans(n_clusters=3, init='random',n_init=10, max_iter=300, tol=1e-04, random_state=0)
# 训练加预测
y_pred = model.fit_predict(X)

# 画出预测的三个簇类
plt.scatter(
    X[y_pred == 0, 0], X[y_pred == 0, 1],
    s=50, c='lightgreen',
    marker='s', edgecolor='black',
    label='cluster 1'
)

plt.scatter(
    X[y_pred == 1, 0], X[y_pred == 1, 1],
    s=50, c='orange',
    marker='o', edgecolor='black',
    label='cluster 2'
)

plt.scatter(
    X[y_pred == 2, 0], X[y_pred == 2, 1],
    s=50, c='lightblue',
    marker='v', edgecolor='black',
    label='cluster 3'
)

# 画出聚类中心
plt.scatter(
    model.cluster_centers_[:, 0], model.cluster_centers_[:, 1],
    s=250, marker='*',
    c='red', edgecolor='black',
    label='centroids'
)
plt.legend(scatterpoints=1)
plt.grid()
plt.show()

# 计算inertia随着k变化的情况
distortions = []
for i in range(1, 10):
    model = KMeans(
        n_clusters=i, init='random',
        n_init=10, max_iter=300,
        tol=1e-04, random_state=0
    )
    model.fit(X)
    distortions.append(model.inertia_)
# 画图可以看出k越大inertia越小,追求k越大对应用无益处
plt.plot(range(1, 10), distortions, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Distortion')
plt.show()

总结

聚类不存在客观标准。
距离计算除了闵可夫斯基距离之外,还有内积距离、余弦距离等。
均值聚类算法优点:
(1)原理易懂、易于实现,收敛速度快;
(2)当簇间的区别较明显时,聚类效果较好;
(3)算法可解释度高,参数少,只需调整簇数k即可。
缺点:
(1)当样本集规模大时,收敛速度会变慢;
(2)对孤立点数据敏感,少量噪声就会对平均值造成较大影响;
(3)k的取值十分关键,对不同数据集,k选择没有参考性,需要大量实验;
(4)采用迭代方法,得到的结果只是局部最优;
(5)算法不稳定,受初始中心点的选择影响较大。

参考链接:
sklearn中的K-means算法
K-means算法详解及实现
scikit-learn makeblobs()
scikit-learn KMeans()
《机器学习》- 周志华

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值