1.摘要聚类是一种统计数据分析技术,广泛应用于机器学习、数据挖掘、图像分析等领域。聚类就是将相似的对象分成不同的组或多个子集,使每个子集的成员对象具有相似的属性。所谓聚类算法实际上是一种将一对未标记数据自动划分为若干类别的方法。在应用场景中,聚类可以帮助我们解决很多计算机中的分类问题,例如:颜色类别分类、空间坐标中的密度分类、电子商务中的人群特征分类等。除了分类问题,它还可以帮助我们实现“异常检查”。什么是异常检查?我们可以理解为寻找噪声。通俗地说,就是在一锅粥里找那些老鼠屎。本文主要介绍聚类算法的实现原理以及聚类算法在D2C设计稿生成代码中的应用。2DBSCAN聚类算法DBSCAN——基于密度的带噪声聚类算法。与只适用于凸样本集聚类的K-Means相比,DBSCAN既可以用于凸样本集也可以用于非凸样本集。它可以根据一定的相似性对分散的样本进行分类,即在簇数不确定的情况下,根据样本的接近程度来划分簇。例如:我们需要对“100、101、123、98、200、203、220”的数据进行聚类。如果聚类最小值为2,那么如果我们将聚类密度阈值设置为30。那么“100、101、123、98”和“200、203、220”将被分成2个聚类。当聚类密度阈值为10时,则“100、101、98”、“200、203”分为两个聚类,“123”、“220”属于噪声点(异常数据)2.1核心思想DBSCAN算法主要是找出样本点中所有的密集点区域,我们称这些密集区域为簇。那么不在稠密区域的样本点称为噪声点。所以DBSCAN除了帮你分类,还能找出“一锅粥里的老鼠屎”。2.2算法参数说明邻域半径Eps:指每个样本点的搜索半径。对于在搜索半径内扫描的其他样本点,我们可以理解为扫描的样本点靠近中心点。Minimumnumberofpointsminpoints:可以聚合成簇的最小样本数,可以理解为每个簇需要的最少样本数。在上图中,我们可以看到,在半径R内红色和蓝色扫描的样本点数>最小点数minpoints,而黄色扫描的样本点数小于minpoints。2.3点的类别核心点邻域半径Eps的类别描述样本点数>=最小点数minpoints点。边界点是不属于核心点但在核心点邻域内的点。噪声点既不是核心点也不是边界点。2.4点间关系表示密度直接连接到以A为核心点,而B在A的邻域Eps内,则A到B的密度直接连接。任何核心点到其邻域Eps内的边界点都是密度直接的。如果存在核心点C、D、E、F,则密度可达。C到D密度直达,D到F密度直达,E到F密度直达。那么我们就可以称C到F密度可达。而F(核心点)到G(边界点)也是密度直达的,C到G也是密度可达的。密度连通如果存在一个核心点使得样本点X和样本点Y都是密度可达的,那么我们称X和Y密度连通。如果非密度连接不属于密度连接,则为非密度连接,两个非密度连接点属于不同的簇,或者是噪声点。2.5算法实现步骤根据密度可达关系导出的最大密度连通样本集就是我们最终聚类的一个类别,或者说是一个簇。在实现上,我们可以分为以下四个步骤:第一步:选择任意一个没有类别的核心点作为初始点;Step2:找出核心点能达到密度的样本集,即找到核心点邻居域中的所有边界点此时都可以成为一个簇;Step3:继续寻找另一个没有类别的核心点,继续重复Step2的操作;第四步:直到所有点。举个更形象的例子:你可以假设一群人中有一个人做传销(_核心点_)。线下发展需要找N个人(_minPoints_),所以他就在你身边(_neighborhood_)找人发展下线,然后下线(边界点)会继续找下线,直到身边没有人为止.3LayoutAlgorithm与DBSCAN的结合简单介绍完DBSCAN的算法概念和实现后,我们来谈谈聚类算法在Deco布局算法中的应用场景。布局算法的核心其实就是分组。如何根据设计稿中各个模块的位置信息和大小来判断能否成组是关键。简单的说就是如何用一个DIV准确的包裹一堆节点。如上图所示,设计稿上有11个白色块状节点,我们肉眼可以看到,由于每个节点之间的距离关系很近,上下部分是分开的。但这仅限于我们的视觉,那么机器的视觉又怎么能算得上是分离的呢?我们需要刚才提到的DBSCAN聚类算法来生成簇,所以我们的目标是让上面的部分形成一个簇,下面的部分也形成一个簇。刚才我们提到DBSCAN是以点与点之间的欧式距离作为紧密关系的依据,那么我们看节点的话,我们换个思路,改成块与块之间的最短距离作为紧密关系的依据。3.1点距离>块距离其实获取块与块之间的最短距离是比较简单的。分三种情况:第一种:两个方块相交,那么距离实际为0;第二种:A块和B块在top/bottom/left/right,所以只需要获取两者之间的距离即可;第三种:A块和B块在左上/左下/右上/右下,然后用勾股定理求出两个相对顶点的距离。改造后的效果如下图所示。根据聚类算法的实现,我们最终可以将上下分为两个簇:3.2邻域半径的??推导DBSCAN聚类算法除了输入之外,还有样本数据集,数据对象个数阈值MinPoints和邻域半径Eps,那么在皮带布局算法中,邻域半径Eps的合适值是多少?不能是固定值。有的模块整体间距较大,有的间距较小。当我们在实际布局中聚合块时,我们需要找到这个动态邻域半径Eps。第一步:我们统计一下样本数据集之间的距离,首先求这5个block之间的最短距离:Module1Module2Module3Module4Module5Module1-557210Module25-75100module357-5214module4755-107module5210100214107-第二步:然后我们可以根据距离矩阵表得到每个模块与其最近的模块之间的最短距离:模块模块1模块2模块3模块4模块5最短距离5555100第三步:在这个一堆数据,我们需要提取更多更有效的数据作为我们的Eps值,并去掉一些干扰项:根据标准差的计算公式,我们取1倍的标准差作为过滤项过滤掉满足大多数样本的数据集,取[5,5,5,5,100]求其标准差。我们可以得到总体标准差为38,平均值为24。那么我们以一个标准差为基础,可以得出在一个标准差的范围内,最大值为24+38=62,那么我们就可以将62作为我们在这个样本集中的邻域半径Eps。3.3算法优化基于上述算法修改,我们实际上在布局上实现了相对可靠的模块聚类和拆分。那么在实际算法的应用中,会针对邻域半径Eps的动态生成,对实际场景的布局进行优化:例如如下布局:水平间距为5,垂直间距为10:那么如果最短距离的标准差其实8个模块之间的最短距离是5,最后计算出来的Eps也是5,所以很有可能会出现上下线分离的情况。因此,在实际应用中,在生成标准差样本的过程中,按照一定的规则,水平距离的“10”也被考虑在内,计算为标准差样本。4、技术落地以上技术已经在Deco智能代码生成项目实现。Deco是我们团队在“前端智能化”方向上的探索。能够解析设计稿,直接生成多端代码(Taro/React/Vue)。Deco可以让前端工程师不必再花费大量精力在设计稿上,大大节约开发成本,为输出更多的多终端页面提供有力支持,为降低业务成本、提高效率带来巨大推动力。在过去的一年里,德科成功登陆京东的两大促销活动。在个性化活动场地建设方面,研发效率提升48%。有兴趣的同学可以去Deco官网体验一下。另外,我还会附上保姆级Deco体验教程。5.总结本文主要介绍DBSCAN的实现原理。简介中给出了具体的代码实现。如果你对这块感兴趣,网上有很多具体的代码实现逻辑。主要目的是给大家讲一下聚类算法的实现思路,以及聚类算法在D2C布局中的应用。除了DBSCAN等基于密度的聚类算法,在D2C布局算法上其实还有很多算法等待我们挖掘。参考资料:[1]【DBSCAN密度聚类算法】(https://www.cnblogs.com/pinar...)[2]【DBSCAN聚类算法-机器学习(理论+图解+python代码)】(https://www.cnblogs.com/pinar...)/blog.csdn.net/huacha_...)[3]【DBSCAN详解】(https://blog.csdn.net/hansome...)欢迎关注傲兔实验室博客:aotu.io或关注Ao-ConvexLabs公众号(AOTULabs)和不定期推送文章。
