热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Python复现SIGKDD2017的PAMAE算法(并行kmedoids算法)

项目介绍PAMAE:Parallelk-MedoidsClusteringwithHighAccuracyandEfficiency是SIGKDD2

项目介绍

PAMAE: Parallel k-Medoids Clustering with High Accuracy and Efficiency 是SIGKDD2017一篇关于k-medoids并行聚类的论文,论文中作者使用Spark与Hadoop实现算法的并行化,而本项目使用python并行编程模拟MapReduce的并行,对该论文算法的思想进行复现。

使用本项目复现的代码对中心数量分别为5、10、15、20的数据集进行聚类的效果图如下(数据集大小为1万)

 

使用Python复现SIGKDD2017的PAMAE算法(并行k-medoids算法) - 文章图片

 

使用方法

直接运行如下命令即可,程序会使用默认参数,生成一个数据集,并对该数据集执行聚类算法

python pamae.py

也可以指定如下参数:

  • n_points:生成的数据的个数,默认为10000

  • subset_size:phase 1中采样后子集的大小,默认为100

  • subset_num:phase 1中采样的子集的数量 ,默认为5

  • centroid_num:簇中心的数量 ,默认为10

python pamae.py --n_points 10000 --subset_size 100 --subset_num 5 --centroid_num 10

程序产生的Phase 1与Phase 2的聚类结果图,会保存在根目录的results文件夹下,命名方式为"phase[1|2]_数据集大小_采样子集大小_采样子集数量_中心数量",并且在控制台输出每个阶段的的中心集合、耗时、聚类误差等数据

背景介绍

聚类就是将数据集划分为多个簇(cluster),每个簇由若干相似对象组成,使得同一个簇中对象间的相似度最大化,不同簇中对象间的相似度最小化。其中k-means与k-medoids是最基础的两种聚类算法

k-means算法选择簇中所有对象的均值作为簇的中心,因此k-means算法实现简单、时间复杂度低,但其对噪声和离群点很敏感

k-medoids算法则是选择离簇均值最近的对象作为簇中心。所以k-medoids算法对噪声和离群点更具鲁棒性,但其时间复杂度却很高。


k-meansk-medoids
优点实现简单、时间复杂度低对噪声和离群点更具鲁棒性
缺点对噪声和离群点很敏感时间复杂度高

k-means算法

算法简介:k-means算法采用簇中所有对象的均值作为簇中心。给定划分的簇的数量k。随机选择k个对象作为k个簇中心,将剩余对象指派到距离最近的簇,然后重新计算每个簇的新均值,得到更新后的簇中心。不断重复上述步骤,直到簇中心不再发生变化。

k-means算法伪代码如下:

输入:数据集D,划分簇的个数k
输出:k个簇的集合
从数据集D中任意选择k个对象作为初始簇中心
repeat
? ?for 数据集D中每个对象P do
? ? ? ?计算对象P到k个簇中心的距离
? ? ? ?将对象P指派到与其最近(距离最短)的簇
? ?end for
? ?计算每个簇中对象的均值,以该均值点作为新的簇的中心
until k个簇的簇中心不再发生变化

k-means算法示意图如下:

使用Python复现SIGKDD2017的PAMAE算法(并行k-medoids算法) - 文章图片


PAM算法

算法简介:PAM算法是k-medoids算法的变种,PAM算法并不是采用簇的均值作为簇中心,而是选择簇中距平均值最近的对象作为簇中心

聚类误差S:所以对象到其簇中心的距离之和

PAM算法伪代码如下:

输入:数据集D,划分簇的个数k
输出:k个簇的集合
从数据集D中任意选择k个对象作为初始簇中心
repeat
? ?把剩余对象分配到距离最近的簇中心
? ?对于所有(中心点C,非中心点P)的二元组。尝试将中心点与非中心点交换,并计算聚类误差
? ?若交换之后聚类误差降低了,则使用该非中心点替换中心点
until k个簇的簇中心不再发生变化

PAM算法示意图如下:

使用Python复现SIGKDD2017的PAMAE算法(并行k-medoids算法) - 文章图片


研究现状

尽管k-medoids具有更好的鲁棒性,但是由于其计算复杂度过高,所以人们用的主要还是k-means算法。有许多研究者尝试解决k-medoids算法的效率问题, 但基本都是以算法准确率作为代价,也就是说现有研究都没能很好地解决k-medoids算法的效率与准确率之间的矛盾。

解决k-medoids算法效率问题的各种举措可以按照以下三个维度进行划分

使用Python复现SIGKDD2017的PAMAE算法(并行k-medoids算法) - 文章图片


通过上表,我们可以清楚看到

  • global search与entire data的使用可以提高算法的准确率,但会降低算法的效率

  • sampled data与local search的使用可以提高算法效率,但会降低准确率

论文贡献

本文尝试在k-medoids的准确率与效率之间找到一个平衡点,于是作者提出了一个基于k-medoids的并行聚类算法(PAMAE),算法分为两个阶段,每个阶段都使用Spark和Hadoop实现并行处理,提高算法的效率:

  • 在第一阶段采用sampled data与global search策略

  • 在第二阶段采用entire data与local search策略

进行以上组合的原因:global search与entire data策略的使用可以提高算法的准确率,但同时使用,必定会降低算法的效率。而entire data与local search策略可以提高算法的效率,但同时使用,也必定会降低算法的准确率。因此作者在四者的组合中找到了一个平衡点,即sampled data+global search与entire data+local search。

