一种自动识别肘部法则中最优K值的方法与流程

文档序号:14129164阅读:7355来源:国知局
一种自动识别肘部法则中最优K值的方法与流程

本发明涉及一种自动识别肘部法则中最优k值的方法,特别涉及一种结合利用机器学习中无监督学习中常用的k-means聚类算法、肘部法则以及通过0-10的规则化对平均畸变程度进行规则化、将0-10规则化后的平均畸变程度与对应的分类簇数量封装成数据对以及利用余弦定理求出连续三个数据点之间的夹角等来自动识别肘部法则中预估出来的最优k值的方法,属于机器学习中无监督聚类学习领域。



背景技术:

随着信息技术的发展以及人们产生的数据越来越多,人类逐渐进入了大数据时代。人们通过机器学习来对大数据进行研究,进而从大数据中获取新的知识或技能。尤其是通过机器学习中的无监督学(unsupervisedlearning)来挖掘或发现大数据中的新知识或技能。

无监督学习与监督学习不同,无监督学习不需要对数据进行标记。无监督学习模型可以帮助我们发现数据的“群落”,同时也可以寻找“离群”的样本,这是海量数据处理中非常实用的技术。数据聚类是无监督学习的主流应用之一。聚类是一个将整体的数据对象划分为以类或簇存在的包含局部数据对象的过程。聚类源于数据挖掘、统计学、生物学、机器学习等众多领域,现如今聚类分析已经广泛应用于模式识别、数据分析以及图像处理等领域。目前的聚类算法可以归纳为如下几类:k均值聚类(k-meansclustering)、高斯混合聚类(mixture-of-gaussianclustering)、密度聚类(density-basedclustering)、层次聚类(hierarchicalclustering)等算法,但是最为经典并且易用的聚类模型是k均值(k-means)算法。

但是k-means聚类算法也不可避免地存在缺点:无法事先确定合适的聚类数目,导致聚类质量不高。获取良好聚类效果关键在于确定最佳的聚类数目。当使用该算法时需要我们预先设定聚类的个数,找到或设定聚类的个数往往需要经验或者通过使用肘部方法来找到最佳的聚类个数。然而肘部方法往往需要通过观察法来粗略地预估相对合理的类簇个数,肘部方法需要借助观察法来找出最佳的类簇数量,这就影响了其在自动化系统中的使用以及其的推广使用。



技术实现要素:

本发明要解决的技术问题是提供一种自动识别肘部法则中最优k值的方法,首先通过给k-means指定不同的聚类数计算出样本数据对应的重心,根据重心和肘部法则计算出样本数据的平均畸变程度,进而计算相邻两个平均畸变程度的差值,找出相邻两个平均畸变程度差值中的最大值,并通过最大值对应的下标得到肘部法则为k-means聚类算法找到的最优k值。该方法降低了对人工识别肘部法则中得到最优k值的依赖,同样有利于肘部法则在自动化系统中为聚类提供最优k值的应用和推广。

本发明采用的技术方案是:一种自动识别肘部法则中最优k值的方法,包括如下步骤:

(1)设定k-means聚类算法中要查找最优k值的范围[1,m];

(2)计算设定范围聚类数对应的平均畸变程度;

(3)对计算得到的平均畸变程度进行0-10的规则化转换;

(4)将0-10规则化后的平均畸变程度与范围[1,m]封装成数据对;

(5)利用余弦定理求上述封装成的连续三个数据对之间的夹角;

(6)找出最小的夹角;

(7)利用最小的夹角得到最优的k值。

所述的一种自动识别肘部法则中最优k值的方法的具体步骤如下:

step1、设定k-means聚类算法中要查找最优k值的范围range:[1,2,…,m];

step2、初始化k=1,且生成一个长度为m且所有元素为0的平均畸变程度列表mdl;

step3、如果k∈range,执行step4;如果则跳过step4-step7,执行step8;

step4、用聚类数k来实例化sklearn.cluster.kmeans得到实例对象kmeans;

step5、通过实例对象kmeans拟合n个样本数据,并得到对应的k个重心;

step6、利用k-means算法的优化目标函数、得到的k个重心以及样本数据来求样本数据的平均畸变程度,并将求得的平均畸变程度追加到平均畸变程度列表中;

