精华内容
下载资源
问答
  • 非监督分类中初始聚类中心法的比较研究-非监督分类中初始聚类中心法的比较研究.pdf 非监督分类中初始聚类中心法的比较研究
  • 针对K-means算法中的初始聚类中心是随机选择这一缺点进行改进,利用提出的新算法选出初始聚类中心,并进行聚类。这种算法比随机选择初始聚类中心的算法性能有所提高,具有更高的准确性。
  • 针对K-均值聚类算法对初始聚类中心存在依赖性的缺陷,提出一种基于数据空间分布选取初始聚类中心的改进算法.该算法首先定义样本距离、样本平均差异度和样本集总体平均差异度;然后将每个样本按平均差异度排序,选择平均...
  • 针对大数据集的初始聚类中心选取问题,在基于密度的划分算法和适用于大规模数据集限定初值的采样算法基础上,提出了一种用于初始聚类中心的划分采样算法。对聚类子空间在每一维上进行均匀划分形成不同的数据区域,根据...
  • K-means算法随机选取初始聚类中心,容易造成聚类准确率低且聚类结果不稳定。针对这一问题,提出一种初始聚类中心的选择算法。通过k-dist的差值(DK)图分析,确定数据点在k-dist图上的位置,选择主要密度水平曲线上k-dirt...
  • 改文献针对传统k—means算法对初始聚类中心敏感的问题,提出了基于数据样本分布选取初始聚类中心的改进k.means算法。该算法利用贪心思想构建K个数据集合,集合的大小与数据的实际分布密切相关,集合中的数据彼此间...
  • FCM初始聚类中心敏感性分析与优化,汪勇,程姣,既有研究认为模糊C-均值聚类对初始聚类中心敏感。算法敏感性受到分类数、数据特征、和模糊指数等因素的影响。给出算法敏感性定义�
  • 首先对较有代表性的初始聚类中心改进的算法,从思想、关键技术和优缺点等方面进行分析.其次选用知名数据集对典型算法进行测试,主要从就同一个数据集不同改进算法的聚类情况进行对比分析,为聚类分析和数据挖掘等...
  • 传统的K-means算法随机选取初始聚类中心,聚类结果不稳定,容易陷入局部最优解。针对聚类中心的敏感性,提出一种优化初始聚类中心的K-means算法。此算法利用数据集样本的分布特征计算样本点的密度并进行分类,在高...
  • 改进的K-means聚类算法初始聚类中心确定,采用matlab实现,2016a的matlab,直接打开文件、添加路径就可以使用了。
  • 请问一下kmeans聚类如何自定义初始聚类中心,代码该如何实现,我用密度峰值聚类获得了合适的聚类中心,不想让kmeans随机选了,求大佬帮忙看看代码,比如这组数据我想用[147,49][79,62...
  • k均值算法初始聚类中心选取方法的研究,郑丹,,对k均值算法进行研究,针对k均值算法在初始聚类中心选取及聚类结果受噪声影响大的缺点,提出改进的k均值初始聚类算法。改进之处是
  • 基于邻域模型的K-means初始聚类中心选择算法,曹付元,梁吉业,传统的K-means算法由于其方法简单,在模式识别和机器学习中被广泛讨论和应用.但由于K-means算法随机选择初始聚类中心,而初始聚类中心
  • 一种新的初始聚类中心选取方法,解晓伟,陆月明,k-means算法对初始中心点的选择比较敏感,容易造成局部收敛,针对这个缺点,本文提出一种基于平均相异度密度的初始聚类中心的选取��
  • 传统的k-均值算法对初始聚类中心和孤立点敏感,文中以最大程度地减少误差平方和为基本思想,提出一种最大化减少当前误差平方和的k-means初始聚类中心优化方法。在初始聚类中心选择阶段,每次增加聚类中心时,计算...
  • 针对传统K-均值聚类算法对初始聚类中心敏感、现有初始聚类中心优化算法缺乏客观性,提出一种基于样本空间分布密度的初始聚类中心优化K-均值算法。该算法利用数据集样本的空间分布信息定义数据对象的密度,并根据整个...
  • 基于高密度最小距离选择初始聚类中心的改进K-means算法,李硕,刘书昌,针对K-means算法初始聚类中心不稳定导致聚类效果较差的不足,本文提出了一种基于高密度最小距离选择初始聚类中心的DP-Kmeans算法,有��
  • 传统K-means算法的聚类数k值事先无法确定,而且算法是随机性地选取初始聚类中心点,这样容易造成聚类结果不稳定且准确率较低。基于SSE来选取聚类个数k值,基于聚类中心点所在的周围区域相对比较密集、聚类中心点之间...
  • 现有的基于密度优化初始聚类中心的k-means算法存在聚类中心的搜索范围大、消耗时间久以及聚类结果对孤立点敏感等问题,针对这些问题,提出了一种基于平均密度优化初始聚类中心的k-means算法adk-means。该算法将数据...
  • 基于初始聚类中心选取和数据点划分的K均值聚类算法,曹戈,程玉虎,传统K均值聚类算法随机选取初始中心容易陷入局部极小,而且不能有效处理不规则数据集的边缘数据。针对这两个问题,提出一种改进K�
  • 一个确定初始聚类中心的更好方法

    千次阅读 2017-10-08 13:24:52
    初始聚类中心的选择对k-means算法的效果有非常显著的影响,不合适的初始聚类中心可能导致: 1,算法收敛速度降低 2,更大的可能使聚类结果收敛到一个较差的局部最小值 3,某些簇最后是个空集(样本量较小时这种...

    初始聚类中心的选择对k-means算法的效果有非常显著的影响,不合适的初始聚类中心可能导致:
    1,算法收敛速度降低
    2,更大的可能使聚类结果收敛到一个较差的局部最小值
    3,某些簇最后是个空集(样本量较小时这种情况经常出现)

    经典的k-means算法的初始聚类中心是随机选取的,这种方式有两种不足:
    1,某些初始聚类中心可能离群体太远,如下图
    图一
    2,有的聚类中心可能相互之间隔得太近

    为了克服这些缺点,比较流行的方法是maxmin法,即:
    首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点。网上介绍的大部分是这个方法。http://www.sciencedirect.com/science/article/pii/S0957417412008767更推荐其他更好的方法,今天介绍其中一个。
    step1:将从数据集中抽取J个较小的子集Si,i=1,2,...,J

    step2:利用经典的k-means算法(随机选择初始聚类中心)对Si进行聚类,返回CMiCMi是个k维向量,表示对第i个子集进行聚类后返回的聚类中心点

    step3:CM=[CM1,CM2...,CMJ]

    step4:分别以CM_i为初始聚类中心,再次利用经典的k-means算法对CM进行聚类,返回FMiFMi也是聚类后得到的K个聚类中心点

    step5:计算FMiCM的距离平方和(sum 0f squared distance,SSM),选取具有最小SSM的FMi作为最终的初始聚类中心
    感兴趣的可以去看原文,地址:https://xue.glgoo.org/scholar?hl=zh-CN&as_sdt=0%2C5&q=Refining+Initial+Points+for+K-Means+Clustering&btnG=

    展开全文
  • 传统的k-means算法对初始聚类中心敏感,聚类结果随不同的初始输入而波动。为消除这种敏感性,提出一种优化初始聚类中心的方法,此方法计算每个数据对象所在区域的密度,选择相互距离最远的k个处于高密度区域的点作为...
  • K均值聚类关于初始聚类中心的探讨

    万次阅读 多人点赞 2018-05-19 08:53:46
    数据挖掘一种新兴的交叉的学科技术,涉及了模式识别、数据库、统计学、机器学习和人工智能等多个领撤分类、聚类、关联规则是数据挖掘技术几个主要的研究领域。在数据挖掘的几个主要研究领域中,聚类是其中一个重要研...

    摘要:进入二十一世纪以来,科学技术的不断发展,使得数据挖掘技术得到了学者越来越多的关注。数据挖掘是指从数据库中发现隐含在大量数据中的新颖的、潜在的有用信息和规则的过程,是一种处理数据库数据的知识发现。数据挖掘一种新兴的交叉的学科技术,涉及了模式识别、数据库、统计学、机器学习和人工智能等多个领撤分类、聚类、关联规则是数据挖掘技术几个主要的研究领域。在数据挖掘的几个主要研究领域中,聚类是其中一个重要研究领域,对它进行深入研究不仅有着重要的理论意义,而且有着重要的应用价值。聚类分析是基于物以类聚的思想,将数据划分成不同的类,同一个类中的数据对象彼此相似,而不同类中的数据对象的相似度较低,彼此相异。目前,聚类分析已经广泛地应用于数据分析、图像处理以及市场研究等。传统的K均值聚类算法(K-Means)是一种典型的基于划分的聚类算法,该聚类算法的最大的优点就是操作简单,并且K均值聚类算法的可伸缩性较好,可以适用于大规模的数据集。但是K均值聚类算法最主要的缺陷就是:它存在着初始聚类个数必须事先设定以及初始质心的选择也具有随机性等缺陷,造成聚类结果往往会陷入局部最优解。论文在对现有聚类算法进行详细的分析和总结基础上,针对K均值聚类算法随机选取初始聚类中也的不足之处,探讨了一种改进的选取初始聚类中心算法。对初始聚类中心进行选取,然后根据初始聚类中也不断迭代聚类。改进的聚类算法根据一定的原则选择初始聚类中心,避免了K均值聚类算法随机选取聚类中心的缺点,从而避免了聚类陷入局部最小解,实验表明,改进的聚类算法能够提高聚类的稳定性与准确率。


    关键词:聚类,聚类中心,k均值,相似度,距离


    1 问题描述
    聚类分析作为一种无监督机器学习方法,在信息检索和数据挖掘等领域都有很广泛的应用,例如金融分析、医学、生物分类、考古等众多领域。聚类的最终目的就是使同一类的数据对象之间相似度最大,彼此相似,而不同类的数据对象之间相似度最小,彼此相异。聚类算法是聚类分析的主要研究内容,自从20世纪80年代数据挖掘技术提出以来,许多学者都对聚类研究做出了贡献,主要体现在聚类算法的改进上,迄今为止,研究人员提出以下五种聚类算法,大体上可分为基于划分的聚类算法、基于网格的聚类算法、基于密度的聚类算法、基于层次的聚类算法和基于模型的聚类算法。基于划分的聚类算法是目前应用最广泛、最成熟的聚类算法,其中,K均值聚类算法一个比较简洁和快速,一种典型的基于划分的聚类算法,其思想简单、收敛速度快,已得到广泛的应用和研究,但是K均值算法存在着以下缺陷:初始聚类个数K必须事先设定,而实际中K值一般较难确定。而且对初始聚类中心十分敏感,由于随机选取初始聚类中心,不同的初始中心点会造成聚类结果的波动,易陷入局部最小解,同时K均值聚类算法具有易受噪声数据影响、难以发现非球状簇、无法适用于巨大数据集等缺陷。所以本文旨在探讨初始聚类中心的选择给定方式。

    2 研究现状
    聚类分析是一个活跃的领域,已有大量经典的聚类算法涌现,主要有基于划分的聚类算法、基于网格的聚类算法、基于密度的聚类算法、基于层次的聚类算法、基于模型的聚类算法、以及对传统的五种聚类算法的改进。聚类的研究现在还是富有一定的挑战性的,目前,己有众多学者提出了各种改进的聚类算法,针对不同的数据集,不同的聚类算法往往会取得不同的聚类效果,学者一般会根据数据集的不同来选择不同的聚类算法进行聚类,也就是说,目前并没有一种统一的聚类算法可在不同的数据集上取得较好的聚类结果。虽然现有的聚类算法比较多,但它们都会有这样那样的不足,数据集的不同也会影响不同聚类算法的聚类结果。研究和改善聚类算法、提高聚类结果的准确率一直以来是国内外专家、研究人员的重点工作之一。
    本文讨论的K 均值聚类算法是一种常用的、典型的基于划分的聚类算法,具有简单易实现等特点。目前关于K均值聚类算法的改进有很多,K均值聚类国内外研究成果主要包括:文献[1]将决策树算法引入到 K 均值聚类算法的改进中,增强了算法的抗噪性,但算法的计算比较复杂;文献[2]将遗传算法引入到 K 均值聚类算法中,改善了算法的聚类效果;文献[3]提出了一种模糊 K 均值聚类算法,通过引入处罚项到目标函数中,使算法对初始聚类中心不再敏感,提高了算法的聚类效果;文献[4]提出一种 W-K 均值聚类算法,它将整个数据集看成一类,然后根据类中属性再对数据集划分直到达到所需类数目为止,算法对稀疏高维的数据集聚类比较好;为了克服K-means算法对初始中心的敏感性,研究者提出了许多改进算法。Wang[5]提出了基于相异度的K-means改进算法,其中初始聚类中心由相异度矩阵组成的霍夫曼树确定。郑丹等[6]通过k-distance图选择初始聚类中心。仝雪姣等[7]基于数据样本分布和利用贪心思想确定初始聚类中心。任倩等[8]首先运用Kruskal算法生成最小生成树,并按权值大小删去部分边后,以K个连通对象的均值作为初始聚类中心。文献[9-11]中从样本密度的特点出发,选择相互距离最远的K个处于高密度区域的样本作为初始聚类中心。文献[12]中则在样本密度信息的基础上进一步结合密度RPCL算法确定初始聚类中心。文献[13]中利用密度网格优化K-means聚类。这些基于密度的方法充分利用了样本空间中数据的分布状况,能够产生更优的初始聚类中心。


    3 算法原理
    K均值聚类算法(K-Means)
    聚类就是按照某个特定标准(如距离准则)把一个数据集分割成不同的类,使得同一个类内的数据对象的相似性尽可能大,同时使不在同一个类中的数据对象的差异性也尽可能地大。即聚类后同一类的数据尽可能聚集到一起,不同类的数据尽量分离。
    K均值聚类算法是由Mac Que提出的。K均值聚类算法是一种经典的划分聚类算法,K均值聚类算法是一种迭代的聚类算法,在迭代的过程中不断移动聚类中心,直到聚类准则函数收敛为止。
    K均值聚类篡法的基本思想
    K均值聚类算法属于一种动态聚类算法,也称逐步聚类法,在聚类算法迭代之前,算法首先随机的从数据集中依次选取k个数据对象作为k个初始聚类中也,根据类中对象的均值,即聚类中也,依次将其他的数据对象划分到与其最近的聚类中也所在的类中,数据对象划分完毕,然后计算每个聚类的中心,更新聚类中心作为新的聚类中心点,迭代上述聚类过程。直到聚类中也不再发生变化,即聚类准则画数值收敛为止或者聚类准则函数连续值相差小于给定阀值。通常采用的目标函数即聚类准则函数为误差平方和准则函数。在每次迭代中都要考察样本的分类是否正确是K均值聚类算法的一个的特点。
    在数据挖掘中,K 均值聚类算法广泛的应用于科学研究、数据统计分析等研究领域,是经典聚类算法之一。它是一种基于距离的硬聚类算法,基于距离的聚类算法主要是指采用距离函数作为相似性度量的评价指标,距离函数主要有如下几种:
    1. 欧氏距离
    欧氏距离的计算公式如下 

    2.明氏距离

    明氏距离是一种带有明氏距离的计算公式如下式
     
    其中,t为一个正整数。
    显而易见,当式中的t=2时,就得到欧式距离,所以欧氏距离可以看成明氏距离的一个特例。欧氏距离是聚类算法中用来度量数据对象间相异性最常用的方法之一。类似的相似度度量方法还有曼哈顿距离、切氏距离、马氏距离、兰氏距离等,只不过这些相似度度量方法不常用而已,分别定义如下:
    曼哈顿距离:
     
    马氏距离:
     
    其中, 表示样本协方差阵的逆阵,T在运算里表示矩阵的转置。

     
    一般我们都采用欧氏距离作为相似性度量函数。也就是说,如果两个数据对象的距离比较近。说明二者比较相似,距离比较远,说明二者不相似。所谓的硬聚类算法是指数据集中的数据对象要么属于这个簇,要么属于其它的簇,并不存在模糊的概念。K均值聚类算法具有简单快速、适于处理大数据集等优点,但它缺点同样存在,比如易陷入局部最小解、需要事先指定聚类数目等等。目前,国内外许多改进的聚类算法都是在K均值聚类算法思想基础上做出的深入的研究。本节重点介绍了K均值聚类算法原理,在基于K均值聚类算法随机选取初始聚类中易陷入局部最小解的情况下,提出了一种改进的K均值聚类初始聚类中心点选取的算法,实验证明该聚类算法能够有效的避免聚类结果陷入局部最优解,很好的提高聚类的准确度。

    传统K均值聚类篡法的的流程

    具体步骤为:
    首先利用随机选取从数据集中抽取 K 个数据对象作为初始聚类中心;然后计算剩余数据对象与各个聚类中心的欧几里德距离,按照距离最小原则来划分类别;完成一轮聚类后,再计算每一类的平均值,用 K 个平均值作为新的 K 个聚类中心,再计算剩余的数据对象与这 K 个聚类中心的欧几里德距离,再按照距离最小原则划分类别,循环反复,直到满足某个终止条件迭代才停止。这个终止条件可以是下面的任意一个:                              
    (1)目标函数相对于上一次的改变量小于某个阈值;                     
    (2)迭代次数大于给定的阈值.
    不难看出,K 均值聚类算法存在以下问题:
    (1)初始聚类中心随机选取,容易选到噪声数据和孤立点,使算法的迭代次数增多,算法的时间性能变差,另外,受噪声数据和孤立点的影响算法还容易陷入局部极值;
    (2)算法没有考虑到各个数据对象对聚类的影响是不同的,单纯地从欧几里德距离上去决策分类。这样就导致,如果待聚类数据集中存在很多噪声数据和孤立点,那么算法的聚类准确性就不高。
    (3)对于处理小量的低维的数据集,K 均值聚类算法在单机上运行没有什么问题,但在处理海量的高维的数据时,K 均值聚类算法在单机上的时间性能和空间性能都很差。


    2 关于初始点选取的改进:
    最简单的传统的确定初始类簇中心点的方法是随机选择K个点作为初始的类簇中心点,但是该方法在有些情况下的效果较差容易陷入局部极值。
    还有其他的一些方法:
    1)选择彼此距离尽可能远的K个点 
    2)先对数据用层次聚类算法或者Canopy算法进行聚类,得到K个簇之后,从每个类簇中选择一个点,该点可以是该类簇的中心点,或者是距离类簇中心点最近的那个点。
    选择彼此距离尽可能远的K个点的思想是:首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最短距离最大的那个点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点。


    例1. 考虑图一中的12个点,最坏情况下,选择中间附近的点作为初始点,比如(6,8)。离他最远的点是(12,3)。因此下一步我们选择(12,3)。

     

                                                                                       图一
    剩余的10个点中,离(6.8)或(12,3)的最短距离最大的那个点是(2,2)。该点到(6,8)的距离是7.21,到(12,3)的距离是10.05,因此它的“得分”是7.21.很容易检查其他的点到(6,8)或(12,3)中至少一个点的最短距离都小于7.21.因此,最终我们选择(6,8),(12,3)和(2,2)作为初始点。


    在这里本文关于初始点的选取,提出了两种自己的改进方法。
    第一种改进结合第一种方法进行了改进,主要是对于第一个点进行改进,不随机选取一个点,而是从所有的数据点中选出密度最大的一个点作为第一个初始聚类中心点,某种程度上避免了选到离群点的可能,当然半径我们需要调节一个合适的值。然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最短距离最大的那个点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点。
      该方法经过测试效果很好,用该方法确定初始类簇点之后运行KMeans得到的结果全部都能完美区分五个类簇。
    第二种改进方法是首先选出密度最大的那个点,然后减去他周围最近的n个点(数据总数除以k);然后再找到剩余数据点中密度最大的点,然后减去他周围最近的n个点,以此类推直到找到k个初始点。次方法适用于每一类数据点个数相等的情况。此方法选出的初始点也基本都分在了不同的簇中,但是相对于第一种有一定的局限性。
    关于初始点K值确定的一种简单的方法:
    关于k的个数的确定:我们可能不知道在K均值中正确的k值。但是,如果能够在不同的K下对聚类结果的质量进行评价,我们往往能够猜测到正确的k值。如果给定一个合适的簇指标,如平均半径或直径,只要我们假设的簇的数目等于或高于真实的簇的数目,该指标上升会趋势会很缓慢。但是一旦试图得到少于真实数目的簇时,该指标会急剧上升。

     

                                                                                              图二
    如图中当簇数目低于数据中真实的簇数目时,平均直径或其他分散指标会快数上升
    通过上面提供的方法,我们在当簇的个数不知道的时候,可以通过它大致的获取簇的数目。




    4 算法实现
    1、实验开发环境
    实验硬件: 一台处理器为intel(R)Pentium(R)G840 2.8GHz 内存4GB 的PC机
    操作系统: Windows 7的64位
    开发软件: Matlab2016a
    2、传统K-means聚类算法步骤:
    给定一个数据点集合和需要的聚类数目k(由用户指定),k均值算法根据某个距离函数反复把数据分入k个聚类中。
    1)初始化。输入数据点集合X,并指定聚类类数N,在X中随机选取N个对象作为初始聚类中心;
    2)设定迭代终止条件。比如最大循环次数或者聚类中心收敛误差容限;
    3)更新样本属于哪个类。根据相似度准则将数据对象分配到最接近的类;
    4)更新类的中心位置。以每一类的平均向量作为新的聚类中心;
    反复执行第3步和第4步直至满足终止条件。
    3、本文关于初始聚类中心选取的改进:
    1) 首先从所有的数据点中选出密度最大的一个点作为第一个初始聚类中心点;
    2)然后选择距离该点最远的那个点作为第二个初始类簇中心点;
    3)再选择距离前两个点的最短距离最大的那个点作为第三个初始类簇的中心点,以此类推,直
    至选出K个初始类簇中心点
    3、实验步骤   
    (1)首先我们使用传统的K均值算法利用MATLAB随机生成五组高斯分布数据,再合成一个数据组。
    (2)随机选取5个数据作为初始聚类中心点,然后用编写的K均值MATLAB程序对数据组进行聚类记录结果。
    (3)从所有的数据点中选出密度最大的一个点作为第一个初始聚类中心点,在程序编程中我们求出每个数据点的N个点的近邻(N可适当设置这里我们先设为6,然后比较近邻的半径选出最小半径即是最大密度点)。然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最短距离最大的那个点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点,最后对数据进行聚类。


    5 实验结果
     

     

    6 结论
    经过这段时间对K均值算法的学习以及动手实践,使我对聚类算法中这个最经典的算法有了更进一步的了解。明白了K均值的算法流程和核心问题。通过查阅资料学习了很多对于他的改进算法,并在本文中对K均值的一种改进算法加进了一点新的方法,使得第一个初始聚类中心不需要随机选取,而是选取最大密度点。对于一些典型的凸形状中心密度大的类型数据第一个初始点很接近它的类中心点。
    K-means聚类算法优点:
    (1)算法简单、快速;
    (2)对大数据集效率较高;
    (3)当簇接近高斯分布时,它的效果较好。
    K-means聚类算法缺点:
    (1) 在簇的平均值可被定义的情况下才能使用,可能不适用于某些应用;
    (2) 在 K-means 算法中 K 是事先给定的,这个 K 值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适;
    (3) 在 K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果;
    (4) 该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的;
    (5) 若簇中含有异常点,将导致均值偏离严重(即:对噪声和孤立点数据敏感);
    (6) 不适用于发现非凸形状的簇或者大小差别很大的簇。
    K-means算法缺点的改进:
    针对上述第(3)点,不随机选取聚类中心,而是从所有的数据点中选出密度最大的一个点作为第一个初始聚类中心点。然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最短距离最大的那个点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点。

    一个一个加公式和图片太麻烦了所以后面就直接把我做的PDF用截图粘了上来,之后我会发程序代码。有需要的可以留言。
     

    2020年1月2日:以上内容是我一门课程的大作业,所以写的很啰嗦,不喜勿喷。代码实现我发在了我其他的文章中,大家需要可以去我的博客里找一下。感谢支持的朋友,以后我会根据自己的理解好好写一些东西,之前写的确实不怎么用心,勿怪。

    展开全文
  • 本程序是K均值聚类关于初始聚类中心选取的一种改进,原理来自于周志华的机器学习,这里只是尝试用python实现下。刚开始学习python,可能有问题大家觉得有用就借鉴下,如果哪里有问题还望指正。关于K均值聚类关于初始...

    本程序是K均值聚类关于初始聚类中心选取的一种改进,原理来自于周志华的机器学习,这里只是尝试用python实现下。刚开始学习python,可能有问题大家觉得有用就借鉴下,如果哪里有问题还望指正。关于K均值聚类关于初始聚类中心选取的详细讨论我的博客另一篇文章详细介绍过,兴趣的可以去看看,这里只发我实现的python代码。

    k均值代码参考来自于:# kmeans: k-means cluster
                                              # Author : zouxy
                                              # Date   : 2013-12-25
                                              # HomePage : http://blog.csdn.net/zouxy09
                                              # Email  : zouxy09@qq.com

     main.py:

    from centroids import *
    from numpy import *
    import time
    import matplotlib.pyplot as plt
    
    ## step 1: load data
    print ("step 1: load data...")
    dataSet = []
    fileIn = open('data3.txt')
    for line in fileIn.readlines():  #依次读取每行
        lineArr = line.strip().split('\t') #strip去掉每行头尾空白,对于每一行,
        #split('\t')按照制表符切割字符串,得到的结果构成一个数组,数组的每个元素代表一行中的一列。 
        dataSet.append([float(lineArr[0]), float(lineArr[1]), float(lineArr[2])])
    
    ## step 2: clustering...
    print ("step 2: clustering...")
    #调用mat()函数可以将数组转换为矩阵,然后可以对矩阵进行一些线性代数的操作
    dataSet = mat(dataSet)
    k = 5
    centroids, clusterAssment = kmeans(dataSet, k)
    
    ## step 3: show the result
    print ("step 3: show the result...")
    showCluster(dataSet, k, centroids, clusterAssment)

     

    centroids.py

    #初始聚类中心改进算法
    from numpy import *
    import time
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    
    # calculate Euclidean distance
    def euclDistance(vector1, vector2):
        return sqrt(sum(power(vector2 - vector1, 2)))#平方,求和,开方
    
    # init centroids with random samples 随机初始质心
    def initCentroids(dataSet, k):
        numSamples, dim = dataSet.shape#求行列数
        centroids = zeros((k, dim))#创建空矩阵,放初始点
        #第一个点
        index = int(random.uniform(0, numSamples))
        centroids[0, :] = dataSet[index, :]
        #第二个点
        A1=mat(zeros((numSamples, 1)))
        for i in range(numSamples):
            distance = euclDistance(centroids[0, :], dataSet[i, :])
            A1[i] = distance
        centroids[1, :]= dataSet[nonzero(A1[:, 0] == max(A1))[0]]
      
        #第三个点及以后,
        #然后再选择距离前两个点的最短距离最大的那个点作为第三个初始类簇的中心点,
        j = 1
        while j<=k-2:
            mi = mat(zeros((numSamples, 1)))
            for i in range(numSamples):
                distance1 = euclDistance(centroids[j-1, :], dataSet[i-1, :])
                distance2 = euclDistance(centroids[j, :], dataSet[i-1, :])
                mi[i-1] = min([distance1,distance2])
            centroids[1+j, :]= dataSet[nonzero(mi[:, 0] == max(mi))[0]]
            j=j+1
        return centroids
    
    # k-means cluster
    def kmeans(dataSet, k):
        numSamples = dataSet.shape[0]#行数
        # first column stores which cluster this sample belongs to,
        # second column stores the error between this sample and its centroid
        clusterAssment = mat(zeros((numSamples, 2)))
        clusterChanged = True
    
        ## step 1: init centroids
        centroids = initCentroids(dataSet, k)#调用初始化质心函数
    
        while clusterChanged:
            clusterChanged = False
            ## for each sample
            for i in range(numSamples):
                minDist  = 100000.0
                minIndex = 0
                ## for each centroid
                ## step 2: find the centroid who is closest
                for j in range(k):
                    distance = euclDistance(centroids[j, :], dataSet[i, :])#调用前面的函数
                    if distance < minDist:
                        minDist  = distance
                        minIndex = j
                        
                ## step 3: update its cluster
                if clusterAssment[i, 0] != minIndex:
                    clusterChanged = True
                    clusterAssment[i, :] = minIndex, minDist**2
    
            ## step 4: update centroids
            for j in range(k):
                #找出每一类的点
                pointsInCluster = dataSet[nonzero(clusterAssment[:, 0].A == j)[0]]
                #clusterAssment[:, 0].A == j测试所有数据的类相同为true不同为false
                #nonzero()[0]把所有为true的位置写出来
                #pointsInCluster = dataSet[nonzero(clusterAssment[:, 0] == j)[0]]  .A的作用目前不清楚,不加也一样
                #求每一类的中心店
                centroids[j, :] = mean(pointsInCluster, axis = 0)
    
        print('Congratulations, cluster complete!')
        return centroids, clusterAssment
    
    # show your cluster only available with 3-D data
    def showCluster(dataSet, k, centroids, clusterAssment):
        numSamples, dim = dataSet.shape
        if dim > 3:
            print("Sorry! I can not draw because the dimension of your data is not 3!")
            return 1
    
        mark = ['r', 'g', 'b', 'y', 'm', 'k']
        if k > len(mark):
            print("Sorry! Your k is too large! please contact Zouxy")
            return 1
        
        fig = plt.figure()
        ax = plt.subplot(111, projection='3d')
        
        # draw all samples
        for i in range(numSamples):
            markIndex = int(clusterAssment[i, 0])
            ax.scatter(dataSet[i, 0], dataSet[i, 1], dataSet[i, 2], c=mark[markIndex], s=10)
       
        mark = ['r', 'b', 'g', 'k', 'm', 'y']
        # draw the centroids
        for i in range(k):
            ax.scatter(centroids[i, 0], centroids[i, 1], dataSet[i, 2], c=mark[3],s=100)
            #plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize = 12)
            
    plt.show()
    
    

    实验结果图多次尝试聚类正确率比随机初始化初始点得到的聚类结果正确率高多了。 

     

    展开全文
  • 在传统的k-means聚类算法中,聚类结果会随着初始聚类中心点的不同而波动,针对这个确定,提出一种优化初始聚类中心的算法。
  • data_n为样本数,cluster_n为聚类数,以下为从data_n个样本中随机选择其中cluster_n个作为初始聚类中心 index = randperm(data_n); % 对样本序数随机排列  center_old = data(index(1:cluster_n),:); % 选取...

    初始化聚类中心:

    data_n为样本数,cluster_n为聚类数,以下为从data_n个样本中随机选择其中cluster_n个作为初始聚类中心

    index = randperm(data_n);   % 对样本序数随机排列 
    center_old = data(index(1:cluster_n),:);  % 选取随机排列的序数的前cluster_n个 


    高斯核函数:反映样本点到聚类中心的距离



    具体过程:

    展开全文
  • 摘 要: 传统的 K- means 算法对初始聚类中心敏感, 聚类结果随不同的初始输入而波动, 针对 K- means 算法存在的问题, 提出了 基于密度的改进的 K- means 算法, 该算法采取聚类对象分布密度方法来确定初始聚类中心, ...
  • 对应之前发过的:K均值聚类关于初始聚类中心的探讨,补发MATLAB的程序代码。 matlab程序: 1. %利用传统K均值随机选取点聚类 clear all; close all; clc; %生成五组三维高斯分布数据 mu1=[0 0 0]; %均值 sig1=...
  • 优化初始聚类中心的K_means算法 用于K-MEANS算法的改进

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,022
精华内容 808
关键字:

初始聚类中心