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个最优的质心,并将离这些质心最近的数据分别分配到这些质心代表的簇中去,具体过程总结如下:
- 随机抽取K个样本作为最初的质心
- 开始循环(将每个样本点分配到离他们最近的质心,生成K个簇;对于每个簇,计算所有被分到该簇的样本点的平均值作为新的质心)
- 当质心的位置不再发生变化,迭代停止,聚类完成
那什么情况质心的位置会不再变化?当找到一个质心,在每次迭代中被分配到这个质心上的样本都是一致的,即每次新生成的簇都是一致的,所有的样本点都不会再从一个簇转移到另一个簇,质心就不会变化了。
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