第一阶段的sampled data可以提高算法效率,global search可以提高算法准确率,这是一个高效率+高准确率的组合。

第二阶段的entire data可以提高算法准确率,local search可以提高效率,也是一个高效率+高准确率的组合。

可以发现每个阶段都是高效率+高准确率的组合,PAMAE算法就是通过这种“一快一准”的策略组合,再加上MapReduce的并行处理,以达到高效率和高准确率之间的平衡

使用Python复现SIGKDD2017的PAMAE算法(并行k-medoids算法) - 文章图片


PAMAE算法描述

PAMAE算法分为如下两个阶段

Phase 1

算法思想:对整个数据集进行随机采样(sampled data ),生成m个规模为n的子集。然后对m个子集并行执行PAM算法(global search),计算整个数据集的聚类误差,选择聚类误差最小的中心集合

算法流程:

对整个数据集进行随机采样,生成m个规模为n的子集substes
for subset in subsets:
? ?使用global search策略(这里使用PAM算法)找到子集subset的k个簇中心
? ?将整个数据集Entire data的每个数据划分到距离最近的簇中心
? ?计算聚类误差(每个数据点到其簇中心的距离之和)
选择聚类误差最小的一组中心集合输入到Phase2

注:对于for循环里每个子集的聚类与计算聚类误差的操作,是并行的

第一阶段的算法示意图如下:

使用Python复现SIGKDD2017的PAMAE算法(并行k-medoids算法) - 文章图片


Phase 2

经过Phase 1的步骤,已经得到了一个近似的聚类中心集合,但是Phase 1中的中心集合是从sampled data中得到的,因此可能与真实的中心还存在一定的偏差,第二阶段就是为了对第一阶段生成的中心集合进行微调

算法思想:对于Phase 1获得的中心集合,将整个数据集的数据划分到距离最近的簇中心,然后并行更新每个簇的中心,以达到对簇中心进行微调的目的。得到的就是最终的k个簇中心

第二阶段的算法示意图如下:

使用Python复现SIGKDD2017的PAMAE算法(并行k-medoids算法) - 文章图片


实验结果

数据集大小为1万,不同中心数量的数据集,第一阶段和第二阶段聚类结果如下所示。可以看到,经过Phase 1得到的聚类效果已经很不错,再经过Phase 2微调之后,聚类效果也确实有所提高。

簇中心数量为5:

使用Python复现SIGKDD2017的PAMAE算法(并行k-medoids算法) - 文章图片

 


簇中心数量为10:

使用Python复现SIGKDD2017的PAMAE算法(并行k-medoids算法) - 文章图片

 


簇中心数量为15:

使用Python复现SIGKDD2017的PAMAE算法(并行k-medoids算法) - 文章图片

 


簇中心数量为20:

使用Python复现SIGKDD2017的PAMAE算法(并行k-medoids算法) - 文章图片


不足

本项目使用python的并行编程模拟Spark与Hadoop的MapReduce并行计算,运算速度不如MapReduce。由于Phase 1采用的是Global search的策略,运算复杂度较高,当采样子集规模较大时,Phase 1的耗时会增大。




本文由作者授权AINLP原创发布于公众号平台,点击'阅读原文'直达原文链接,欢迎投稿,AI、NLP均可。



关于AINLP


AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP君微信(id:AINLP2),备注工作/研究方向+加群目的。


使用Python复现SIGKDD2017的PAMAE算法(并行k-medoids算法) - 文章图片



推荐阅读
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
  • bat大牛带你深度剖析android 十大开源框架_请收好!5大领域,21个必知的机器学习开源工具...
    全文共3744字,预计学习时长7分钟本文将介绍21个你可能没使用过的机器学习开源工具。每个开源工具都为数据科学家处理数据库提供了不同角度。本文将重点介绍五种机器学习的 ... [详细]
  • Yarn已过时!Kubeflow实现机器学习调度平台才是未来
    来源:AI前线本文约6700字,建议阅读10分钟。本文分析了建设分布式训练平台的过程中的痛点所在,为你介绍Kubeflow与其核心组件及其 ... [详细]
  • Python之基础篇(三)
    基础篇之三:一,数据类型之set.总结:set无序,不重复。1,创建set:s{1,2,3}print(s,type(s))list1[1,2,3]s1(list1)prin ... [详细]
  • 这篇文章主要讲解了“怎么用Python写一个电信客户流失预测模型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入, ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 开发笔记:Spark Java API 之 CountVectorizer
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了SparkJavaAPI之CountVectorizer相关的知识,希望对你有一定的参考价值。 ... [详细]
  • packagecom.bjsxt.spark.others;importorg.apache.spark.SparkConf;importorg.apache.spark.api. ... [详细]
  • SparkRDD宽窄依赖及Stage划分
    1.术语解释:Master(Standalone):资源管理的主节点(进程)ClusterManager:在集群上获取资源的外部服务(例如standalone,Mesos,Yarn ... [详细]
  • steps/train_mono.sh
    定义拓扑结构、参数初始化$gmm-init-mono--shared-phones$langphonessets.int--train-feats$featssubset-fe ... [详细]
  • 集合set集合是可变的容器集合内的数据对象都是唯一的(不能重复多次的)集合是无序的存储结构,集合中的数据没有先后关系集合内的元素必须是不可 ... [详细]
author-avatar
青岛二三事-丶儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有