sklearn中的聚类算法K-Means

本文介绍了sklearn中的K-Means聚类算法,详细阐述了KMeans的工作原理、簇内误差平方和(Inertia)的概念及其在评估聚类效果中的作用。此外,还讨论了KMeans的参数如n_clusters、init、max_iter等,并介绍了如何通过轮廓系数来选择合适的簇数。最后,文章提到了KMeans在矢量量化和降维中的应用。
摘要由CSDN通过智能技术生成

1 概述

1.1 无监督学习与聚类算法

决策树、随机森林、逻辑回归虽然有着不同的功能,但却都属于“有监督学习”的一部分,即是说,模型在训练的时候,既需要特征矩阵 X X X,也需要真实标签 y y y。在机器学习中,还有很大一部分算法是属于“无监督学习”,无监督的算法在训练的时候只需要特征矩阵 X X X,不需要标签。曾经学过的PCA算法就是无监督学习中的一种。聚类算法也是无监督学习的代表算法之一。
聚类算法又叫做“无监督分类”,其目的是将数据划分成有意义或有用的组(或簇)。这种划分可以基于业务需求或建模需求来完成,也可以单纯地帮助探索数据的自然结构和分布。如在商业中,如果有大量的当前和潜在客户的信息,可以使用聚类将客户划分成若干组,以便进一步分析和开展营销活动,最有名的客户价值判断模型RFM,就常常和聚类分析共同使用。再比如,聚类可以用于降维和矢量量化(vector quantization),可以将高维特征压缩到一列当中,常常用于图像、声音、视频等非结构化数据,可以大幅度压缩数据量。

聚类 分类
核心 将数据分成多个组,探索每个组的数据是否有联系 从已经分组的数据中去学习,把 新数据放到已经分好的组中去
学习类型 无监督,无需标签进行训练 有监督,需要标签进行训练
典型算法 K-Means、DBSCAN、层次聚类、光谱聚类 决策树、贝叶斯、逻辑回归
算法输出 聚类结果是不确定的,不一定总是能够反映数据的真实分类。同样的聚类,根据不同的业务需求,可能是一个好结果,也可能是一个坏结果。 分类结果是确定的,分类的优劣势客观的,不是根据业务或算法需求决定的。

1.2 sklearn中的聚类算法

聚类算法在sklearn中有两种表现形式,一种是类,需要实例化,训练并使用接口和属性来调用结果。另一种是函数(function),只需要输入特征矩阵和超参数,即可返回聚类的结果和各种指标。

含义 输入:[]内代表选择输入,[]外代表必须输入
cluster.AffinityPropagation 执行亲和传播数据聚类 [damping,…]
cluster.AgglomerativeClustering 凝聚聚类 […]
cluster.Birch 实现Birch聚类算法 [threshold,branching_factor,…]
cluster.DBSCAN 从矢量数组或距离矩阵执行DBSCAN聚类 [eps,min_samples,metric,…]
cluster.FeatureAgglomeration 凝聚特征 [n_clusters,…]
cluster.KMeans K均值聚类 [n_clusters,init,n_init,…]
cluster.MiniBatchKMeans 小批量K均值聚类 [n_clusters,init,…]
cluster.MeanShift 使用平坦核函数的平均移位聚类 [bandwidth,seeds,…]
cluster.SpectralClustering 光谱聚类,将聚类应用于规范化拉普拉斯的投影 [n_clusters,…]
函数 含义 输入
cluster.affinity_propagation 执行亲和传播数据聚类 S[,…]
cluster.dascan 从矢量数组或距离矩阵执行DBSCAN聚类 X[,eps,min_samples,…]
cluster.estimate_bandwidth 估计要使用均值平移算法的带宽 X[,quantile,…]
cluster.k_means K均值聚类 X,n_clusters[,…]
cluster.mean_shift 使用平坦核函数的平均移位聚类 X[,bandwidth,seeds,…]
cluster.spectral_clustering 将聚类应用于规范化拉普拉斯的投影 affinity[,…]
cluster.ward_tree 光谱聚类,将聚类应用于规范化拉普拉斯的投影 X[,connectivity,…]
  • 输入数据
    该模块中实现的算法可以采用不同类型的矩阵作为输入。所有方法都接受形状[n_samples,n_features]的标准特征矩阵,这些可以从sklearn.feature_extraction模块中的类中获得。对于亲和力传播、光谱聚类和DBSCAN,还可以输入形状[n_samples,n_samples]的相似性矩阵,可以使用skalearn.metrics.pairwise模块中的函数来获取相似性矩阵。

2 K-Means

作为聚类算法的典型代表,K-Means可以说是最简单的聚类算法。

2.1 KMeans是如何工作的

关键概念:簇和质心
KMeans算法将一组N个样本的特征矩阵X划分为K个无交集的簇,直观上来看簇是一组一组聚集在一起的数据,在一个簇中的数据被认为是同一类。簇就是聚类的结果表现。 簇中所有数据的均值 μ j \mu_j μj通常被称为这个簇的“质心”(centroids)。在一个二维平面中,一簇数据点的质心的横坐标就是这一簇数据点的横坐标的均值,质心的纵坐标就是这一簇数据点的纵坐标的均值。同理可推广至高维空间。

