怎样正确使用K均值聚类

发布时间:2021-12-21 11:40:52 作者:柒染
来源:亿速云 阅读:162

这期内容当中小编将会给大家带来有关怎样正确使用K均值聚类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

聚类算法中的第一门课往往是K均值聚类(K-means),因为其简单高效。本文主要谈几点初学者在使用K均值聚类时需要注意的地方。

1. 输入数据一般需要做缩放,如标准化。原因很简单,K均值是建立在距离度量上的,因此不同变量间如果维度差别过大,可能会造成少数变量“施加了过高的影响而造成垄断”。

2. 如果输入数据的变量类型不同,部分是数值型(numerical),部分是分类变量(categorical),需要做特别处理。方法1是将分类变量转化为数值型,但缺点在于如果使用独热编码(one hot encoding)可能会导致数据维度大幅度上升,如果使用标签编码(label encoding)无法很好的处理数据中的顺序(order)。方法2是对于数值型变量和分类变量分开处理,并将结果结合起来,具体可以参考Python的实现[1],如K-mode和K-prototype。

3. 输出结果非固定,多次运行结果可能不同。首先要意识到K-means中是有随机性的,从初始化到收敛结果往往不同。一种看法是强行固定随机性,比如设定sklearn中的random state为固定值。另一种看法是,如果你的K均值结果总在大幅度变化,比如不同簇中的数据量在多次运行中变化很大,那么K均值不适合你的数据,不要试图稳定结果 [2]。

我个人倾向于后者的看法,K均值虽然易懂,但效果一般,如果多次运行的结果都不稳定,不建议使用K均值。我做了一个简单的实验,用K均值对某数据进行了5次聚类:

km = MiniBatchKMeans(n_clusters=5)for i in range(5):
    labels = km.fit_predict(seg_df_norm)
    label_dist = np.bincount(labels)/seg_df_norm.shape[0]*100
    print(label_dist)

打印出每次簇中的数据量占比如下,可以看出几次运行中每次簇中的数据比例都有很大差别。此处我们明白顺序可以是随机的,但占比应该是相对固定的,因此K均值不适合当前数据集。

[ 24.6071   5.414   25.4877  26.7451  17.7461][ 54.3728  19.0836   0.1314  26.3133   0.0988][ 12.9951  52.5879   4.6576  15.6268  14.1325][ 19.4527  44.2054   7.5121  24.9078   3.9221][ 21.3046  49.9233   2.1886  15.2255  11.358 ]

4. 运行时间往往可以得到优化,选择最优的工具库。基本上现在的K均值实现都是K-means++,速度都不错。但当数据量过大时,依然可以使用其他方法,如MiniBatchKMeans [3]。上百万个数据点往往可以在数秒钟内完成聚类,推荐Sklearn的实现。

5. 高维数据上的有效性有限。建立在距离度量上的算法一般都有类似的问题,那就是在高维空间中距离的意义有了变化,且并非所有维度都有意义。这种情况下,K均值的结果往往不好,而通过划分子空间的算法(sub-spacing method)效果可能更好。

6. 运行效率与性能之间的取舍。但数据量上升到一定程度时,如>10万条数据,那么很多算法都不能使用。最近读到的一篇对比不同算法性能随数据量的变化很有意思 [4]。在作者的数据集上,当数据量超过一定程度时仅K均值和HDBSCAN可用。

怎样正确使用K均值聚类

作者还做了下图以供参考对比。在他的实验中大部分算法如果超过了10万条数据后等待时长就变得很高,可能会需要连夜运行。在我的实验中,还会发现不少算法(SpectralClustering,AgglomerativeClustering等)面临内存不够的问题(memory error)。

  File "C:\Users\xyz\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\spatial\distance.py", line 1652, in pdist
    dm = np.empty((m * (m - 1)) // 2, dtype=np.double)

MemoryError
怎样正确使用K均值聚类

因此不难看出,K均值算法最大的优点就是运行速度快,能够处理的数据量大,且易于理解。但缺点也很明显,就是算法性能有限,在高维上可能不是最佳选项。

一个比较粗浅的结论是,在数据量不大时,可以优先尝试其他算法。当数据量过大时,可以试试HDBSCAN。仅当数据量巨大,且无法降维或者降低数量时,再尝试使用K均值。

一个显著的问题信号是,如果多次运行K均值的结果都有很大差异,那么有很高的概率K均值不适合当前数据,要对结果谨慎的分析。

上述就是小编为大家分享的怎样正确使用K均值聚类了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. 模糊c均值聚类和k-means聚类的数学原理
  2. K均值聚类算法的MATLAB实现

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

k-means 机器学习

上一篇:PlayMaker布局中如何预览GUI界面

下一篇:PlayMaker的特殊事件FINISHED有什么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》