step7、k=k+1,重复step3-step7;

step8、初始化j=0,生成一个长度为m且所有元素为0的0-10的规则化平均畸变程度列表rmdl;

step9、利用规则化公式将平均畸变程度列表中的值规则化到0-10之间,并将其追加到0-10的规则化平均畸变程度列表rmdl中;

step10、将0-10规则化平均畸变程度列表rmdl中中的值与对应的聚类簇封装成对应的二维数据点,并依次追加到数据点列表pl中;

step11、利用余弦定理公式计算上述相邻的三个数据点之间的角,并将其追加到角列表al中;

step12、找出al中最小的角mina,得到mina在al中的下标minai,将minai加上2即为在上述指定范围内找到的最优k值。

本发明的有益效果是:

聚类方法能够发现数据间的关系,将相似的归为一类,相异的归为一类,现有的肘部法则需要通过人工观察肘部方法画出的图进而识别最佳的聚类数k,本发明在将现有肘部法则中求出的平均畸变程度规则化到[0,10],然后将规则化后的平均畸变程度与要查找范围内的k值组成相应的数据点,并通过余弦定理来求连续三个点之间的夹角进而找出设定范围内的最佳聚类数k,而不再需要通过人工观察去识别指定范围内的最佳聚类数k。这样只是增加了少量的计算量,就可以达到能够自动识别肘部法则中的最优k值,进而降低了需要通过人工去观察肘部法则得到的曲线中的肘点(即最优k值)的依赖,进而使本发明的方法来替代现有的肘部法则来识别指定范围内最优的k值,进而使其可以应用到自动的聚类应用系统中。

附图说明

图1是本发明自动识别肘部法则中最优k值的方法的总体流程图;

图2是本发明中用到的具有3个类簇的90个样本数据集;

图3是本发明中90个样本数据的散点图;

图4是本发明通过肘部法则得到的需要人工干预的平均畸变程度与聚类数的关系图;

图5是本发明得到的最优k值之后在需要人工干预的平均畸变程度与聚类数的关系图上标注最优k值之后的图,圆圈处对应的聚类数即为本发明得到的最优k值。

具体实施方式

下面集合附图和具体实施方式,对本发明作进一步的说明。

实施例1:如图1-5所示,一种自动识别肘部法则中最优k值的方法,包括如下步骤:

(1)设定k-means聚类算法中要查找最优k值的范围[1,m];

(2)计算设定范围聚类数对应的平均畸变程度;

(3)对计算得到的平均畸变程度进行0-10的规则化转换;

(4)将0-10规则化后的平均畸变程度与范围[1,m]封装成数据对;

(5)利用余弦定理求上述封装成的连续三个数据对之间的夹角;

(6)找出最小的夹角;

(7)利用最小的夹角得到最优的k值。

一种自动识别肘部法则中最优k值的方法的具体步骤如下:

step1、设定k-means聚类算法中要查找最优k值的范围range:[1,2,…,m];

step2、初始化k=1,且生成一个长度为m且所有元素为0的平均畸变程度列表mdl;

step3、如果k∈range,执行step4;如果则跳过step4-step7,执行step8;

step4、用聚类数k来实例化sklearn.cluster.kmeans得到实例对象kmeans;

step5、通过实例对象kmeans拟合n个样本数据,并得到对应的k个重心;

step6、利用k-means算法的优化目标函数、得到的k个重心以及样本数据来求样本数据的平均畸变程度,并将求得的平均畸变程度追加到平均畸变程度列表中;

step7、k=k+1,重复step3-step7;

step8、初始化j=0,生成一个长度为m且所有元素为0的0-10的规则化平均畸变程度列表rmdl;

step9、利用规则化公式将平均畸变程度列表中的值规则化到0-10之间,并将其追加到0-10的规则化平均畸变程度列表rmdl中;

step10、将0-10规则化平均畸变程度列表rmdl中中的值与对应的聚类簇封装成对应的二维数据点,并依次追加到数据点列表pl中;

step11、利用余弦定理公式计算上述相邻的三个数据点之间的角,并将其追加到角列表al中;

step12、找出al中最小的角mina,得到mina在al中的下标minai,将minai加上2即为在上述指定范围内找到的最优k值。

