重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

怎样正确使用K均值聚类

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

创新互联建站专注于企业网络营销推广、网站重做改版、可克达拉网站定制设计、自适应品牌网站建设、html5商城网站定制开发、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为可克达拉等各大城市提供网站开发制作服务。

聚类算法中的第一门课往往是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均值聚类了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


标题名称:怎样正确使用K均值聚类
URL地址:http://cqcxhl.cn/article/ggcgop.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP