有监督学习:模型在训练的时候,即需要特征矩阵X,也需要真实标签y。
无监督学习:监督的算法在训练的时候只需要特征矩阵X,不需要标签。PCA降维算法就是无监督学习中的一种,聚类算法,也是无监督学习的代表算法之一。
聚类算法又叫做“无监督分类”,其目的是将数据划分成有意义或有用的组(或簇)。这种划分可以基于我们的业务需求或建模需求来完成,也可以单纯地帮助我们探索数据的自然结构和分布。比如在商业中,如果我们手头有大量的当前和潜在客户的信息,我们可以使用聚类将客户划分为若干组,以便进一步分析和开展营销活动

聚类vs分类
![[附件/Pasted image 20221115094448.png|500]]

sklearn中的聚类算法

聚类算法在sklearn中有两种表现形式,一种是类(和我们目前为止学过的分类算法以及数据预处理方法们都一样),需要实例化,训练并使用接口和属性来调用结果。另一种是函数(function),只需要输入特征矩阵和超参数,即可返回聚类的结果和各种指标。
需要注意的一件重要事情是,该模块中实现的算法可以采用不同类型的矩阵作为输入。 所有方法都接受形状
[n_samples,n_features]的标准特征矩阵,这些可以从sklearn.feature_extraction模块中的类中获得。对于亲和力传播,光谱聚类和DBSCAN,还可以输入形状[n_samples,n_samples]的相似性矩阵,我们可以使用sklearn.metrics.pairwise模块中的函数来获取相似性矩阵。

KMeans工作原理

KMeans算法将一组N个样本的特征矩阵X划分为K个无交集的簇,直观上来看是簇是一组一组聚集在一起的数据,在一个簇中的数据就认为是同一类。簇就是聚类的结果表现。
簇中所有数据的均值 μ j \mu_{j} μj通常被称为这个簇的“质心”(centroids)。在一个二维平面中,一簇数据点的质心的横坐标就是这一簇数据点的横坐标的均值,质心的纵坐标就是这一簇数据点的纵坐标的均值。同理可推广至高维空间。
在KMeans算法中,簇的个数K是一个超参数,需要我们人为输入来确定。
KMeans的核心任务就是根据我们设定好的K,找出K个最优的质心,并将离这些质心最近的数据分别分配到这些质心代表的簇中去。具体过程可以总结如下:

  1. 随机抽取K个样本作为最初的质心
  2. 开始循环:
    1. 将每个样本点分配到离他们最近的质心,生成K个簇
    2. 对于每个簇,计算所有被分到该簇的样本点的平均值作为新的质心
  3. 当质心的位置不再发生变化,迭代停止,聚类完成

当我们找到一个质心,在每次迭代中被分配到这个质心上的样本都是一致的,即每次新生成的簇都是一致的,所有的样本点都不会再从一个簇转移到另一个簇,质心就不会变化了。

这个过程在可以由下图来显示,我们规定,将数据分为4簇(K=4),其中白色X代表质心的位置:
![[附件/Pasted image 20221115101514.png|550]]
图一为原始数据分布
图二对应1. 随机抽取4个样本作为最初的质心。对应2.1. 把每个样本点分配到距离最近的初始质心上,形成最初的簇,每个颜色块就代表着围绕着质心所形成的的最初的簇
图三对应2.2. 对于每个簇,计算所有被分到该簇的样本点的平均值得到新的质心
图四对应2.1. 将样本点重新分配到距离最近的质心上,形成新的簇
图二、三、四就是一次迭代,直到某一次迭代图二与图四完全相同,我们就将迭代停止,聚类完成
迭代完成后既可以按照业务需求来对不同的数据进行不同的处理

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

聚类算法的目的,我们追求“簇内差异小,簇外差异大”。而这个“差异“,由样本点到其所在簇的质心的距离来衡量。

对于一个簇来说,所有样本点到质心的距离之和越小,我们就认为这个簇中的样本越相似,簇内差异就越小。而距离的衡量方法有多种,令 x x x表示簇中的一个样本点, μ \mu μ表示该簇中的质心, n n n表示每个样本点中的特征数目, i i i表示组成点 x x x的每个特征,则该样本点到质心的距离可以由以下距离来度量:
欧 氏 距 离 : d ( x , μ ) = ∑ i = 1 n ( x i − μ i ) 2 曼 哈 顿 距 离 : d ( x , μ ) = ∑ i = 1 n ( ∣ x i − μ i ∣ ) 余 弦 距 离 : cos ⁡ θ = ∑ i = 1 n ( x i ⋅ μ i ) ∑ i = 1 n ( x i ) 2 ⋅ ∑ i = 1 n ( μ i ) 2 \begin{aligned} 欧氏距离:d(x,\mu)&=\sqrt{\sum\limits_{i=1}^{n}(x_{i}-\mu_{i})^{2}}\\ 曼哈顿距离:d(x,\mu)&=\sum\limits_{i=1}^{n}(|x_{i}-\mu_{i}|)\\ 余弦距离:\cos \theta&=\frac{\sum\limits_{i=1}^{n}(x_{i}\cdot \mu_{i})}{\sqrt{\sum\limits_{i=1}^{n}(x_{i})^{2}}\cdot \sqrt{\sum\limits_{i=1}^{n}(\mu_{i})^{2}}} \end{aligned} :d(x,μ):d(x,μ):cosθ=i=1n(xiμi)2 =i=1n(xiμi)=i=1n(xi)2 i=1n(μi)2 i=1n(xiμi)
下面我们只讨论欧式距离(我的能力就能理解它)
如我们采用欧几里得距离,则一个簇中所有样本点到质心的距离的平方和为:
簇 内 平 方 和 ( C S S ) = ∑ j = 0 m ∑ i = 1 n ( x i − μ i ) 2 整 体 平 方 和 = ∑ l = 1 k C S S i \begin{aligned} 簇内平方和(CSS)&=\sum\limits_{j=0}^{m}\sum\limits_{i=1}^{n}(x_{i}-\mu_{i})^{2}\\ 整体平方和&=\sum\limits_{l=1}^{k}CSS_{i} \end{aligned} (CSS)=j=0mi=1n(xiμi)2=l=1kCSSi
i i i表示一个维度, j j j表示某一个簇内的一个样本的编号(编号从0开始), k k k表示簇的个数
一个数据集中的所有簇的簇内平方和(Cluster Sum of Square)相加,就得到了整体平方和(Total Cluster Sum of Square),又叫做total inertia。Total Inertia越小,代表着每个簇内样本越相似,聚类的效果就越好。
因此KMeans追求的是,求解能够让Inertia最小化的质心。实际上,在质心不断变化不断迭代的过程中,总体平方和是越来越小的。我们可以使用数学来证明,当整体平方和最小的时候,质心就不再发生变化了。如此,K-Means的求解过程,就变成了一个最优化问题。

对比来看,在决策树中,我们有衡量分类效果的指标准确度accuracy,准确度所对应的损失叫做泛化误差,但我们不能通过最小化泛化误差来求解某个模型中需要的信息,我们只是希望模型的效果上表现出来的泛化误差很小。因此决策树,KNN等算法,是绝对没有损失函数的。

我们的Inertia是基于欧几里得距离的计算公式得来的。实际上,我们也可以使用其他距离,每个距离都有自己对应的Inertia。
在sklearn当中,我们无法选择使用的距离,只能使用欧式距离。因此,我们也无需去担忧这些距离所搭配的质心选择是如何得来的了。只需要知道欧氏距离的质心是样本点坐标的均值即可

12-01 09:58