kmeans是基于距离的聚类算法,本身对异常和噪音点比较敏感,一般不用来做异常检测。还有,
i) kmeans聚类结果受对初始簇中心和k值的选取影响较大。初始点选取的改进可以使用kmeans++或先使用canopy算法先进行预聚类,以得到的k个簇中心作为kmeans的初始点;k值的选取可以使用轮廓系数或结合聚类误差平方和的肘部法进行聚类效果的评估选取最优k值。
ii)kmeans只适合数值型数据。适合离散属性的聚类有kmodes,适合具有混合变量数据的聚类有k prototype。
另外,kmeans可以看成是gmm在各混合成分均方差、且聚类是“硬分配”的特例。
聚类里做异常检测有基于密度的DBSCAN,不过DBSCAN有两个需要设置的参数(邻域、最小样本量),参数设定则要根据你数据和需求来选。
然后异常检测的话,
i)如果是单个维度上的异常检测,有正态分布假设下的3倍标准差准则、箱线图、Grubb's test等
ii)样本的异常检测就有相对于局部近邻密度来判断是否异常的LOF(局部异常检测)和基于树模型的IsolationForest(孤立森林),sklearn里面都有。
一切方法的选择都要基于对你数据的理解。
有哪里理解错误的地方麻烦各位指正,谢谢!