python KMeans聚类加速计算一些简单技巧和坑总结

前言

KMeans是最常用的最简单的聚类算法。它的效率是常见的一系列聚类算法中最高的。但受向量大小、数据量和类中心数量影响,聚类速度变慢。这里分享一些简单的技巧或者一些坑。

加速方法分享

1. Spark失效

Spark采用并行分布式计算,速度相当高和快。但是遇到kmeans,spark似乎失效了。在我的实验环境中,观察到:Spark集群部署3个8核心worker,但实际中只有一台worker在工作,这是因为kmean算法底层实现上的一些原因,它只能在一台机器的CPU上进行运算,除非改动其底层。

所以,与其开spark不如在一台多核CPU上进行计算。

由于各种算法底层原理不一样,不排除其他的模型在spark上可以实现真正并行,如此可以提升速度。

2. Sklearnex加速KMeans计算

sklearnex是一个sklearn加速包,大约可以提升几倍到千倍的速度。它是针对Intel平台的,只对Intel CPU有效,且CPU性能越好加速效果越显著。AMD CPU就算了,如果你是Linux系列的系统,使用lscpu命令即可查看确认CPU信息,windows和mac自行百度。
我的数据集是55万行384位数据,开了Sklearnex速度提升了10倍。这个速度提升相当惊艳,值得一试。

2.1 安装

pip install scikit-learn scikit-learn-intelex -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

2.2 开启加速

>>> from sklearnex import patch_sklearn
>>> patch_sklearn() # 这个函数用于开启加速sklearn,出现如下语句就表示OK!
Intel(R) Extension for Scikit-learn* enabled (https://github.com/intel/scikit-learn-intelex)

3. 降维

Kmeans在计算过程中,肯定需要度量样本间距离或者相似度。以欧式距离和Cosine相似度为例,这两种计算方法的时间复杂度都是O(n),n为维度数,所以降低维度肯定可以加快速度。维度减半,时间大约减半。

from sklearn.decomposition import PCA
pca = PCA(n_components=0.9) # 原来向量中的信息为100%,希望压缩后的向量保留了90%信息。压缩后的列数是按照90%计算的。
decomposed_mtx = pca.fit_transform(raw_mtx)

4. 减少数据

这条很简单,就是减少数据量。看起来也很愚蠢,怎么能随便删除数据呢!但是工业场景中,其实我们很多数据都是重复的,而很多聚类算法对重复或者异常值是敏感的。所以减少无效重复和异常值,如果可以大量降低数据量,不失为一个好的方法。

5. GPU

有很多GPU版本的KMeans算法包,大多数基于cuda或者torch、tensorflow的。

6. 放弃轮廓系数方法

如果你要找最优类别数,在大数据量情况下,不要直接使用轮廓系数方法,因为它的时间复杂度为 O ( n 2 ) O(n^2) O(n2),甚至比聚类过程速度都要慢。一半情况下用误差平方和(在sklearn的kmeans算法里,kmean.inertia_就是误差平方和),或者对抽样样本计算轮廓系数。

以下代码是在jupyter中直接运行的。


import pandas as pd

# 寻找最佳 类别数
NS = list(range(1100, 2001, 100))
for n in NS:
    print(n)
    begin = time.time()
    kmean = KMeans(n_clusters=n)
    row_clusters = kmean.fit_predict(pca_mtx)
    km_models.append(kmean)
    N_info.append([n, kmean.inertia_])
    end = time.time()
    print(n, end-begin)
    
n_info_pd = pd.DataFrame(N_info, columns=['n', 'sse'])
# 打印网格
axe1 = n_info_pd.plot(x='n', y='sse', ylabel='sse',
                      grid=True, # 显示网格线
                      legend=False # 不现实legend
                     )
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python Kmeans聚类是一种常用的聚类算法,可以将数据分为不同的群组。根据引用的代码示例,可以使用scikit-learn库中的KMeans类来实现Kmeans聚类算法。首先,导入所需的库,并读取数据集。然后,使用KMeans类来拟合数据并进行聚类。最后,使用散点图可视化结果。 具体的代码示例如下: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans # 读取数据集 df = pd.read_excel('13信科学生成绩.xlsx') data = np.array(df) # 使用KMeans进行聚类 y_pred = KMeans(n_clusters=3, random_state=9).fit_predict(data) # 可视化结果 plt.scatter(data[:, 0], data[:, 1], c=y_pred) plt.show() ``` 根据引用中的代码,首先导入所需的库,并读取数据集。然后使用KMeans类来拟合数据并进行聚类,并将聚类结果绘制成散点图。 根据引用中提供的完整代码,可以看到Kmeans聚类的核心思想是初始化随机的k个中心点,然后通过迭代来不断优化中心点和样本的归属关系,直到满足停止条件。 希望以上内容对你有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python实现Kmeans聚类算法](https://download.csdn.net/download/weixin_38750829/12870422)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [python实现kmeans聚类](https://blog.csdn.net/weixin_46657323/article/details/122990560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【机器学习】全面解析Kmeans聚类算法(Python)](https://blog.csdn.net/fengdu78/article/details/122183696)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值