近期忙着在公司捣腾基于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超赞聚类的更多相关文章

  1. 二分查找——没有想象中的容易(详解各种变式,超深度理解,c++)

    int binarySearch(int[] nums, int target) { int left = 0; int right = nums.length - 1; // 注意 while(le ...

  2. 【zigbee无线通信模块步步详解】ZigBee3.0模块建立远程网络控制方法

    本文以路灯控制应用为例,简述ZigBee3.0模块使用流程. 一.建立网络 1.通过USB转串口模块将出厂的ZigBee自组网模块连接,打开上位机软件"E180-ZG120A-Setting ...

  3. Science上发表的超赞聚类算法

    本博客已经迁往http://www.kemaswill.com/, 博客园这边也会继续更新, 欢迎关注~ 作者(Alex Rodriguez, Alessandro Laio)提出了一种很简洁优美的聚 ...

  4. Science上发表的超赞聚类算法(转)

    作者(Alex Rodriguez, Alessandro Laio)提出了一种很简洁优美的聚类算法, 可以识别各种形状的类簇, 并且其超参数很容易确定. 算法思想 该算法的假设是类簇的中心由一些局部 ...

  5. Science发表的超赞聚类算法

    作者(Alex Rodriguez, Alessandro Laio)提出了一种很简洁优美的聚类算法, 可以识别各种形状的类簇, 并且其超参数很容易确定. 算法思想 该算法的假设是类簇的中心由一些局部 ...

  6. Angular Npm Package.Json文件详解

    Angular7 Npm Package.Json文件详解   近期时间比较充裕,正好想了解下Angular Project相关内容.于是将Npm官网上关于Package.json的官方说明文档进行了 ...

  7. 高斯消元法(Gauss Elimination)【超详解&模板】

    高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...

  8. SILC超像素分割算法详解(附Python代码)

    SILC算法详解 一.原理介绍 SLIC算法是simple linear iterative cluster的简称,该算法用来生成超像素(superpixel) 算法步骤: 已知一副图像大小M*N,可 ...

  9. Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型

    Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 ...

随机推荐

  1. 网站压力测试工具Webbench介绍

    webbench简单介绍: webbench是由 Lionbridge公司开发的出色的站点压力測试工具.它能測试处在同样硬件上,不同服务的性能以及不同硬件上同一个服务的执行状况.webbench不但能 ...

  2. 面向服务的架构(SOA)

    SOA架构基础概念 面向服务的架构(SOA) 在深入探讨什么是面向服务的架构(SOA)之前,先建立一些基本的概念和术语的基本描述而非严格定义,所以也许有些定义在业内还存留争议,此处暂且忽略. 架构基础 ...

  3. MongoDB(三)——CRUD

    MongoDB作为非关系型数据库.还是传统数据库的增删改查有很大的差别的.这里仅仅是将知识点进行了一下提纲挈领,实际用的时候.我们百度一下具体使用方法就可以. 先看大的几个方面: 一.对于里边的插入和 ...

  4. MemberwishClone学习

    /* * Created by SharpDevelop. * User: My little flower basket * Date: 2013/7/12 * Time: 9:37 * * To ...

  5. lua三底漆:lua转让c/c++库(动态链接模式)

    dll按功能luaL_openlib出口,然后lua使用package.loadlib导入库函数,基本就是这么个过程,以下上代码来说明一切. #include "stdafx.h" ...

  6. 走向DBA[MSSQL篇] 面试官最喜欢的问题 ----索引+C#面试题客串

    原文:走向DBA[MSSQL篇] 面试官最喜欢的问题 ----索引+C#面试题客串 对大量数据进行查询时,可以应用到索引技术.索引是一种特殊类型的数据库对象,它保存着数据表中一列或者多列的排序结果,有 ...

  7. MVC5中使用SignalR2.0实现实时聊天室

    原文 MVC5中使用SignalR2.0实现实时聊天室 有时候需要浏览器和服务端保持实时的通讯(比如在线聊天),SignalR的出现让这一切变得非常简单.它能够让服务端向客户端实时的推送消息.如果用户 ...

  8. jQuery的使用及关于框架造型(转)

    Introduction 正如jQuery所宣称的一样,Write Less, Do More.很多时候我们喜欢用它来解决问题.但增加一个库必然意味着更大的网络负担,意味着更高的页面初始载入时间.并且 ...

  9. Android Studio常见报错及处理办法

    在Android Studio上点了update,系统自动升级,自动重启Android Studio后,以前的项目Gradle正常编译: Unable to start the daemon proc ...

  10. ORA-00838: Specified value of MEMORY_TARGET is too small(转)

    1. 测试环境OS: RHEL5U5(32bit)DB: Oracle 11.2.0.3.0(32bit) 2.   异常原因. 2.1 oracle 11g默认sga_target为0,如下图, O ...