步步详解近期大火的density_peak超赞聚类
近期忙着在公司捣腾基于SOA的应急框架,还是前两周才在微博上看见了density_peak,被圈内好些人转载。
由于这个算法的名字起的实在惹眼,都没好意思怎么把这个算法名字翻译成中文,当然更惹眼的是,其极具杀伤力的案例介绍和公式简写,光看些许的中文翻译几乎无法入手,虽然也得知也有不少同学将其实践,但分享的经验不多,所以这才具有挑战和摸索的意义。
于是,中午吃了碗水饺,从E文入手开始捣腾。
整个过程涉及的知识点还是非常宽泛,再次要感谢美帝,百度文库的贡献。
1,density_peak宣传效果
前文中提到了其极具杀伤力的案例证明,如下图所示。经常DM的同学可能更清楚,4张图论难度D>C/B>A,即便是有监督算法看到B/D上至少要糊弄半天,更别说其他一些知名的无监督算法在B/D上几乎完败。所以我们的实验直接围绕最简单的A和最复杂的D进行论证和剖析。
2,density_peak实现原理
每个点(样本)具备两大要素。原文的解释如下:
1, 密度:在指定Dc(截断面或者半径内)出现的邻居数量。
2, 距离值:与其他比自己“密度”大的点的距离的最小值。(听上去很拗口,到后面看代码一目了然)。
所以,我们需要定义这样一个结构体来描述样本:
什么是距离?距离就是欧几里得距离,这个自己百度。如下图:
什么是密度:仔细看上图中,红点是肉眼判断的簇中心点,如果以这个点为圆心,半径0.5厘米划一个圆,在圆内的邻居数量就是density_peak的密度。
什么是距离值:原文的如下:
继续仔细看上上图,就是点到每个自己密度大的点的集合中的最小值(还是拗口,好吧,后面有代码解释)。
当确认这两个参数后,就能显而易见簇中心点(非常神奇!),同时就能继续为其圈定同类,最终完成标签打印。
3, density_peak过程解析
3.1 生成距离值矩阵,顺带完成rhu值判定。
这一步的全遍历无法逃脱,如果你有100个样本,就要进行100^2次运算和内存空间,这个得有心理准备。
实施完毕后,会有一个庞大的double型阵列以及对str_point样本的rhu值的更新。
3.2 完成delta距离值的计算
前面对距离值已有介绍,不妨直接看下代码实现。前半段for完成各密度档位中的最小值的设定。后半段for完成密度档位比自己高的距离值集合,再通过集合取最小值。由于物理上必存在一个点是最最中心点的,所以它的距离就是该点二维指针中(也就是前面Marix)行内最大的距离
最终会得到如下表格:
3.3 投影rhu和delta
这个很简单,也是算法的最精华的部分,把所有高维数据的归维处理。做EXCEL散点图:
图中可以看到上述3个红圈的点就是最具嫌疑的中心点。因为它的密度高,与其他密度点间距大。
3.4 圈定簇范围
原文中使用了hola这个词,大家可以把它当做魔兽中的光环即可。这个光环的圈定也是很有讲究,作者没有明说,可能怕该算法影响了其简单整洁的形象,也许说明了作者很在乎这个算法的社会影响力。当然炒作还是要炒作的。
我们回过头看上图,把中心点作为入参,把Dc作为圈定条件,循环迭代,直至没有点符合圈定范围。这里需要使用(BFS),广度优先遍历(这里抛砖,看看有无其他同学有更好的圈定算法)。
至此,density_peak 暂时搞一段落。但还没完,真正可怕的在后面!~
3.4 类极函数样本的挑战
先看极坐标函数的样本,如下图所示。肉眼看分两类。0-179度属1类,180-359度属1类。
楼主用A模型代码的原封不动扫描类极样本,发现效果不好,无法准确分类。
需要完成10多次探测才有分类结果,这个肯定有问题,但问题出在哪儿?想了想还是Dc引起,因为用了A模型大厘米的Dc,好这次改小。粗看肉眼还是分不出,别急!
从实际数上看TOP2已能轻易区分数据。
结束了吗?不,真正可怕的是,能够将该算法能够将N分类精确拆分的就像crossvaldition那样,而且这个中心点就是曲线的最大拐点。
靠!太恐怖了。
4,补充说明
1, 文中的原始数据在http://pan.baidu.com/s/1qWkC3SC可以下载,极坐标可按=5*COS(RADIANS($D5)) excel语法生成,其他代码我就不放了。
2, NB的算法未必充满各种难懂的公式,这让我想起了小时候参加KOF97的比赛,前三名只用A/B/C。
3, 美帝的研究和创造能力真心恐怖。
步步详解近期大火的density_peak超赞聚类的更多相关文章
- 二分查找——没有想象中的容易(详解各种变式,超深度理解,c++)
int binarySearch(int[] nums, int target) { int left = 0; int right = nums.length - 1; // 注意 while(le ...
- 【zigbee无线通信模块步步详解】ZigBee3.0模块建立远程网络控制方法
本文以路灯控制应用为例,简述ZigBee3.0模块使用流程. 一.建立网络 1.通过USB转串口模块将出厂的ZigBee自组网模块连接,打开上位机软件"E180-ZG120A-Setting ...
- Science上发表的超赞聚类算法
本博客已经迁往http://www.kemaswill.com/, 博客园这边也会继续更新, 欢迎关注~ 作者(Alex Rodriguez, Alessandro Laio)提出了一种很简洁优美的聚 ...
- Science上发表的超赞聚类算法(转)
作者(Alex Rodriguez, Alessandro Laio)提出了一种很简洁优美的聚类算法, 可以识别各种形状的类簇, 并且其超参数很容易确定. 算法思想 该算法的假设是类簇的中心由一些局部 ...
- Science发表的超赞聚类算法
作者(Alex Rodriguez, Alessandro Laio)提出了一种很简洁优美的聚类算法, 可以识别各种形状的类簇, 并且其超参数很容易确定. 算法思想 该算法的假设是类簇的中心由一些局部 ...
- Angular Npm Package.Json文件详解
Angular7 Npm Package.Json文件详解 近期时间比较充裕,正好想了解下Angular Project相关内容.于是将Npm官网上关于Package.json的官方说明文档进行了 ...
- 高斯消元法(Gauss Elimination)【超详解&模板】
高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...
- SILC超像素分割算法详解(附Python代码)
SILC算法详解 一.原理介绍 SLIC算法是simple linear iterative cluster的简称,该算法用来生成超像素(superpixel) 算法步骤: 已知一副图像大小M*N,可 ...
- Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型
Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 ...
随机推荐
- 开源Math.NET基础数学类库使用(09)相关数论函数使用
原文:[原创]开源Math.NET基础数学类库使用(09)相关数论函数使用 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4 ...
- 深入理解学习Git工作流(转)
个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心中的困惑迎刃而解,于是我将这部分资料进行整理放到了github上,欢迎st ...
- android 视频通话开启呼叫等待后,来第三方的视频通话,接通后通话时间一直显示为0,过几秒之后视频通话自己主动挂断
开启通话设置视频通话的"来电等待"; 步骤1:測试机和配合机A处于视频通话过程中; 步骤2:配合机B向測试机呼出视频电话; 步骤3:測试机接听配合机B的视频来电; 现象:视频通话过 ...
- 一个简单的RPC框架
一个 系统模型 二.数据库代码实现 1. mkdir database cd database vim dbInit.c /* * * Database Init tool * */ #include ...
- Vim经常使用技巧总结1
我的主力博客:半亩方塘 1. 反复上次的操作在普通模式下用 . 命令 2. 取消上次的操作在普通模式下用 u 命令 3. 整行删除在普通模式下用 dd 命令,此命令在删除行后 不进入插入模式 4. 整 ...
- 多快好省的做个app开发
从技术经理的角度算一算,如何可以多快好省的做个app [导读]前端时间,一篇“从产品经理的角度算一算,做个app需要多少钱”的文章在网上疯传,可见大家对互联网创业的热情!这次,从一名技术经理的角度再给 ...
- 关于sql中去换行符的问题
今天要用bootstrap开发一个网页,要使用到JSON,但是JSON的格式不正确,然后在http://www.bejson.com/[Be JSON]中测试了一下JSON. 发现JSON中多了一个换 ...
- Ehcache详细解读(转)
Ehcache 是现在最流行的纯Java开源缓存框架,配置简单.结构清晰.功能强大,最初知道它,是从Hibernate的缓存开始的.网上中文的EhCache材料 以简单介绍和配置方法居多,如果你有这方 ...
- nodejs 模拟form表单上传文件
使用nodejs来模拟form表单进行文件上传,可以同时上传多个文件. 以前项目里有这个方法,最近在客户那里出问题了,同事说,这个方法从来就没管用过,SO,用了一天时间把这个方法给搞出来了(觉得花费的 ...
- HDU 3313 Key Vertex(dfs + bfs)
HDU 3313 Key Vertex 题目链接 题意:一个有向无环图.求s,t之间的割点 思路:先spfa找一条最短路出来,假设不存在.就n个都是割点. 然后每次从s进行dfs,找到能经过最短路上的 ...