一.基本原理
本质是物以类聚
是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大
- 随机初始化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没有