1.前言聚类是一种统计数据分析技术,广泛应用于机器学习、数据挖掘、图像分析等众多领域。聚类就是将相似的对象分成不同的组或多个子集,使每个子集的成员对象具有相似的属性。所谓聚类算法实际上是一种将一对未标记数据自动划分为若干类别的方法。在应用场景中,聚类可以帮助我们解决很多计算机中的分类问题,例如:颜色类别分类、空间坐标中的密度分类、电子商务中的人群特征分类等。除了分类问题,它还可以帮助我们实现“异常检查”。什么是异常检查?我们可以理解为寻找噪声点。通俗点说就是在一锅粥里找那些老鼠屎。本文主要介绍聚类算法的实现原理以及聚类算法在D2C设计稿生成代码中的应用。2.DBSCAN聚类算法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”分为2个聚类,“123”、“220”为噪声点(异常数据)。2.1核心思想DBSCAN算法主要是找出样本点中所有的密集区域,我们称这些密集区域为簇簇。那么不在稠密区域的样本点称为噪声点。所以DBSCAN除了帮你分类,还能找出“一锅粥里的老鼠屎”。2.2算法参数说明邻域半径Eps:指每个样本点的搜索半径。对于在搜索半径内扫描的其他样本点,我们可以理解为扫描的样本点靠近中心点。Minimumnumberofpointsminpoints:可以聚合成簇的最小样本数,可以理解为每个簇需要的最少样本数。在上图中,我们可以看到,在半径R内红色和蓝色扫描的样本点数>最小点数minpoints,而黄色扫描的样本点数小于minpoints。2.3点的类型核心点邻域半径内的样本点个数Eps>=最小点数minpoints点边界点不属于核心点但某个核心点邻域内的点既不是核心点也不是noisepointsBoundarypoint2.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)开发线下,那么线下(边界点)会继续寻找线下,直到周围没有人为止。3.布局算法与DBSCAN的结合在简单介绍了DBSCAN的算法概念和算法实现之后,接下来说说聚类算法在Deco布局算法中的应用场景。布局算法的核心其实就是分组。如何根据设计稿中各个模块的位置信息和大小来判断能否成组是关键。简单的说就是如何用一个DIV准确的包裹一堆节点。如上图所示,设计稿上有11个白色块状节点,我们肉眼可以看到,由于每个节点之间的距离关系很近,上下部分是分开的。但这仅限于我们的视觉,那么如何让机器视觉也单独考虑呢?我们需要刚才提到的DBSCAN聚类算法来生成簇,所以我们的目标是让上面的部分形成一个cluster簇,下面的部分也形成一个cluster簇。刚才我们提到DBSCAN是以点与点之间的欧式距离作为紧密关系的依据,那么我们看节点的话,我们换个思路,改成块与块之间的最短距离作为紧密关系的依据。3.1点距离>块距离其实获取块与块之间的最短距离是比较简单的。分三种情况:第一种:两个方块相交,那么距离实际为0;第二种:A块和B块在top/bottom/left/right,所以只需要获取两者之间的距离即可;第三种:A块和B块在左上/左下/右上/右下,然后用勾股定理求出两个相对顶点的距离。改造后的效果如下图所示。根据聚类算法的实现,我们最终可以将上下分为两个簇:3.2邻域半径的??推导DBSCAN聚类算法除了输入,还有样本数据集,数据对象个数的阈值MinPoints和邻域半径Eps,那么在带状布局算法中,邻域半径Eps取多少合适呢?它不能是固定值。有的模块整体间距较大,有的间距较小。当我们在实际布局中聚合块时,我们需要找到这个动态邻域半径Eps。第一步:我们先对样本数据集之间的距离进行统计,首先找出这5个block之间的最短距离。模块1、模块2、模块3、模块4、模块5、模块1-557210、模块25-75100、模块357-5214、模块4755-107、模块5210100214107-第2步:然后我们可以得到每个模块最接近根据距离矩阵表给它模块之间的最短距离。ModuleModule1Module2Module3Module4Module5最短距离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官网[1]体验一下。另外,我还会附上保姆级Deco体验教程。5.总结本文主要介绍DBSCAN的实现原理。简介中给出了具体的代码实现。如果你对这块感兴趣,网上有很多具体的代码实现逻辑。主要目的是给大家讲一下聚类算法的实现思路,以及聚类算法在D2C布局中的应用。除了DBSCAN等基于密度的聚类算法,在D2C布局算法上其实还有很多算法等待我们挖掘。
