《Mahout算法解析与案例实战》一一3.3 Mean Shift算法

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

本节书摘来自华章计算机《Mahout算法解析与案例实战》一书中的第3章,第3.3节,作者:樊 哲,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 Mean Shift算法

3.3.1 Mean Shift算法简介
Mean Shift算法,中文可以翻译为均值偏移或均值漂移,最早是由Fukunaga在1975年发表的《The Estimation of the Gradient of a Density Function, with Application in Pattern Recognition》中被提出来,这是一篇关于概率密度梯度函数的论文。Mean Shift最开始的意思是偏移的均值向量,它是一种无参的估计方法,沿着概率梯度上升方向寻找分布的峰值。通俗地讲,它是一个这样的迭代过程:先计算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起点,继续移动,直到满足一定的条件结束。
Mean Shift算法的特性之一是该算法不需要提供一个要聚类的数目(K-Means聚类算法是需要的),而且该算法还能根据数据的特征发现任意形状的聚类簇(这点和Canopy算法不同,Canopy算法发现的是圆形簇)。该算法首先为每个数据创建一个固定半径的窗口,循环遍历每个窗口,通过一个本地的密度函数计算一个均值漂移向量(这个向量是指向最大增长速度的方向)。然后每个窗口根据计算出来的均值漂移向量移动到一个新的位置,并且开始新的循环。循环退出的条件是当通过本地密度函数计算出来的向量变到很小的时候,满足一个阈值就退出。
3.3.2 Mahout中Mean Shift算法实现原理
在Mahout中,Mean Shift算法是通过修改Canopy聚类算法得到的。该算法在Mahout 中的实现思路如下。
在讲解算法前,首先需要了解下面的参数设定:该算法使用距离阈值T1作为每个窗口的固定半径,使用距离阈值T2来决定两个canopy什么时候合并为一个(即当两个canopy的距离小于T2的时候就把它们合并)。每个canopy包含一个或者多个被限制在某个范围的点(这些点使用整数id来表示)。下面是算法的具体步骤。
1)算法在初始时为每个输入样本数据点创建一个canopy。
2)针对每一个canopy,把输入与当前canopy的距离小于距离阈值T1的归为当前canopy(比如,一共有三条记录,如果它们彼此的距离都小于T1,那么以第一条记录为canopy的点有两个,分别是记录2和记录3;以第二条记录为canopy的点也有两个,分别是记录1和记录3;以第三条记录为canopy的点也有两个,分别是记录1和记录2)。每一个canopy计算它的均值漂移向量,计算方法:使用每个canopy包含的点的全部维度相加除以包含点的数目就得到了一个新的canopy中心向量,即均值漂移向量。这个中心向量的权重通过它包含的点的数目来表示。
3)针对步骤2中新的canopy计算它们之间的距离,当距离小于阈值T2时就把它们归为一个canopy,同时相应的属性也叠加。
4)算法结束的条件:当每一个canopy的前后两次的差值都满足小于一个给定的阈值delta时,该算法结束。
5)算法结束后,剩下的canopy的数目就是聚类的数目。
该算法的流程图如图3?14所示。image

这里的mapper和reducer的操作其实是一样的,而driver主要是进行循环的触发和退出循环条件的判断,在图3?15中可以详细地看出该算法的Mapper、Reducer和Driver的主要工作。
mapper主要的工作是根据T1和T2阈值把canopy进行归类、合并,然后使用新的中心向量来更新每个canopy,输出到reducer;reducer根据map的输出进行与map同样的操作,然后返回到driver;driver根据reducer的结果进行判断,看阈值是否小于delta(当然循环的次数也是一个条件),然后根据该结果确定退出或继续循环。
image

图3?15 Mean Shift算法mapper、reducer和driver工作流
3.3.3 Mahout的Mean Shift算法实战
1.输入数据
下载数据,这里使用的数据同样是第2章中的控制图数据,包含600个样本数据,每个样本数据有60个属性列,这些数据可以分为6个类。上传到HDFS的文件如图3?4所示,这里上传到/user/test/input/synthetic_control.data中。
2.参数意义
Mean Shift算法在Mahout中的使用方式如下:

