机器学习 | K-Means

一.基本原理

本质是物以类聚

是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大

  • 随机初始化k个聚类中心点,并计算数据中每个点到k个点的距离
  • 将每个数据点分到距离聚类中心点最近的聚类中心中
  • 针对每个类别重新计算聚类中心
  • 重复上面2,3步骤,直到达到预先设置的停止条件(迭代次数,最小误差变化等)

该算法把得到紧凑且独立的簇作为最终目标

因为需要计算距离,所以决定了k-means算法只能处理数值型数据,而不能处理分类属性型数据

二.优缺点

优点

  • 原理简洁明了,计算复杂度低,数学推理也不难
  • 收敛速度快,经过几个伦次的迭代之后就可以获得不错的效果
  • 聚类效果较优
  • 实现容易,收敛速度快
  • 算法的可解释性比较强
  • 主要需要调参的参数仅仅是簇数k

缺点

  • 无法解决样本不平衡问题,对于类别数据量差距较大的情况无法进行判断
  • 由于初始值随机设定,以及数据的分布情况,每次学习结果往往会有一些差异
  • 容易收敛到局部最优解,最局部最优解的时候,迭代无法引起中心点的变化,迭代将结束
  • 受噪声影响较大,如果存在一些噪声数据,会影响均值的计算,进而引起聚类的效果偏差
  • 结果不稳定,由于初始值随机设定,以及数据的分布情况,每次学习的结果往往会有一些差异
  • 只对簇的平均值被定义下才能被使用,不适合某些分类属性,虚实线给定簇数k,对初值敏感,不适合发现大小差别很大的簇,对噪声,孤立点敏感(对平均值产生极大影响)

三.适用场景

  • 隐含类别的数据较为平衡的情况,如果隐含类别的数据量差别较大,则聚类的效果就较差
  • 数据最好是凸数据,即隐含类别间差异较大,则聚类效果越好,因为中心点不再变化,所需要的迭代次数较少,比较容易收敛
  • 一般作为数据预处理,或者辅助分类贴标签使用,因为在已经经过分类的数据上进行聚类,准确度会非常高
  • 如果变量特别多,可以先进行降维,比如运用主成分法,因子分析法,再用新生成的变量进行聚类
  • 聚类分析,很容易受离群值或异常值的干扰。如果聚类出来后,显示在二维图上的结果有明显的离群值,建议去掉离群之后再重新进行聚类
  • 聚类分析不仅可以用于分类,还可以用于发现异常群体。对聚类中少数群体可以更多关注,说不定就有惊喜

四.常见面试题

1.k值如何确定?

  • 数据的先验知识,或者数据进行简单分析能得到
  • 基于变化的算法:即定义一个函数,随着k的改变,认为在正确的k时会产生极值
  • 基于结构的算法:即比较类内距离,类间距离以确定k。这个也是最常用的办法,如使用平均轮廓系数,越趋近1,聚类效果越好;如计算类内距离/类间距离,值越小越好
  • 基于一致性矩阵的算法:即认为在正确的k时,不同次聚类的结果会更加相似,以此确定k
  • 基于层次聚类:即基于合并或分裂的思想,在一定情况下停止从而获得k
  • 基于采样的算法:即对样本采样,分别做聚类;根据这些结果的相似性确定k。如将样本分为训练和测试样本;对训练样本训练分类器,用于预测测试样本类别,并与聚类的类别比较
  • k设置得越大,样本划分得就越细,每个簇的聚合程度就越高,误差平方和SSE自然就越小。所以应该选择SSE最小的聚类结果对应的k值,因为这样选出来的肯定是你尝试的那些k值中最大的那个

手肘法确定k值:

样本客观存在J个自然小类,这些真实存在的小类是隐藏于数据中的

我们需要从一个比较小的k,譬如k=2开始尝试,去逼近这个真实值J

  • 当k小于样本真实簇数J时,k每增大一个单位,就会大幅增加每个簇的聚合程度,这时SSE的下降幅度会很大
  • 当k接近J时,在增加k所得到的聚合程度回报会迅速变小,SSE的下降程度也会减小
  • 随着k的继续增大,SSE的变化会趋于平缓

2.讲下K-Means算法改进,遇到异常值怎么办?评估算法的指标有哪些?

改进:

  • kmeans++:初始随机点选择尽可能远,避免陷入局部解。方法是n+1个中心点选择时,对于离前n个点选择到的概率更大
  • mini batch kmeans:每次只用一个子集做重入类并找到类心(提高训练速度)
  • ISODATA:对于难以确定k的时候,使用该方法。思路是当类下的样本小时,剔除;类下样本数量多时,拆分
  • kernel kmeans:kmeans用欧氏距离计算相似度,也可以使用kernel映射到高维空间再聚类

遇到异常值:

  • 有条件的话使用密度聚类或者一些软聚类的方式先聚类,剔除异常值。不过本来用kmeans就是为了快,这么做有些南辕北辙了
  • 局部异常因子LOF:如果点p的密度明显小于其邻域点的密度,那么点p可能是异常值
  • 多元高斯分布异常点检测
  • 使用PCA或自动编码机进行异常点检测:使用降维后的维度作为新的特征空间,其降维结果可以认为剔除了异常值的影响(因为过程是保留使投影后方差最大的投影方向)
  • isolation forest:基本思路是建立树模型,一个节点所在的树深度越低,说明将其从样本空间划分出去越容易,因此越可能是异常值。是一种无监督的方法,随机选择n个sumsampe,随机选择一个特征一个值
  • winsorize:对于简单的,可以对单一维度做上下截取