下面结合具体例子对本发明的方案进行详细描述:

例1:所述自动识别肘部法则中最优k值的方法的具体步骤如下:

step1、设定k-means聚类算法中要查找最优k值的范围range:[1,2,…,m];具体的:

设定k-means聚类算法中要要查找最优k值的范围range为:[1,2,3,4,5,6,7,8,9,10];

step2、初始化k=1,且生成一个长度为m且所有元素为0的平均畸变程度列表mdl;具体的:

将k初始化为1,即k=1;生成一个长度为10且所有元素为0的平均畸变程度列表mdl为:mdl=[0,0,0,0,0,0,0,0,0,0];

step3、如果k∈range,执行step4;如果则跳过step4-step7,执行step8;具体的:

例如当k=1时,1∈[1,2,3,4,5,6,7,8,9,10],即k∈range,执行step4(当k=2,3,4,5,6,7,8,9,10时与k=1时的情况类似);例如当k=11时,则跳过step4-step7,执行step8;

step4、用聚类数k来实例化sklearn.cluster.kmeans得到实例对象kmeans;具体的:

scikit-learn(http://scikit-learn.org/dev/)是python的一个开源机器学习模块,它建立在numpy,scipy和matplotlib模块之上。scikit-learn最大的特点就是为用户提供各种机器学习算法接口,可以让用户简单、高效地进行数据挖掘和数据分析。例如用聚类数k=3来实例化sklearn.cluster.kmeans(n_clusters=k),得到实例对象kmeans;

step5、通过实例对象kmeans拟合n个样本数据,并得到对应的k个重心;具体的:

通过python的模块numpy中的均匀分布函数随机生成3个簇(即3类样本数据),每类样本数据有30个二维数据点,生成的90个样本数据如图2所示,图3是这90个样本数据画成的散点图。例如此时的聚类数k=3,通过实例对象kmeans拟合90个样本数据,得当对应的k=3个重心为:[[59.88920096,60.12720929],[10.82111511,10.09584162],[34.77577557,35.55172302]];

step6、利用k-means算法的优化目标函数、得到的k个重心以及样本数据来求样本数据的平均畸变程度,并将求得的平均畸变程度追加到平均畸变程度列表中,具体的:

给定样本数据集d={x1,x2,…,xn},假设聚类的簇划分c={c1,c2,…,ck},k-means算法的目标是最小化平方误差:其中,是簇ck的均值向量。我们称平方误差sse为畸变程度,利用得到的sse来平均畸变程度并将得到的平均畸变程度追加到平均畸变程度列表中mdl中。例如当聚类数k为3时,计算得到的md为:3.7133694541841544,并将该md存入mdl中合适的位置,此时mdl中的值为:[24.573797126997469,13.129398357186458,3.7133694541841544,0,0,0,0,0,0,0];

step7、k=k+1,重复step3-step7;具体的:

当在重复step3-step7的过程中生成的聚类数k对应的重心(centroids)和平均畸变程度列表mdl中的值分别为:

当k=1时:

centroids:[[35.16203055,35.25825798]];

mdl:[24.573797126997469,0,0,0,0,0,0,0,0,0];

当k=2时:

centroids:[[59.88920096,60.12720929],[22.79844534,22.82378232]];

mdl:[24.573797126997469,13.129398357186458,0,0,0,0,0,0,0,0];

当k=3时:

centroids:[[10.82111511,10.09584162],[59.88920096,60.12720929],[34.77577557,35.55172302]];

mdl:[24.573797126997469,13.129398357186458,3.7133694541841544,0,0,0,0,0,0,0];

当k=4时:

centroids:[[10.82111511,10.09584162],[59.76097219,57.91556934],[34.77577557,35.55172302],[60.0815441,63.44466922]];

mdl:[24.573797126997469,13.129398357186458,3.7133694541841544,3.3965657236220546,0,0,0,0,0,0];

当k=5时:

centroids:[[34.77577557,35.55172302],[10.34826121,7.40111566],[57.23437332,60.20981542],[62.54402859,60.04460317],[11.23486227,12.45372683]];

mdl:[24.573797126997469,13.129398357186458,3.7133694541841544,3.3965657236220546,3.084676420375617,0,0,0,0,0];

当k=6时:

centroids:[[59.76097219,57.91556934],[10.34826121,7.40111566],[32.33276115,36.31919355],[36.9134132,34.8801863],[11.23486227,12.45372683],[60.0815441,63.44466922]];

mdl:[24.573797126997469,13.129398357186458,3.7133694541841544,3.3965657236220546,3.084676420375617,2.8254436764486108,0,0,0,0];

当k=7时:

centroids:[[11.30769311,7.10440606],[57.07852945,58.16072984],[32.80667116,35.77045122],[10.49672977,12.09013199],[60.39150488,63.63541702],[37.72943219,35.22363071],[62.39824229,58.02437702]];

mdl:[24.573797126997469,13.129398357186458,3.7133694541841544,3.3965657236220546,3.084676420375617,2.8254436764486108,2.5915599853175757,0,0,0];

当k=8时:

centroids:[[13.26733626,12.07031633],[57.07852945,58.16072984],[32.80667116,35.77045122],[7.65506307,11.2817618],[59.99518544,63.77142125],[62.59388798,58.44947679],[11.540946,6.93544672],[37.72943219,35.22363071]];

mdl:[24.573797126997469,13.129398357186458,3.7133694541841544,3.3965657236220546,3.084676420375617,2.8254436764486108,2.5915599853175757,2.3294163211748233,0,0];

当k=9时:

centroids:[[31.7749079,38.3001178],[62.59388798,58.44947679],[13.26733626,12.07031633],[34.09752639,33.32671439],[10.84277835,7.05107292],[59.99518544,63.77142125],[37.42532684,36.23002666],[7.7308438,12.19490126],[57.07852945,58.16072984]];

mdl:[24.573797126997469,13.129398357186458,3.7133694541841544,3.3965657236220546,3.084676420375617,2.8254436764486108,2.5915599853175757,2.3294163211748233,2.1147734102388598,0]

当k=10时:

centroids:[[57.12370209,57.80676166],[13.26733626,12.07031633],[33.63474358,34.31277964],[10.98310056,6.84101568],[57.40038016,63.81439607],[7.90510939,11.88010141],[62.39824229,58.02437702],[37.92238243,35.36471735],[62.76270804,63.07494238],[31.47923232,38.57894405]];

mdl:[24.573797126997469,13.129398357186458,3.7133694541841544,3.3965657236220546,3.084676420375617,2.8254436764486108,2.5915599853175757,2.3294163211748233,2.1147734102388598,1.9424923110766739];

step8、初始化j=0,生成一个长度为m且所有元素为0的0-10的规则化平均畸变程度列表rmdl;具体的:

本例中m为10,即生成一个长度为10且所有元素为0的0-10的规则化平均畸变程度列表rmdl为:[0,0,0,0,0,0,0,0,0];

step9、利用规则化公式将平均畸变程度列表中的值规则化到0-10之间,并将其追加到0-10的规则化平均畸变程度列表rmdl中,具体的:

规则化公式为:其中maxd表示平均畸变程度列表中最大的平均畸变程度、mind表示平均畸变程度列表中最小的平均畸变程度、di表示平均畸变程度列表中第i+1个平均畸变程度(平均畸变程度列表的小标从0开始)、ri表示第i+1个平均畸变程度经过规则化后的值。从0到m-1依次将平均畸变程度列表中的值依次用规则化公式将其转换为0-10规则化后的值,并依次追加到规则化平均畸变程度列表中,其伪代码为:

1.maxd=max(mdl)/*获取mdl中最大的平均畸变程度并赋值给maxd*/

2.mind=min(mdl)/*获取mdl中最的小平均畸变程度并赋值给mind*/

3.for(i=0;i<length;i++)/*length为mdl中的元素个数*/

3.1di=mdl[i]

3.2/*将平均畸变程度规则化到[0,10]*/

3.3rdml[i]=ri

例如,本例中的n为10,平均畸变程度列表中经过规则化后的规则化平均畸变程度列表中的值为:[10.0,4.9413144741079265,0.77921473596801083,0.64357887302574368,0.51290984416258656,0.40750330186847117,0.28128772226531573,0.15755420051676697,0.070626257483285979,0.0]

step10、将0-10规则化平均畸变程度列表rmdl中的值与对应的聚类簇封装成对应的二维数据点,并依次追加到数据点列表pl中,具体的:

生成0-10规则化平均畸变程度和聚类数封装成二维数据点并依次追加到数据点列表pl中的伪代码为:

1.length=len(rmdl)/*计算rmdl中的元素个数并赋值给length*/

2.pl=[]/*初始化pl为空列表*/

3.for(i=0;i<length;i++)

3.1point=(rdml[i],i+1)/*列表的小标从0开始,聚类数从1开始*/

3.2pl.append(point)/*将point追加到pl中*/

step11、利用余弦定理公式计算上述相邻的三个数据点之间的角,并将其追加到角列表al中;具体的:

假设相邻的3个数据点pi(xi,yi),pj(xj,yj),pk(xk,yk)。其中xi,yi表示数据点列表pl中下标为i的数据点中的规则化后的平均畸变程度与聚类数;xj,yj表示数据点列表pl中下标为i的数据点中的规则化后的平均畸变程度与聚类数;xk,yk示数据点列表pl中下标为i的数据点中的规则化后的平均畸变程度与聚类数;i,j,k∈[1,2,…,n],1<i,j,k<n,j=i+1,k=j+1。∠pipjpk=θ,a表示pipj之间的距离,即b表示pjpk之间的距离,即c表示pipk之间的距离,即我们用到的余弦定理公式为来求相邻的三个数据点之间的夹角,并将得到的夹角追加到夹角列表al中。计算连续三个数据点之间的夹角,并将得到的弧度并转化为度,并将其依次追加到al中的伪代码为:

1.anglelist=[]/*初始化al为空列表*/

2.for(i=0,j=1,k=2;k<length;i++,j++,k++)/*length为pl中的元素个数*/

2.1xi,yi=pl[i];xj,yj=pl[j];xk,yk=pl[k]

2.2*计算pipj之间的距离*/

2.3/*计算pjpk之间的距离*/

2.4/*计算pipk之间的距离*/

2.5/*通过余弦定理得到夹角∠pipjpk的弧度值*/

2.6/*将得到的连续三个点之间的夹角追加到al中*/

经过余弦定理计算后得到的夹角列表中的值为:al=[177.67205241837968,111.23422406723046,179.72037945756477,178.57252675019083,178.82354898843653,179.8599756180431,177.91455781756332,179.0717627517494]

step12、找出al中最小的角mina,得到mina在al中的下标minai,将minai加上2即为在上述指定范围内找到的最优k值,具体的:

找到al中最小的夹角mina以及其在al中对应下标minai,并得到在查找范围内最优k值的算法伪代码为:

1.用python中内建函数min()求al中的最小值并赋值给mina

2.minai=al.index(mina)/*python中列表类型list有求下标函数index*/

3.k=minai+2/*k即为得到的指定范围内的最优k值*/

al中得到的最小夹角mina为:111.234224067,得到的指定范围内的最优k值为3,该聚类数3与我们模拟产生的90个样本数据有3类数据点一致。图4为通过肘部法则得到的平均畸变程度与类簇数量的关系,该图需要人工去查找最优的k值。图5为用本发明得到的最优k值3之后将其在需要人工干预的平均畸变程度与聚类数的关系图上用红色圆圈标注之后的图。

本发明只需要在肘部法则得到的中间结果平均畸变程度的基础上先对其进行0-10的规则化,然后对规则后的平均畸变程度与聚类数封装成数据对,进而利用余弦定理求连续相邻的三个数据点之间的夹角,最后通过的最小夹角求出最优的k值。这样只是增加了少量的计算量,就可以达到能够自动识别肘部法则中的最优k值,进而降低了需要通过人工去观察肘部法则得到的曲线中的肘点(即最优k值)的依赖,进而使本发明的方法可以应用到自动的聚类应用系统中。

上面结合附图对本发明的具体实施方式作了详细说明。本发明的方法不仅适合于像k-means聚类算法需要预先提供聚类数的问题,而且也可以将通过应用本发明方法得到的聚类数作为其它除了k-means聚类算法以外的聚类算法得到聚类数目的一个重要参考值。

以上结合附图对本发明的具体实施方式作了详细说明,但是本发明并不限于上述实施方式,在本领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下作出各种变化。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1