usage: meanshift [Generic Options] [Job-Specific Options]
AI 代码解读

其中[]包含的两个参数是可选的。
Generic Options参数选项和Canopy算法一样,这里不再介绍,可直接参考相关内容。
Job-Specific Options参数选项包含如下:
--input (-i ) input:任务的输入文件选项,必选。
--output (-o) output:任务的输出文件的选项,必选。
-- convergenceDelta (-cd) convergenceDelta:判断退出循环的阈值,默认是0.5,可选。
-- maxIter (-x) maxIter:最大的循环次数,必选。
--overwrite (-ow):如果出现,则对输出路径进行重写,可选。
--inputIsCanopies (-ic) inputIsCanopies:如果出现,则说明输入已经被转换为Mean-ShiftCanopies了,可选。
--distanceMeasure (-dm) distanceMeasure:距离计算的类名称,默认为Square-Euclidean,即欧氏距离平方,可选。
--kernelProfile (-kp) kernelProfile:内部计算方法类,默认是TriangularKernelProfile。
--t1 (-t1) t1:T1阈值,可选。
--t2 (-t2) t2:T2阈值,可选。
--clustering (-cl):如果出现,则对数据进行分类,可选。
--method (-xm) method:选择使用的计算方式,单机或集群,默认为集群,可选。
--outlierThreshold (-outlierThreshold) outlierThreshold:异常值阈值,可选。
--help (-h):打印此参数帮助信息,可选。
--tempDir tempDir:临时文件所存放的地方,可选。
--startPhase startPhase:开始要运行算法的阶段,可选。
--endPhase endPhase:最后要运行算法的阶段,可选。
关于inputIsCanopies参数的设置:当输入的样本数据已经转换为MeanShiftCanopies时,就不需要设置参数,否则就需要设置,然后就是在程序中执行一个InputDriver任务,这个任务就是把输入转换为MeanShiftCanopies的,且要求输入中的维度是按照空格来间隔的(一个或多个空格)。
3.运行
通过前面两个小节的内容,相信读者已经知道了如何上传数据,这里不再赘述。在正式运行该算法的调用命令之前,首先要对输入数据进行转换。进入Hadoop安装目录,执行如下命令:

./hadoop jar ../../mahout-d-0.7/mahout-examples-0.7-job.jar org.apache.mahout.clustering.conversion.meanshift.InputDriver -i /user/test/input/synthetic_control.data -o /user/test/input/real_input
AI 代码解读

上面的命令运行完成后,直接运行下面的命令:

./mahout meanshift -i /user/test/input/real_input/ -/user/test/output -ic true -cd 0.5 -x 10 -dm org.apache.mahout.common.distance.EuclideanDistanceMeasure -kp org.apache.mahout.common.kernel.TriangularKernelProfile -t1 47.6 -t2 1 -cl
由
AI 代码解读

于输入已经进行了转换,因此上面的命令设置-ic参数为true。
4.结果分析
首先查看转换后的输入数据,可以在HDFS文件系统上查看/user/test/input/real_input/part-m-00000文件,如图3?16所示。
image

图3?16 Mean Shift算法输入转换数据
由图3?16可以看出,输入已经转换为序列文件,同时输入数据的value已经被转换为ClusterWritable类型了。
截取在终端运行该算法的信息来进行分析(由于信息太多,因此只截取部分重要信息),如图3?17所示。

image
image

图3?17 (续)
由上面的结果可以看出,循环的主体运行了三次就达到了阈值,即退出了循环。每次循环的map和reduce输出的canopy个数见表3?2。
image

可以看到,程序运行到最后剩下了7个聚类中心向量,但是,由图2-5可以知道,原始数据应该是有6个类别的,这说明该算法的某些参数设置不合理。
3.3.4 Mean Shift算法小结
本节通过对Mean Shift算法的介绍,让读者了解了Mahout实现该算法的思路,使读者对该算法有一个整体的认知,同时给出了一个该算法实战演示,方便读者运行该算法来计算数据。从实战中也可以看出,该算法对于演示使用的数据效果不是很好,这也从另外一个方面说明了算法其实和参数设置也是有很大关系的。参数设置合理,就会得到比较好的结果,否则,得到的结果将会不太理想。

