python Kmeans聚类 - CPU or GPU?

引言

k均值聚类算法1,一种经典的聚类算法,被广泛应用于机器学习领域。
本文主要对比了python库中CPU和GPU的Kmeans效率:
cpu: from sklearn.cluster import KMeans
gpu: from kmeans_pytorch import kmeans (pip install kmeans-pytorch2)
GPU版本源码:PyTorch implementation of kmeans for utilizing GPU

一、时间对比

结论: 直接使用CPU版本sklearn中的KMeans or 使用以下推荐方法的GPU加速方法
推荐方法:CUDA编程方法3:从配置环境到实现KMeans算法的CUDA优化

设备:4GB GEFORECE GTX GPU and an 8-core 8GB CPU
表1:不同条目数 (特征维度:32) 在不同设备聚16类所需时间 - 单位秒

方法\数量51210242048163841000001000000
CPU (sklearn)0.390.160.253.1228.91278.90
GPU (kmeans-pytorch)0.090.140.263.2252.20489.06

每次运行结果不一样,有一定的随机性,随便取了一次结果如上表
这个结果上下两行数据换一下还好理解,很奇怪GPU一开始速度还可以越到后面越慢了 … 和其源码cpu_vs_gpu.ipynb相反
在这里插入图片描述
需要注明:我使用sklearn的KMeans和它的算法进行对比,而它的图使用自己的算法在CPU和GPU设备上进行对比
最后猜测:

  • python实现的GPU加速,相比c++慢了些
  • 可能由于本身CPU内存略小,数量大的时候CPU和GPU交互时间也越长,所以在GPU上跑也很慢
  • 参数设置差异

其它可能的原因4:GPU vs CPU

二、代码

import numpy as np
import random
import torch
import time
from sklearn.cluster import KMeans
from kmeans_pytorch import kmeans

# 1.固定随机数
seed = 0
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)

# 2.对比实验  类别:16  特征维度:32
cpu_t = []
gpu_t = []
for i in [512, 1024, 2048, 16384, 100000, 1000000]:
    print(i)
    feature = np.random.random([i, 32])   # 随机数
    # cpu
    t_s = time.time()
    _ = KMeans(n_clusters=16, random_state=0).fit(feature)
    cpu_t.append(time.time() - t_s)
    # gpu
    t_s = time.time()
    _, _ = kmeans(torch.from_numpy(feature), num_clusters=16, device=torch.device('cuda:0'))
    gpu_t.append(time.time() - t_s)

print(cpu_t)
print(gpu_t)

三、推荐博文

GPU优化K-Means算法方案5:基于GPU的K-Means聚类算法
k-medoids算法6:聚类算法——k-medoids算法


  1. 百度百科 ↩︎

  2. 机器学习:Kmeans聚类算法总结及GPU配置加速demo ↩︎

  3. CUDAC编程—从配置环境到实现KMeans算法的CUDA优化 ↩︎

  4. GPU vs CPU ↩︎

  5. 基于GPU的K-Means聚类算法 ↩︎

  6. 聚类算法——k-medoids算法 ↩︎

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
K-means是常用的聚类算法之一,它的主要思想是将数据点分为K个簇,使得同一簇内的点相似度较高,不同簇之间的点相似度较低。在scikit-learn中,KMeans聚类算法已经实现,可以方便地进行聚类操作。 本文将介绍使用scikit-learn中的KMeans聚类算法进行聚类的步骤和实现方法,并介绍MiniBatchKMeans使用。 ## 1. 数据准备 我们先生成一个随机数据集,用于演示KMeans聚类: ```python import numpy as np # 生成随机数据 np.random.seed(0) X = np.random.randn(1000, 2) # 生成1000个二维数据点 ``` ## 2. 模型训练 接下来,我们使用KMeans模型对数据进行聚类: ```python from sklearn.cluster import KMeans # 构建模型 kmeans = KMeans(n_clusters=3, random_state=0) # 训练模型 kmeans.fit(X) ``` 这里选择将数据分为3个簇,可以根据实际情况进行调整。训练完成后,我们可以查看簇中心点的位置: ```python print(kmeans.cluster_centers_) ``` 输出: ``` [[ 0.05161133 -0.96525049] [ 1.06359705 -0.02646225] [-0.9680658 0.04252211]] ``` ## 3. 预测和评估 训练完成后,我们可以使用训练好的模型对新数据进行预测: ```python # 预测新数据 y_pred = kmeans.predict(X) ``` 对于聚类算法,我们可以使用轮廓系数(Silhouette Coefficient)评估聚类效果。轮廓系数是一种衡量聚类质量的指标,取值范围在[-1, 1]之间,越接近1表示聚类效果越好。在scikit-learn中,可以使用metrics.silhouette_score来计算轮廓系数: ```python from sklearn import metrics # 计算轮廓系数 score = metrics.silhouette_score(X, y_pred) print(score) ``` 输出: ``` 0.6011942331016043 ``` ## 4. MiniBatchKMeans KMeans聚类算法的一个问题是它对于大规模数据的聚类会比较慢。因此,scikit-learn中还提供了MiniBatchKMeans算法,它可以加快聚类速度。 MiniBatchKMeans使用方法与KMeans类似: ```python from sklearn.cluster import MiniBatchKMeans # 构建模型 mbkmeans = MiniBatchKMeans(n_clusters=3, random_state=0) # 训练模型 mbkmeans.fit(X) # 预测新数据 y_pred = mbkmeans.predict(X) # 计算轮廓系数 score = metrics.silhouette_score(X, y_pred) print(score) ``` 需要注意的是,MiniBatchKMeans算法在聚类效果上可能会稍微劣于KMeans算法,但是速度更加快捷。在处理大规模数据时,可以优先考虑使用MiniBatchKMeans算法。 本文介绍了使用scikit-learn中的KMeans聚类算法进行聚类的步骤和实现方法,并介绍了MiniBatchKMeans使用。在实际应用中,可以根据实际情况选择不同的聚类算法和参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大米粥哥哥

感谢认可!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值