
主成分聚类不会提高准确率。层次聚类算法相比K-重心聚类算法效果均略好,且以主成分代替原数据进行聚类分析都没有显著提高聚类的准确性,有些情况下甚至不如后者。当各主成分的方差贡献率相差较大时,忽略不同主成分聚类重要程度的差异。则必然会影响主成分聚类分析的准确性。
聚类分析是一种将数据对象的集合分组为由类似的对象组成的多个类的分析过程。
在聚类分析过程中,出现重合部分可能会导致多个数据点被聚类到同一簇中,从而影响聚类结果的准确性。解决这个问题的方法有很多种。
一种常见的方法是通过调整聚类算法的参数和设置来尝试改善聚类结果。
例如,可以调整聚类算法的阈值,以使得数据点只能被归入一个簇中,从而避免出现重合的情况。此外,还可以选择合适的距离度量方式、距离阈值等参数,以使得聚类结果更加准确。
另外,可以使用其他的聚类方法或组合多种聚类方法,以提高聚类结果的准确性。
例如,可以结合层次聚类和k-means聚类的方法进行分析。
还可以调整算法参数和选择合适的距离度量方式等来提高聚类结果的准确性。
打开idle。点击file,然后点击new file这是创建一个新的文件。这一步经常用到,比较简单。
如何使用python编程写一个加法计算器
新建一个文件之后,我们输入第一行代码,使用print函数,在屏幕上打印一句话,其中字符串要使用双引号,输入法要使用英文输入法,如果符号使用中文输入法输入,就会出现错误。print("我们做一个两个整数相加的计算题!")
如何使用python编程写一个加法计算器
同理,在屏幕上打印第二句话,与用户交互,提醒用户输入第一个数。输入代码注意事项一定要记清楚。
如何使用python编程写一个加法计算器
第三行调用input函数,将用户输入的内容赋值给a,这时候a收到的是字符串信息,所以需要下一步把字符串转换为整型。这输入计算机处理数据指令。
a=input()
x=int(a)
如何使用python编程写一个加法计算器
如何使用python编程写一个加法计算器
然后依照以上的步骤写第二个加数,和最后输出的和,注意最后一句打印结果时,引号内部是字符串形式,x+y是数值形式,所以需要在中间加上一个逗号。如果不加逗号就会提示错误信息,以上就是所有的程序编写完成,下一步就开始保存,命名,运行。如图所示
如何使用python编程写一个加法计算器
如何使用python编程写一个加法计算器
如何使用python编程写一个加法计算器
点击运行之后,系统按照我们的设置打印出信息,然后提示你输入第一个数,我们直接输入一个整数,然后回车,系统会提示输入第二个数。接着输入第二个数,敲回车之后直接就显示最终的和。
如何使用python编程写一个加法计算器
如何使用python编程写一个加法计算器
如何使用python编程写一个加法计算器
如何使用python编程写一个加法计算器
7
这是一个比较简单的交互界面,我们学会了这个方法,可以制作其他一些比较好玩有趣的东西,学会举一反三,主要记住input函数,print函数的用法。以及代码输入规范。
几种典型的聚类融合算法:
1基于超图划分的聚类融合算法
(1)Cluster-based Similarity Partitioning Algorithm(GSPA)
(2)Hyper Graph-Partitioning Algorithm(HGPA)
(3)Meta-Clustering Algorithm(MCLA)
2基于关联矩阵的聚类融合算法
Voting-K-Means算法。
3基于投票策略的聚类融合算法
w-vote是一种典型的基于加权投票的聚类融合算法。
同时还有基于互信息的聚类融合算法和基于有限混合模型的聚类融合算法。
二、基于关联矩阵的聚类融合算法——Voting-K-Means算法
Voting-K-Means算法是一种基于关联矩阵的聚类融合算法,关联矩阵的每一行和每一列代表一个数据点,关联矩阵的元素表示数据集中数据点对共同出现在同一个簇中的概率。
算法过程:
1在一个数据集上得到若干个聚类成员;
2依次扫描这些聚类成员,如果数据点i和j在某个聚类成员中被划分到同一个簇中,那么就在关联矩阵对应的位置计数加1;关联矩阵中的元素值越大,说明该元素对应的两个数据点被划分到同一个簇中的概率越大;
3得到关联矩阵之后,Voting-K-Means算法依次检查关联矩阵中的每个元素,如果它的值大于算法预先设定的阀值,就把这个元素对应的两个数据点划分到同一个簇中。
Voting-K-Means算法的优缺点:
Voting-K-Means算法不需要设置任何参数,在聚类融合的过程中可以自动地的选择簇的个数 并且可以处理任意形状的簇。因为Voting-K-Means算法在聚类融合过程中是根据两个数据点共同出现在同一个簇中的可能性大小对它们进行划分的,所以只要两个数据点距离足够近,它们就会被划分到一个簇中。
Voting-K-Means算法的缺点是时间复杂度较高,它的时间复杂度是O(n^2);需要较多的聚类成员,如果聚类成员达不到一定规模,那么关联矩阵就不能准确反映出两个数据点出现在同一个簇的概率。
package clustering;import javaioFileWriter;import wekaclusterersClusterEvaluation;import wekaclusterersSimpleKMeans;import wekacoreDistanceFunction;import wekacoreEuclideanDistance;import wekacoreInstances;import wekacoreconvertersConverterUtilsDataSource;import wekafiltersunsupervisedattributeRemove;public class Votingkmeans2 extends SimpleKMeans { / 生成的序列号 / private static final long serialVersionUID = 1557181390469997876L; / 划分的簇数 / private int m_NumClusters; / 每个划分的簇中的实例的数量 / public int[] m_ClusterSizes; / 使用的距离函数,这里是欧几里德距离 / protected DistanceFunction m_DistanceFunction = new EuclideanDistance(); / 实例的簇号赋值 / protected int[] m_Assignments; / 设定聚类成员融合阀值 / private final static double THREASOD = 05; / 生成一个聚类器 / public void buildClusterer(Instances data) throws Exception{ final int numinst = datanumInstances(); // 数据集的大小 double [][]association = new double[numinst][numinst]; // 定义并初始化一个关联矩阵 int numIteration = 40; // 设置生成的聚类成员数 final int k = (int)Mathsqrt(numinst); // 设置K-Means聚类算法参数——簇数 for(int i = 0; i < numIteration; i++) { if(dataclassIndex() == -1) datasetClassIndex(datanumAttributes() - 1); // 索引是从0开始 String[] filteroption = new String[2]; filteroption[0] = "-R"; filteroption[1] = StringvalueOf(dataclassIndex() + 1);// 索引是从1开始 Remove remove = new Remove(); removesetOptions(filteroption); removesetInputFormat(data); / 使用过滤器模式生成新的数据集;新数据集是去掉类标签之后的数据集 / Instances newdata = wekafiltersFilteruseFilter(data, remove); / 生成一个K-Means聚类器 / SimpleKMeans sm = new SimpleKMeans(); smsetNumClusters(k); smsetPreserveInstancesOrder(true); // 保持数据集实例的原始顺序 smsetSeed(i); // 通过设置不同的种子,设置不同的簇初始中心点,从而得到不同的聚类结果 smbuildClusterer(newdata); int[] assigm = smgetAssignments(); // 得到数据集各个实例的赋值 / 建立关联矩阵 / for(int j = 0; j < numinst; j++) { for(int m = j; m < numinst; m++) { if(assigm[j] == assigm[m]) { association[j][m] = association[j][m] + 10 / numIteration ; } } } } Systemoutprintln(); / 将生成的关联矩阵写入txt文件(注:生成的txt文本文件在e:/resulttxt中) / FileWriter fw = new FileWriter("e://resulttxt"); for(int j = 0; j < numinst; j++) { for(int m = j; m < numinst; m++) { //由于关联矩阵是对称的,为了改进算法的效率,只计算矩阵的上三角 String number = Stringformat("%82f", association[j][m]); fwwrite(number); } fwwrite("\n"); } / 处理关联矩阵,分别考虑了两种情况 :1关联矩阵中某个元素对应的两个数据点已经被划分到了不同的簇中 2两个数据点中有一个或者两个都没有被划分到某个簇中。 / int[] flag = new int[numinst]; int[] flagk = new int[k]; int[] finallabel = new int[numinst]; for(int m = 0; m < numinst; m++) { for(int n = m; n < numinst; n++) { if(association[m][n] > THREASOD) { if(flag[m] == 0 && flag[n] == 0) { // 两个数据点都没有被划分到某个簇中, int i = 0; // 将他们划分到同一个簇中即可 while (i < k && flagk[i] == 1) i = i + 1; finallabel[m] = i; finallabel[n] = i; flag[m] = 1; flag[n] = 1; flagk[i] = 1; } else if (flag[m] == 0 && flag[n] == 1) { // 两个数据点中有一个没有被划分到某个簇中, finallabel[m] = finallabel[n]; // 将他们划分到同一个簇中即可 flag[m] = 1; } else if (flag[m] == 1 && flag[n] == 0) { finallabel[n] = finallabel[m]; flag[n] = 1; } else if (flag[m] == 1 && flag[n] == 1 && finallabel[m] != finallabel[n]) { // 两个数据点已被划分到了不同的簇中, flagk[finallabel[n]] = 0; // 将它们所在的簇合并 int temp = finallabel[n]; for(int i = 0; i < numinst; i++) { if(finallabel[i] == temp) finallabel[i] = finallabel[m]; } } } } } m_Assignments = new int[numinst]; Systemoutprintln("基于关联矩阵的聚类融合算法——Voting-K-Means算法的最终聚类结果"); for(int i = 0; i < numinst; i++) { m_Assignments[i] = finallabel[i]; Systemoutprint(finallabel[i] + " "); if((i+1) % 50 == 0) Systemoutprintln(); } for(int i = 0; i < k; i++) { if(flagk[i] == 1) m_NumClusters++; } } / return a string describing this clusterer @return a description of the clusterer as a string / public String toString() { return "Voting-KMeans\n"; } public static void main(String []args) { try {String filename="e://weka-data//irisarff"; Instances data = DataSourceread(filename); Votingkmeans2 vk = new Votingkmeans2(); vkbuildClusterer(data); / 要生成Voting-K-Means的聚类评估结果包括准确率等需要覆盖重写toString()方法; 因为没有覆盖重写,所以这里生产的评估结果没有具体内容。 / ClusterEvaluation eval = new ClusterEvaluation(); evalsetClusterer(vk); evalevaluateClusterer(new Instances(data)); Systemoutprintln(evalclusterResultsToString()); } catch (Exception e) { eprintStackTrace(); }}}
分析代码时注意:得到的类成员变量m_Assignments就是最终Voting-K-Means聚类结果;由于是采用了开源机器学习软件Weka中实现的SimpleKMeans聚类算法,初始时要指定簇的个数,这里是数据集大小开根号向下取整;指定的阀值为05,即当关联矩阵元素的值大于阀值时,才对该元素对应的两个数据点进行融合,划分到一个簇中,考虑两种情况,代码注释已有,这里不再详述。但聚类融合的实验结果并不理想,莺尾花数据集irsiarff是数据挖掘实验中最常用的数据集,原数据集共有三个类;但本实验进行四十个聚类成员的融合,其最终聚类结果划分成两个簇;其原因可能有两个:一是算法本身的问题,需要使用其他更加优化的聚类融合算法;二是实现上的问题,主要就在聚类结果的融合上,需要进行一步对照关联矩阵进行逻辑上的分析,找出代码中的问题。关联矩阵文本文件>
一种面向高维数据的集成聚类算法
聚类集成已经成为机器学习的研究热点,它对原始数据集的多个聚类结果进行学习和集成,得到一个能较好地反映数据集内在结构的数据划分。很多学者的研究证明聚类集成能有效地提高聚类结果的准确性、鲁棒性和稳定性。本文提出了一种面向高维数据的聚类集成算法。该方法针对高维数据的特点,先用分层抽样的方法结合信息增益对每个特征簇选择合适数量比较重要的特征的生成新的具代表意义的数据子集,然后用基于链接的方法对数据子集上生成的聚类结果进行集成.最后在文本、图像、基因数据集上进行实验,结果表明,与集成前的K均值聚类算法及基于链接的聚类集成算法相比,该方法能有效的改善聚类结果。
引 言
聚类分析又称群分析,是根据“物以类聚”的道理对样品或指标进行分类的一种多元统计分析方法。它是一个将数据分到不同类或者簇的过程,所以同一个簇中的对象有很大的相似性,而不同簇间的对象有很大的相异性。聚类分析是机器学习、模式识别的一个最重要的研究方向之一,它是了解数据集的结构的一种最重要的手段,并已经成功的应用于数据挖掘、信息检索、语音识别、推荐系统等领域。
现实世界中的数据集具有各种形状和结构,不存在哪一种单一的算法对任何数据集都表现的很好[3],没有一种聚类算法能准确揭示各种数据集所呈现出来的多种多样的形状和簇结构,每一种聚类算法都有其优缺点,对于任何给定的数据集,使用不同的算法都会有不同的结果,甚至对于同一种算法给定不同的参数都会有不同的聚类结果,自然分组概念内在的不明确性决定了没有一个通用的聚类算法能适用于任何数据集的聚类问题。此外,类存在多样性的特点,类具有不同的形状、大小、密度,而且类之间往往是相互重叠的,这样的问题在高维数据中更加明显,因为不相关的或者冗余的特征会使类的结构更加不明显。K均值算法[5]是一种应用广泛的最经典的聚类算法之一,它的特点之一就是随机选取初始的聚类中心,如果选取的中心点不同,聚类结果就可能产生很大的差异。K均值聚类算法对初始中心点的依赖性,导致K均值算法的聚类结果不稳定。在这种情况下,聚类集成应运而生,许多学者在这个领域进行了深入的研究。
聚类集成的目的在于结合不同聚类算法的结果得到比单个聚类算法更优的聚类。对聚类集体中的成员聚类的问题成为一致性函数问题,或叫做集成问题。很多学者证实通过聚类集成可以有效的提高像K均值聚类这些单一聚类算法的准确性、鲁棒性和稳定性在现有的研究中,产生基聚类结果的方法有:
(1)使用同一种聚类算法,每次运行使用不同的参数和随机初始化;
(2)使用不同的聚类算法,如K均值产生多个不同的聚类;
(3)对数据集的子集聚类,子集通过不同采样像bagging、Sub-sampling等方法获得;
(4)在数据集的不同特征子集或在数据集的不同子空间的投影上聚类得到不同聚类结果构成聚类集体。我们的方法主要是对第四种聚类集成问题进行了深入研究,在数据集的不同子集上进行集成分析。对于高维数据来说,数据点为单位划分仍存在维数灾难的问题,维数灾难可能会引发这种现象,一个给定数据点与离它最近点的距离比与离它最远的数据点的距离近,所以我们引入同样的数据点但基于不同的特征子集就可能会避免这种问题。生成基聚类结果以后就是设计一致性函数对聚类结果集成,就是将聚类成员进行合并,得到一个统一的聚类结果。目前存在很多一致性函数,常用的有投票法、超图划分、基于共协矩阵的证据积累、概率积累等等,我们在文章中用了文献[1]中的方法,它是一种基于链接的方法。常规的集成方法往往基于一个由基聚类结果即这些数据基聚类结果内部的关系生成,忽略了这些结果之间的关系,所以Iam-on等利用簇之间的相似度来精炼集成信息矩阵。在高维数据中,我们将数据集的局部特征子集用作聚类成员与基于链接的集成聚类方法有效结合,解决了高维数据进行集成聚类的问题。
本文组织如下:第2节对聚类集成做了一个概述,并针对于高维数据这一特殊数据集提出了自己的集成聚类方法。第3节是本文的核心部分,它讲述了对特征进行分层抽样,并基于信息增益抽取出比较重要的具有代表意义的局部特征子集的过程,此外对传统的K均值算法的具体过程进行了简要的描述,然后引出了分层抽样的概念,用分层抽样的思想确定我们选择的特征的数目,最后给出了信息增益的定义,通过这个指标最终确定我们在每一个聚类簇中选择的特征;最后把我们前面的工作抽取局部特征子集与基于链接的方法结合起来形成了自己的算法描述;第4节首先对8个实际数据集包括文本、图像、基因数据进行描述,然后在这八个数据集上比较和分析了我们的方法(SSLB)和传统K均值算法和基于链接的聚类集成算法(LB)在四个聚类评价标准上的聚类性能;第5节是对全文的总结。
相关工作
聚类集成概述
聚类分析是按照某种相似性测度将多维数据分割成自然分组或簇的过程。聚类算法很多,但是没有一个万能的聚类算法能用于任何聚类问题,其原因在自然分组概念的内在不明确性以及类可以有不同的形状、大小、密度等,这个在高维数据中的问题更为明显,那些不相关的特征和冗余的特征会使类结构更加模糊。单个聚类存在的这些问题,引发了学者们对聚类集成的研究。首先由Strehl[12]等人提出”聚类集成”的概念,而后Gionis[13]等人也给出该问题的描述。杨草原等给聚类集成下了一个定义,认为聚类集成就是利用经过选择的多个聚类结果找到一个新的数据(或对象)划分,这个划分在最大程度上共享了所有输入的聚类结果对数据或对象集的聚类信息。
聚类集成的符号化形式为:假设数据集X有n个实例,X={x1,x2,…,xn},首先对数据集X使用M次聚类算法,得到M个聚类,={1,2,…,M}(下面称为聚类成员),其中i(i=1,2,…,M)为第i次聚类算法得到的聚类结果。然后用一致性函数T对的聚类结果进行集成得到一个新的数据划分’[1]
摘 要
图1聚类集成的基本过程。首先对数据集使用不同的聚类算法得到不同的划分,然后对这些划分用一致性函数合并为一个聚类结果P’
由上面的聚类集成过程可知,对一个数据集进行聚类集成,主要有两个阶段,第一个阶段是基聚类器对原始数据进行聚类,得到基聚类结果。第二个阶段是基聚类结果集成,根据聚类集成算法对前一个阶段采集的基聚类结果进行处理,使之能够最大限度地分享这些结果,从而得到一个对原始数据最好的聚类集成结果。
面向高维数据的集成聚类
信息时代互联网成为最大的信息聚集地,像Web文档、交易数据、基因表达数据、用户评分数据等等,这些成为聚类分析的主要研究对象,而这些数据的维度成千上万,甚至更高,这给聚类分析带来了极大的挑战。高维数据的聚类集成面临更多的问题。
传统的集成学习的第一步是产生多个基聚类结果,这一阶段是对数据集或者其子集反复进行聚类算法。现有的方法主要有:使用一个聚类算法,每次运行设置不同的参数和随机初始化;使用不同的聚类算法;对数据集的子集进行聚类;将数据集的特征空间投影到数据子空间。基聚类结果生成以后就开始对基聚类结果进行集成。一致性函数是一个函数或者是一个方法,它将聚类成员进行集成,得到一个统一的聚类结果。目前存在许多一致性函数,它大致可以分为:
(1)基于成对相似性的方法,它主要考虑的是所有的数据点对的关系的重现、
(2)基于超图划分的方法和(3)基于特征的方法,它是把聚类的集成转换为类标的集成。
针对高维数据的特点,我们选择基于相似性的方法对聚类结果进行集成,凝聚层次聚类算法是最经典的基于相似性方法,我们用了文献中的方法,他把SL凝聚聚类算法用来生成最终的划分。但是基于成对相似度的集成的过程都是一个比较粗糙的过程,集成的结果往往基于一个由基聚类结果即这些数据划分内部的关系生成,忽略了这些划分结果之间的关系,所以它使用了Iam-on[17]等利用簇之间的相似度来精炼集成信息矩阵,实验证明这种方法在很多数据集上表现很好,不仅增强了聚类稳定性也改善了聚类性能。由于我们研究的对象是高维数据,考虑到需要聚类的对象的维度很大,对完整的对象聚类一定会增加聚类算法的运行开销。这对基于链接的方法性能有所影响,因此,我们考虑对特征空间的局部特征子集进行聚类得到结果。经过上面的分析,我们引出自己的方法。我们对其中的基本步骤进行细化,我们的方法示意图如下:
我们方法的示意图,对聚类集成的过程进行了细化,描述了每一个过程的输入和输出
我们的方法就是针对高维数据的特点,对传统的聚类集成进行了一些改进,我们首先用前面提到的K均值算法对特征进行聚类,然后用信息增益来衡量不同簇中的特征的重要程度,而每个特征簇中的所抽取特征的数目nh由上面stratifiedsampling[18]的方法得到,最后利用信息增益选择top(nh)的特征。根据上述方法对特征进行降维,得到了最具代表的数据子集。数据子集的生成,变换K均值算法的k值,取k=2,3…√N(N为数据点的数目)生成不同的具有差异的数据子集,然后沿用[1]中的方法进行聚类集成,最后把这√N-2次的聚类结果进行最后一次集成得到我们最终的聚类结果。基于局部特征子集的生成方法内容在下一章详细讲述。
基于局部特征的数据子集生成方法
集成时使用哪种方法产生聚类成员一般从两个方面来考虑,一个是集成者的目的,一个是数据集的结构。在机器学习的实际应用中,我们面对的绝大多数都是高维数据。数据集的特征数量往往较多,可能存在不相关的特征,特征之间可能存在相互依赖,容易导致分析特征、训练模型的时间变长,甚至引发“维度灾难”,模型复杂推广能力下降。所以我们采用基于局部特征的数据子集生成方法。图3是我们生成局部特征的数据子集的示意图:
Fig 3 The basic process of the generation of feature subset
首先我们用传统的K均值算法对数据集的特征进行聚类,然后对于不同的特征簇我们用信息增益来衡量它的重要性,不同的特征簇中我们应该筛选多少特征簇呢?分层抽样很好的解决了这个问题,分层抽样的思想是计算每个实例之间的相关性(用标准差、方差来衡量),它认为类中的实例相关性比较大的可以选择较多的样本来代替当前类,类中相关性较小的就少选择一些实例来代替当前类的样本,根据分层抽样中计算出的特征簇的数目再利用信息增益这种衡量重要性的标准进行筛选后就得到了局部的特征子集。下面具体论述基于局部特征的数据子集生成方法中的关键技术。
k均值算法
K均值算法[5]是MacDueen提出的一个著名的聚类学习算法。它根据相似度距离迭代的更新向量集的聚类中心,当聚类中心不再变化或者满足某些停止条件,则停止迭代过程得到最终的聚类结果。K均值算法的具体步骤为:
(1) 随机选择k个数据项作为聚类中心;
(2) 根据相似度距离公式,将数据集中的每一项数据分配到离他最近的聚类中去;
(3) 计算新的聚类中心;
(4) 如果聚类中心没有发生改变,算法结束;否则跳转到第(2)步
我们使用K均值算法对数据集的特征进行聚类,我们通过选取不同的k值进行特征聚类,然后用后面的分层抽样进行选择得到差异度比较明显的局部特征的数据子集作为后面的聚类集成的输入。
信息增益
对特征进行聚类后得到多个特征团,如何对它们进行特征选择,如何度量特征团中的特征的重要程度是我们面临的问题。信息增益是信息论中的一个重要概念,它被广泛应用在机器学习、数据挖掘领域,计算信息增益是针对一个特征项而言的,它通过统计某一个特征项t在类别C中出现与否的实例数来计算特征项t对类别C的信息增益,定义为:
其中P(ci)表示ci类实例在数据集中出现的概率,p(t)表示数据集中包含特征项t的实例数,p(ci|t)表示实例包含特征项t时属于ci类的条件概率,p(t )表示数据集中不包含特征项t的实例数,p(c_i |t )表示实例不包含特征项t时属于ci类的概率,m为类别数。信息增益考虑特征与类别信息的相关程度,认为信息增益值越大,其贡献越大。我们的方法采用信息增益来度量特征簇中的特征的重要程度。
分层抽样(Stratified sampling)
在对特征进行聚类后对特征进行选择,我们采用信息增益来度量每个特征簇中的特征的重要程度。但是每个特征簇我们选择多少个特征比较合适,这是分层抽样解决的问题。抽样的目的是在不影响聚类效果的情况下在已经分好或者聚好类的实例中,从每个类中抽取部分的样本来代替整个类。Stratifiedsampling[18]方法遵循的原则是:计算每个实例之间的相关性(用标准差、方差来衡量),我们认为类中的实例相关性比较大的可以选择较小的样本来代替当前类,类中相关性较小的就多选择一些实例来代替当前类的样本。这个方法就是确定每个类中筛选的实例的数目。此方法中每个类的样本数目为:
其中nh是第h类应该抽取的实例数。n是预计抽取的总样本数,Nh是在总体样本中第h类的实例数,h是第h类的标准差。通过(1)式我们就可以得到每个类中应该选择的实例数目。提出这中抽样方法的学者还对它的精确度、置信区间进行了分析,证明了它在不影响学习效果的情况下对可以对数据降维,提高学习效率。
在本文的方法中,我们先用前面提到的k均值算法对特征进行聚类,然后用信息增益来衡量不同簇中的特征的重要程度,而每个特征簇中的所抽取特征的数目nh由上面stratifiedsampling的方法得到,最后利用信息增益选择top(nh)的特征。根据上述方法对特征进行降维,得到了最具代表的数据子集,进行后面的数据集的聚类集成。
实验结果与分析
实验数据集
本文选用了8个数据集,包括文献[1]中的两个数据集:一个人工数据集Four-Gaussian[19]和一个被用来做基因数据聚类的真实数据集Leukemiadataset[20],另外就是六个真实数据集包括两个文本数据集,两个图像数据集,两个基因数据。表1给出了这些数据集的名称以及数据的样本、属性、类别数量。
Table 1 Number of instance, features and classes of datasets
实验分析
实验中,本文对比了三种分类算法包括传统的k-means算法,文献[1]中的LB算法以及我们实现的算法SSLB。聚类性能通过下面四个评价指标来衡量,表2给出了这四个评价指标[1]的具体描述:
Table 2 Name of measures, formulas
K为聚类结果中簇的数目,nk是属于第k个簇的数据点数目,d(xi,xj)是数据点xi和xj的距离,N是数据集中数据点的总数。n11是指在两个划分’(正确的划分)和中出现在相同簇中的数据线对的个数,n00是指在两个划分’、中中出现在不同簇中的数据点对的个数,n01表示在划分中属于不同簇在另一个划分’ 中属于同一个簇的数据点对数目,n10表示在划分’中属于不同簇在另一个划分中属于同一个簇的数据点对数目。
其中CP衡量的是在同一个簇中,所有数据点的数据点对的平均距离,越小越好。CA衡量的是与已经的类标相比,聚类正确的数据点数目,CA的范围是从0到1,越大越好。RI这个指标衡量存在于相同和不同簇中的点对数目,RI的值从0到1,越大越好,AR也是越大越好。
本文对这8个数据集进行聚类集成,聚类成员由k均值对特征聚类然后分层抽样产生的局部特征子集获得,聚类中心的个数为数据集的类别数。为了增加实验的可靠性,所有的实验结果为10次结果的平均值。对比试验采用原始的K均值聚类算法、基于链接(LB)的方法,与我们实现的方法(SSLB)进行比较。在表3中,我们把关键值都突出的表现出来,在这8个数据集上,SSLB有在四个评价指标上都表现出比较大的优势。
根据表四,比较集成前的K均值算法、LB方法和SSLB方法,可以看出,在数据集Four-Gaussian上,SSLB在四种评价指标上都可以看出,其聚类性能明显优于集成前的K均值算法和LB聚类集成算法。在两种文本数据集Tr31和Tr41上,我们的方法优势不是很明显,但是在前两个指标CP和CA上还是明显好于集成前的K均值聚类,与LB算法在这两个指标上性能相当,而且在这两个文本数据上,在RI和AR上集成前的K均值算法与LB和SSLB方法相比都存在优势。在两个图像数据集上,SSLB方法在CP这个评价指标上都远远好于集成前的K均值聚类算法和LB算法,但是在第二个评价指标和第三个评价指标上就比LB算法差一点。在基因数据Colon上SSLB再第一个聚类评价指标上仍然存在很大的优势,在聚类的准确率上,我们的方法与LB方法相当,但是明显优于集成前的K均值算法。在基因数据TOX-171上,我们的方法获得了最好的聚类集成性能,在四个聚类评价指标上,都远远好于集成前的K均值算法和LB算法。
下面我们逐一在这四个聚类评价标准比较集成前的K均值算法、SSLB算法和LB算法。图四、图五、图六、以及图七分别描述了集成前的K均值聚类、LB以及我们的方法SSLB在CP、CA、RI、AR上的表现。
聚类评价指标CP衡量的是在同一个簇中,所有数据点的数据点对的平均距离,越小越好。通过图四可以看出,在所有数据集上,我们的算法SSLB都存在很大的优势,比集成前的K-means算法以及LB算法在CP这个指标上都好,此外还能看出CP在不同的数据集上的差异还是比较大的,在Four-Gaussian上明显比其他数据集上差。
聚类评价指标CA衡量的是与已知的类标相比,聚类正确的数据点数目占总的数据点数目的比例,CA的范围是从0到1,越大越好。从图五可以看出我们的算法在数据集Four-Gaussian、Tr41、Colon和TOX-171上的聚类精度比集成前的K均值算法以及LB算法都要好,但是在Tr31以及两个图像数据集上的优势不大,这这个现象值得我们关注,也是我们接下来会研究的工作。
聚类评价指标RI衡量的是存在于相同和不同簇中的点对数目,RI的值从0到1,越大越好。从图六可以看出我们的算法在人工数据集Four-Gaussian以及几个基因数据集上的表现比较突出、但是在其他数据集上就处于弱势,而且可以看出集成前的K均值算法在所有的数据集在RI上的表现都比较好。
聚类评价指标AR衡量的也是存在于相同和不同簇中的点对数目,AR的值从0到1,越大越好。从图七可以看出我们的算法SSLB在大多数数据集上存在着优势,但是在数据集Leukemia、Tr41、Colon上的超过了集成前的K均值算法和我们的算法。这些现象和结果都是我们接下来的研究的重点。
综上所述,在几乎所有数据集上,在所有的聚类评价指标上我们的聚类集成算法SSLB好于集成前K均值算法的聚类效果,而且在大多数数据集上,我们的算法比LB算法存在一定的优势,尤其是在基因数据上的表现较为突出。但是在有的数据集上优势也不够明显,我们要继续分析这些数据结构上的特点和我们的算法可能存在的问题,这也是我们接下来研究的方向。
结 论
本文提出了一种面向高维数据的集成聚类方法。针对高维数据的特点,对传统的聚类集成进行了一些改进,首先对特征聚类然后基于分层抽样抽取特征子集,抽取到最具代表性的特征子集后用基于链接的方法进行聚类集成。并在8个实际数据集包括文本、图像、基因数据上进行实验,在这8个数据集上分析和比较了我们的方法和集成前的K均值算法以及基于链接的聚类集成算法在四个评价标准上的聚类性能,能够看出我们的算法在聚类性能上有一定改善。
以上就是关于主成分聚类会提高准确率吗全部的内容,包括:主成分聚类会提高准确率吗、在进行聚类分析时结果出现重合部分如何解决、Python制作一个小学生加法准确率计算系统。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)