目录
打赏
0
0
0
0
1408
分享
相关文章
.NET 平台 SM2 国密算法 License 证书生成深度解析
授权证书文件的后缀通常取决于其编码格式和具体用途。本文档通过一个示例程序展示了如何在 .NET 平台上使用国密 SM2 算法生成和验证许可证(License)文件。该示例不仅详细演示了 SM2 国密算法的实际应用场景,还提供了关于如何高效处理大规模许可证文件生成任务的技术参考。通过对不同并发策略的性能测试,开发者可以更好地理解如何优化许可证生成流程,以满足高并发和大数据量的需求。 希望这段描述更清晰地传达了程序的功能和技术亮点。
186 13
.NET 平台 SM2 国密算法 License 证书生成深度解析
DeepSeek加持的通义灵码2.0 AI程序员实战案例:助力嵌入式开发中的算法生成革新
本文介绍了通义灵码2.0 AI程序员在嵌入式开发中的实战应用。通过安装VS Code插件并登录阿里云账号,用户可切换至DeepSeek V3模型,利用其强大的代码生成能力。实战案例中,AI程序员根据自然语言描述快速生成了C语言的base64编解码算法,包括源代码、头文件、测试代码和CMake编译脚本。即使在编译错误和需求迭代的情况下,AI程序员也能迅速分析问题并修复代码,最终成功实现功能。作者认为,通义灵码2.0显著提升了开发效率,打破了编程语言限制,是AI编程从辅助工具向工程级协同开发转变的重要标志,值得开发者广泛使用。
8167 69
DeepSeek加持的通义灵码2.0 AI程序员实战案例:助力嵌入式开发中的算法生成革新
|
14天前
|
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
35 4
|
17天前
|
员工电脑监控场景下 Python 红黑树算法的深度解析
在当代企业管理范式中,员工电脑监控业已成为一种广泛采用的策略性手段,其核心目标在于维护企业信息安全、提升工作效能并确保合规性。借助对员工电脑操作的实时监测机制,企业能够敏锐洞察潜在风险,诸如数据泄露、恶意软件侵袭等威胁。而员工电脑监控系统的高效运作,高度依赖于底层的数据结构与算法架构。本文旨在深入探究红黑树(Red - Black Tree)这一数据结构在员工电脑监控领域的应用,并通过 Python 代码实例详尽阐释其实现机制。
39 6
JVM实战—3.JVM垃圾回收的算法和全流程
本文详细介绍了JVM内存管理与垃圾回收机制,涵盖以下内容:对象何时被垃圾回收、垃圾回收算法及其优劣、新生代和老年代的垃圾回收算法、Stop the World问题分析、核心流程梳理。
JVM实战—3.JVM垃圾回收的算法和全流程
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
19 0
基于 C# 的内网行为管理软件入侵检测算法解析
当下数字化办公环境中,内网行为管理软件已成为企业维护网络安全、提高办公效率的关键工具。它宛如一位恪尽职守的网络守护者,持续监控内网中的各类活动,以确保数据安全及网络稳定。在其诸多功能实现的背后,先进的数据结构与算法发挥着至关重要的作用。本文将深入探究一种应用于内网行为管理软件的 C# 算法 —— 基于二叉搜索树的入侵检测算法,并借助具体代码例程予以解析。
45 4
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
39 7
探秘员工泄密行为防线:基于Go语言的布隆过滤器算法解析
在信息爆炸时代,员工泄密行为对企业构成重大威胁。本文聚焦布隆过滤器(Bloom Filter)这一高效数据结构,结合Go语言实现算法,帮助企业识别和预防泄密风险。通过构建正常操作“指纹库”,实时监测员工操作,快速筛查可疑行为。示例代码展示了如何利用布隆过滤器检测异常操作,并提出优化建议,如调整参数、结合日志分析系统等,全方位筑牢企业信息安全防线,守护核心竞争力。

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等