评估聚类算法的指标:

  • 外部法(基于有标注):Jaccard系数、纯度
  • 内部法(无标注):内平方和WSS和外平方和BSS
  • 此外还要考虑到算法的时间空间复杂度、聚类稳定性等

3.在k-means或KNN,我们是用欧氏距离来计算最近的邻居之间的距离。为什么不用曼哈顿距离?
曼哈顿距离只计算水平或垂直距离,有维度的限制。另一方面,欧氏距离可用于任何空间的距离计算问题。因为,数据点可以存在于任何空间,欧氏距离是更可行的选择。例如:想象一下国际象棋棋盘,象或车所做的移动是由曼哈顿距离计算的,因为它们是在各自的水平和垂直方向做的运动

4.k-means聚类和层次聚类的区别?

k-means聚类

  • 不同于层次聚类,k-means聚类是一种快速聚类法,因此也适合应用于大样本量的数据,或者进行一些前期的数据清洗工作。k-means聚类方法需要分析师自行给出聚类的数量,即k值,因此在实际分析过程中,往往需要多次调整k值,反复尝试,以便得到较好的聚类结果
  • 和层次聚类相比,k-means计算量较小。即使样本量大或变量多的情况下,仍然可以快速给出聚类结果
  • 但是这个方法应用范围比较有限,对初始点位置很敏感,容易导致聚类结果与数据真实分类出现差异,对异常值也很敏感,同时k-means聚类的变量也必须是连续型变量,对变量的标准度要求较高,否则可能产生无意义的结果

层次聚类

  • 层次聚类通常分为自底向上和自顶向下。两种方法的运算原理其实是相通的。只不过实际计算时方向相反
  • 自底向上,又叫做合并法。这种方法是先将每个样本分别作为一个独立的类,然后通过距离计算,将距离相近的两个样本合并为一类,其它样本仍然各自为一类。不断重复这个过程,直到达到聚类数或者设定的目标
  • 自顶向下,刚好相反。这种方法先将所有样本看成一类,然后通过距离计算,选择距离最远的两个样本,各自为一个类别,其余样本根据距离远近分配到两个类别中,从而形成新的类别划分
  • 不断重复过程,直到达到聚类数或者设定的目标,因此又叫做分解法
  • 不管采用哪种层次聚类的方法,都需要对距离进行定义

5.中心点怎么计算?

k-means算法是把数据给分成不同的簇,目标是同一个簇中的差异小,不同簇之间的差异大,一般用误差平方和(SSE)作为目标函数

在k-means算法步骤中,有两个地方降低了SSE:

  • 把样本点分到最近邻的簇中,这样会降低SSE的值
  • 重新优化聚类中心点,进一步的减少了SSE

这样的重复迭代,不断优化,会找到局部最优解(局部最小的SSE),如果想要找到全局最优解需要找到合理的初始聚类中心

为了解决离群点和最优中心点的问题,可以尝试采用k-means++,即先随便选个点作为第一个初始中心C1,接下来计算所有样本点与C1的距离,距离最大的被选为下一个中心C2,直到选完K个中心的方法

6.初始化质心的方法

  • 随机法:随机指定k个样本作为初始化中心
  • 最远距离法:随机选择一个样本点作为第一个质心,然后选择距离已被选择为质心的点的最远点作为质心,直至生成k个质心

7.k-means的注意事项

  • 需要进行0-1标准化,或称为归一化:因为涉及到多个变量,不同变量的量纲不同,会导致计算出来的距离差距特别大
  • 对分类变量,进行哑变量处理:分类变量一般是字符串型变量,要参与到模型里面,要进行数值化处理。设置0-1的虚拟变量,或哑变量化

8.k-means聚类结果的评价

  • 一般采用轮廓系数法
  • 回归到聚类的目标,我们希望:①某个样本点离它所属的簇距离尽可能小 ②离其它簇距离尽可能大。轮廓系数法就是综合了①和②两个方面的综合性指标
  • 轮廓系数的取值范围是[-1,1]
  • 一般轮廓系数 > 0.5的时候,分群效果好
  • 当轮廓系数 < 0.2的时候,模型的分群效果不明显

9.k-means算法对异常值和噪声非常敏感,这些个别数据对于平均值影响非常大,因此我们使用k-means的时候需要做哪些处理呢?

删除距离其它数据较远的异常值,为了防止误删的情况,数据分析师需要在多次聚类循环中监控这些异常值,然后根据业务逻辑与多次的循环结果进行对比,再决定是否删除这些异常值

随机抽样方法也可较好地规避数据噪声的影响,因为随机抽样,作为系有时间的数据噪声和异常值被抽中的概率会很小。对于这种方式得到的聚类模型,在应用于整个数据集时至少有以下两种方式

  • 直接用该聚类模型对剩余数据进行聚类,把剩余数据分配给离它们最近的聚类中心
  • 利用监督学习中的分类器,每个聚类是一个类编,已经参与聚类的数据作为训练数据,将剩余数据作为测试数据。但是当聚类出的群体比较多时,分类器判断会比较耗时

10.k-means和KNN的共同点及区别

共同点:都用到了NN(Nears Neighbor)算法,即根据一个点,在样本集中找到离它最近的点

区别:

  • k-means是聚类算法,无监督学习;knn是分类算法,监督学习
  • k-means与knn中的k值含义不同,k-means是将样本聚类成k个类;knn是将输入数据的特征与样本集中数据的特征进行比较,取最相似的k个数据,若其中x类数据占大部分,则将这个输入数据划分为x类
  • k-means有明显的前期训练过程,knn没有

你可能感兴趣的:(机器学习,kmeans,聚类)