在KMeans算法中,簇的个数K是一个超参数,需要人为输入来确定。KMeans的核心任务就是根据设定的K,找出K个最优的质心,并将离这些质心最近的数据分别分配到这些质心代表的簇中去,具体过程总结如下:

  1. 随机抽取K个样本作为最初的质心
  2. 开始循环(将每个样本点分配到离他们最近的质心,生成K个簇;对于每个簇,计算所有被分到该簇的样本点的平均值作为新的质心)
  3. 当质心的位置不再发生变化,迭代停止,聚类完成
    那什么情况质心的位置会不再变化?当找到一个质心,在每次迭代中被分配到这个质心上的样本都是一致的,即每次新生成的簇都是一致的,所有的样本点都不会再从一个簇转移到另一个簇,质心就不会变化了。

2.2 簇内误差平方和的定义和解惑

聚类算法聚出的类有什么含义?这些类有什么样的性质?可以认为,被分到同一个簇中的数据是有相似性的,而不同簇中的数据是不同的。当聚类完毕之后,要分别研究每个簇中的样本都有什么样的性质,再根据业务需求制定不同的商业或科技策略。和评分卡案例中的“分箱”一样,聚类算法同样追求“簇内差异小,簇间差异大”,而这个“差异”,由样本点到其所在簇的质心的距离来衡量。
对于一个簇来说,所有样本点到质心的距离之和越小,就认为这个簇中的样本越相似,簇内差异就越小。而距离的衡量方法有多种,令 x x x表示簇中的一个样本点, μ \mu μ表示簇中的质心, n n n表示每个样本点中的特征数目, i i i表示组成点 x x x的每个特征,则该样本点到质心的距离可以由以下距离来度量:
欧几里得距离: d ( x , μ ) = ( ∑ i = 1 n ( x i − μ i ) 2 ) d(x,\mu)=\sqrt{(\sum_{i=1}^n(x_i-\mu_i)^2)} d(x,μ)=(i=1n(xiμi)2)
曼哈顿距离: d ( x , μ ) = ∑ i = 1 n ( ∣ x i − μ ∣ ) d(x,\mu)=\sum_{i=1}^n(|x_i-\mu|) d(x,μ)=i=1n(xiμ)
余弦距离: c o s θ = ∑ 1 n ( x i ∗ μ ) ∑ 1 n ( x i ) 2 ∗ ∑ 1 n ( μ ) 2 cos\theta=\frac{\sum_1^n(x_i*\mu)}{\sqrt{\sum_1^n(x_i)^2}*\sqrt{\sum_1^n(\mu)^2}} cosθ=1n(xi)2 1n(μ)2 1n(xiμ)
如采用欧几里得距离,则一个簇中所有样本点到质心的距离的平方和为:
C l u s t e r S u m o f S q u a r e ( C S S ) = ∑ j = 0 m ∑ i = 1 n ( x i − μ i ) 2 Cluster Sum of Square(CSS) = \sum_{j=0}^m\sum_{i=1}^n(x_i-\mu_i)^2 ClusterSumofSquare(C

本程序是在python完成,基于sklearn.clusterk-means聚类包来实现数据的聚类,对于里面使用的数据格式如下:(注意更改程序的相关参数) 138 0 124 1 127 2 129 3 119 4 127 5 124 6 120 7 123 8 147 9 188 10 212 11 229 12 240 13 240 14 241 15 240 16 242 17 174 18 130 19 132 20 119 21 48 22 37 23 49 0 42 1 34 2 26 3 20 4 21 5 23 6 13 7 19 8 18 9 36 10 25 11 20 12 19 13 19 14 5 15 29 16 22 17 13 18 46 19 15 20 8 21 33 22 41 23 69 0 56 1 49 2 40 3 52 4 62 5 54 6 32 7 38 8 44 9 55 10 70 11 74 12 105 13 107 14 56 15 55 16 65 17 100 18 195 19 136 20 87 21 64 22 77 23 61 0 53 1 47 2 33 3 34 4 28 5 41 6 40 7 38 8 33 9 26 10 31 11 31 12 13 13 17 14 17 15 25 16 17 17 17 18 14 19 16 20 17 21 29 22 44 23 37 0 32 1 34 2 26 3 23 4 25 5 25 6 27 7 30 8 25 9 17 10 12 11 12 12 12 13 7 14 6 15 6 16 12 17 12 18 39 19 34 20 32 21 34 22 35 23 33 0 57 1 81 2 77 3 68 4 61 5 60 6 56 7 67 8 102 9 89 10 62 11 57 12 57 13 64 14 62 15 69 16 81 17 77 18 64 19 62 20 79 21 75 22 57 23 73 0 88 1 75 2 70 3 77 4 73 5 72 6 76 7 76 8 74 9 98 10 90 11 90 12 85 13 79 14 79 15 88 16 88 17 81 18 84 19 89 20 79 21 68 22 55 23 63 0 62 1 58 2 58 3 56 4 60 5 56 6 56 7 58 8 56 9 65 10 61 11 60 12 60 13 61 14 65 15 55 16 56 17 61 18 64 19 69 20 83 21 87 22 84 23 41 0 35 1 38 2 45 3 44 4 49 5 55 6 47 7 47 8 29 9 14 10 12 11 4 12 10 13 9 14 7 15 7 16 11 17 12 18 14 19 22 20 29 21 23 22 33 23 34 0 38 1 38 2 37 3 37 4 34 5 24 6 47 7 70 8 41 9 6 10 23 11 4 12 15 13 3 14 28 15 17 16 31 17 39 18 42 19 54 20 47 21 68 22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值