K means聚类算法以及实现

上传人:yo****e 文档编号:67822128 上传时间:2022-04-01 格式:DOCX 页数:8 大小:192.85KB
收藏 版权申诉 举报 下载
K means聚类算法以及实现_第1页
第1页 / 共8页
K means聚类算法以及实现_第2页
第2页 / 共8页
K means聚类算法以及实现_第3页
第3页 / 共8页
资源描述:

《K means聚类算法以及实现》由会员分享,可在线阅读,更多相关《K means聚类算法以及实现(8页珍藏版)》请在装配图网上搜索。

1、K means聚类算法以及实现一、Kmeans算法k-means 算法接受参数 k ;然后将事先输入的n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。 假设要把样本集分为c个类别,算法描述如下: (1)适当选择c个类的初始中心

2、; (2)在第k次迭代中,对任意一个样本,求其到c个中心的距离,将该样本归到距离最短的中心所在的类; (3)利用均值等方法更新该类的中心值; (4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。 该算法的最大优势在于简洁和快速。算法的关键在于初始中心的选择和距离公式二、算法流程首先从n个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开

3、始收敛为止。一般都采用均方差作为标准测度函数. k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。Kmeans算法实现的步骤具体描述为:(1)从疗个数据对象中任意选取k个对象作为初始的聚类中心。(2)分别计算每个对象到各个聚类中心的距离,把对象分配到距离最近的聚类中。(3)所有对象分配完成后,重新计算k个聚类的中心。(4)与前一次计算得到的k个聚类中心比较,如果聚类中心发生变化,转(2),否则转(5)。(5)输出聚类结果。实现的流程框图为首先从n个数据对象中任意选择k个对象作为初始聚类中心;而对于所剩下的其它对象,则根据他们与这些聚类中心的相似度(距离),分别将他们分配给

4、与其最相似的(聚类中心所代表的)聚类。然后再计算每个所新聚类的聚类中心(该聚类中所有对象的均值)。不断重复这一过程直到标准测度函数开始收敛为止。一般都采用均方差作为标准测度函数,具体定义如下:其中E为数据库中所有对象的均方差之和;p为代表对象的空间中的一个点;m,为聚类G的均值(p和m,均是多维的)上述公式所示聚类标准旨在使所获得的k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类间尽可能的分开。三、设计实现K-Means算法是聚类算法的一种,它通过计算样本数据点之间的逻辑距离来判断某个样本数据点属于哪一个簇,算法最终的目的是要把用于算法的样本数据点分配到K个簇中,使簇内的点有较大的相似度

5、,而簇间的点有较小的相似度。K-Means中的K表示聚类中心的个数,在算法运行过程中,要反复扫描所有样本数据点,要计算每个非中心数据点与某个聚类中心点的距离,并将这个数据点归为与其距离最小的那个聚类中心对应的簇之中。每扫描一次就要重新计算每个聚类中心点的位置。当聚类中心点的位置变化在一定的阈值之内的时候停止处理,最后就可以得到K个簇,并且簇中每个样本数据点到本簇的中心的距离都小于到其它簇中心的距离。 本程序使用C+实现算法本身,然后用C#调用C+函数完成了数据的传送和接收算法的输出并可视化结果。并且数据是保存在Access数据库中的一个sample表格中然后通过字符串连接数据库读入数据也可以使

6、用其他数据库,例如sqlserver,修改相应的字符串连接语句即可。下面主要介绍一个导出的函数DataMining_KMeans,这个函数要接收C#传过来的原始数据、K值及其它参数,同时还要将处理的结果赋值给引用参数以便在C#中可以接收到处理结果。DataMining_KMeans函数的原型如下:/*Author:YinPSoft*param: *raw:原始数据*count:数据点个数*K:聚类中心个数*means:初始聚类中心*minOffset:聚类中心的最小偏移量,用于控制聚类处理的精度。*times:最大迭代次数*c:每个聚类的数据点索引值*sizes:每个聚类的容量*finalMe

7、ans:最终的聚类中心位置*/voidDataMining_KMeans(double*data, intcount, intK, int*means, doubleminOffset, inttimes, int*c, int*sizes, double*finalMeans);在这个原型声明中可以看到初始聚类中心点要从外部输入,从外部输入这种方式有更大的灵活性,当有特定的初始聚类中心生成策略的时候可能通过这个策略来生成中心点,而没有策略的时候也可以通过随机来生成。初始聚类中心的值可以很大程度地影响到整个算法的效率,适当的选择聚类中心点可以减少算法的迭代次数。 接着是初始化:for(i=0;

8、iK;i+)vectorcluster;clusters.push_back(cluster);meanIndex.push_back(*(means+i);dots.at(*(means+i).isMean=true;dots.at(*(means+i).isVirtual=false;上面的代码有两个目的:一是初始化vector数组用于存放K个簇的样本点索引;二是将外部传进来的K个聚类中心点添加到dots对象之中,dots对象是vector类型的。在DataMining_KMeans最开始就要通过PreProcessor函数将外部传进来的数据点封装成vector的对象,在这里是dots。D

9、ot2D的定义如下,isMean和isVirtual是数据点的两个标志,前者用于标识这个数据点是否是聚类中心,后者用于表示这个点是不是虚拟数据点,虚拟数据点在这里意为这个点的位置是通过计算得到,而不是原始数据中的数据点。实际上,在这个算法中,虚拟数据点都是在处理过程中得到的聚类中心点,因为每一轮计算完成后要重新计算聚类中心位置,而这个计算出来的位置很可能不同于原始数据中的任何一个点,所以要把这些点保存下来用于下一轮的计算: typedefstructDotdoublex;doubley;boolisMean;boolisVirtual; Dot2D,*Ptr_Dot2D;接下来就是一个whil

10、e循环,反复地扫描样本数据点并将其分配K个簇中。在这个while循环中包括两大部分,首先就是计算并比较数据点与聚类中心的距离并进行分配;其次就是重新计算聚类中心。代码如下:for(i=0;icount;i+)if(!dots.at(i).isMean&!dots.at(i).isVirtual)dist=INFINITE_DISTANCE;for(j=0;jK;j+)term=Distance(dotsi,dotsmeanIndexj);if(termdist)dist=term;/存放与聚类中心有最小距离的那个数据点的索引值c=j;/将第i个数据点放入第j个聚类clusters.at(c).

11、push_back(i);对所有数据点的扫描计算的前提是这些数据点不是聚类中心并且也不是虚拟数据点。然后将中间距离变量设置一个初值,接下来的for循环就要计算当前这个数据点与每个聚类中心的距离,如果当前点到第K个聚类中心的距离是最小的,那么就把它的索引值存放到clusters的第K个vector对象中。当所有的样本数据点都被分配到K个簇中以后就要重新计算中心点的位置,代码如下:for(i=0;iminOffset)?true:flag;dots.at(meanIndex.at(i).isMean=false;dots.push_back(newMean);*(finalMeans+i)=new

12、Mean.x;*(finalMeans+i+K)=newMean.y;meanIndex.at(i)=dots.size()-1; 上面的代码用于计算新的聚类中心点的位置,并覆盖之前的聚类中心位置。在这个算法中通过计算簇所占有的矩形区域的中心点来作为新的聚类中心点的位置。在这个for循环中还有一件事情就是要计算新的聚类中心点与前一轮的聚类中心点的距离或者称为聚类中心点的位移,在函数原型中我们设置了这个位移的最小值,当K个位移都小于这个值的时候就要结束算法处理。另外每次进入while循环的时候要清空clusters对象,否则clusters中会有多余的数据,并且会随原始数据量而膨胀。 以上就是K

13、-Means算法实现C+部分的主要代码,也是这个演示程序的核心部分。除了算法实现部分之外就是算法结果的展示了。另一个项目DMAlgorithms.Demo用于向算法传送原始数据以及接收算法的输出并可视化结果。在DMAlgorithms.Demo项目中要调用C+函数,方法是通过.NET的P/Invoke调用,其代码如下:/K-Means聚类分析/KMeans原始数据/数据点个数/聚类个数/初始聚类中心/聚类中心的最小位移量/最大迭代次数,-1为不控制/聚类划分结果/返回的最终聚类中心/表示第一个参数的长度/表示第九个参数的长度 DllImport(SimpleKMeans.Core.dll,En

14、tryPoint=DataMining_KMeans,CharSet=CharSet.Auto) publicstaticexternvoidDataMining_KMeans( MarshalAs(UnmanagedType.LPArray,SizeParamIndex=9) doublerawdata, introws,intK, MarshalAs(UnmanagedType.LPArray,SizeParamIndex=2) intmeans, doubleminOffset,inttimes, MarshalAs(UnmanagedType.LPArray,SizeParamIndex=1) intresult, MarshalAs(UnmanagedType.LPArray,SizeParamIndex=2) intsizes, MarshalAs(UnmanagedType.LPArray,SizeParamIndex=10) doublefinalMeans, intsize,intfinalMeans_size);实验最终效果图如下:K=5K=4

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!