一、聚类融合算法简介:

现有的聚类算法对被处理的数据集都有一个假设,例如K-Means算法不适合处理非球形分布的簇,DBSCAN算法不适合处理密度变化不大的簇等。在聚类分析之前,必须根据数据的特点选择合适的聚类算法。在现实中,簇的形状和规模是任意的,聚类问题中有没有类标号的指导,在进行聚类分析时选择合适的聚类算法是非常困难的。为了解决这一问题,近年来许多学者提出了一种新的聚类模式,聚类融合。聚类融合即时是集成学习在无监督学习领域的应用,它的基本思想是将同一问题的多个聚类结果进行融合成一个聚类的结果。

几种典型的聚类融合算法:

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 java.io.FileWriter;import weka.clusterers.ClusterEvaluation;
import weka.clusterers.SimpleKMeans;
import weka.core.DistanceFunction;
import weka.core.EuclideanDistance;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;
import weka.filters.unsupervised.attribute.Remove;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 = 0.5;/** 生成一个聚类器 */public void buildClusterer(Instances data) throws Exception{final int numinst = data.numInstances(); // 数据集的大小double [][]association = new double[numinst][numinst]; // 定义并初始化一个关联矩阵int numIteration = 40; // 设置生成的聚类成员数final int  k = (int)Math.sqrt(numinst); // 设置K-Means聚类算法参数——簇数for(int i = 0; i < numIteration; i++) {if(data.classIndex() == -1)data.setClassIndex(data.numAttributes() - 1); // 索引是从0开始String[] filteroption = new String[2];filteroption[0] = "-R";filteroption[1] = String.valueOf(data.classIndex() + 1);// 索引是从1开始Remove remove = new Remove();remove.setOptions(filteroption);remove.setInputFormat(data);/* 使用过滤器模式生成新的数据集;新数据集是去掉类标签之后的数据集 */Instances newdata = weka.filters.Filter.useFilter(data, remove);/* 生成一个K-Means聚类器 */SimpleKMeans sm = new SimpleKMeans();sm.setNumClusters(k);sm.setPreserveInstancesOrder(true); // 保持数据集实例的原始顺序sm.setSeed(i); // 通过设置不同的种子,设置不同的簇初始中心点,从而得到不同的聚类结果sm.buildClusterer(newdata);int[] assigm = sm.getAssignments(); // 得到数据集各个实例的赋值/* 建立关联矩阵 */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] + 1.0 / numIteration ;}}}           }System.out.println();/* 将生成的关联矩阵写入.txt文件(注:生成的txt文本文件在e:/result.txt中) */FileWriter fw = new FileWriter("e://result.txt");for(int j = 0; j < numinst; j++) {for(int m = j; m < numinst; m++) { //由于关联矩阵是对称的,为了改进算法的效率,只计算矩阵的上三角String number = String.format("%8.2f", association[j][m]);fw.write(number);}fw.write("\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];System.out.println("基于关联矩阵的聚类融合算法——Voting-K-Means算法的最终聚类结果");for(int i = 0; i < numinst; i++) {m_Assignments[i] = finallabel[i];System.out.print(finallabel[i] + " ");  if((i+1) % 50 == 0)System.out.println();}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//iris.arff";Instances data = DataSource.read(filename);Votingkmeans2 vk = new Votingkmeans2();vk.buildClusterer(data);/* 要生成Voting-K-Means的聚类评估结果包括准确率等需要覆盖重写toString()方法;* 因为没有覆盖重写,所以这里生产的评估结果没有具体内容。*/ClusterEvaluation eval = new ClusterEvaluation();eval.setClusterer(vk);eval.evaluateClusterer(new Instances(data));           System.out.println(eval.clusterResultsToString());} catch (Exception e) {e.printStackTrace();}}
}

分析代码时注意:得到的类成员变量m_Assignments就是最终Voting-K-Means聚类结果;由于是采用了开源机器学习软件Weka中实现的SimpleKMeans聚类算法,初始时要指定簇的个数,这里是数据集大小开根号向下取整;指定的阀值为0.5,即当关联矩阵元素的值大于阀值时,才对该元素对应的两个数据点进行融合,划分到一个簇中,考虑两种情况,代码注释已有,这里不再详述。但聚类融合的实验结果并不理想,莺尾花数据集irsi.arff是数据挖掘实验中最常用的数据集,原数据集共有三个类;但本实验进行四十个聚类成员的融合,其最终聚类结果划分成两个簇;其原因可能有两个:一是算法本身的问题,需要使用其他更加优化的聚类融合算法;二是实现上的问题,主要就在聚类结果的融合上,需要进行一步对照关联矩阵进行逻辑上的分析,找出代码中的问题。关联矩阵文本文件 http://download.csdn.net/detail/lhkaikai/7294323

基于关联矩阵的聚类融合算法——Voting-K-Means算法相关推荐

  1. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  2. 数据挖掘--“聚类”详解、K-means、K-平均值算法、K均值算法

    一. 什么是聚类 二. 聚类步骤 三. 聚类算法有哪些 1 层次聚类算法 2 划分聚类算法 3 基于密度的聚类算法 4 基于网格的聚类算法 5 基于模型的聚类算法 一. 什么是聚类? 物以类聚,人以群 ...

  3. k均值算法 二分k均值算法_如何获得K均值算法面试问题

    k均值算法 二分k均值算法 数据科学访谈 (Data Science Interviews) KMeans is one of the most common and important cluste ...

  4. k均值算法 二分k均值算法_使用K均值对加勒比珊瑚礁进行分类

    k均值算法 二分k均值算法 Have you ever seen a Caribbean reef? Well if you haven't, prepare yourself. 您见过加勒比礁吗? ...

  5. KNN算法(K临近算法)及使用KNN算法实现手写数字0-9识别

    首先感谢博主倔强的小彬雅,本文使用的素材及部分代码来源其博文机器学习入门-用KNN实现手写数字图片识别(包含自己图片转化),需要下载素材的可以到其博文最后进行下载. 关于KNN算法 knn算法也叫K临 ...

  6. 非局部相似性 matlab,基于引导核聚类的非局部均值图像去噪算法

    非局部均值(nonlocal means, NLM)图像去噪算法是根据图像中存在的大量冗余信息,用非局部自相似性原理抑制噪声的算法.最初的NLM算法由文献[ 在NLM改进算法中,文献[[在相似窗结构张 ...

  7. 5 模式识别-动态聚类算法(K均值算法、迭代自组织的数据分析ISOData算法)

    武汉理工大学资源 郭志强 动态聚类算法:先选取初始的中心(每个类别的初始中心),然后把所有的样本进行聚类分析,聚类完成后,就去判断这个聚类结果合不合理(满不满足设计指标要求),如果合理就输出聚类结果( ...

  8. 机器学习算法总结--K均值算法

    参考自: <机器学习> 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) K-Means Clustering 斯坦福大学公开课 :机器学习课程 简介 K-均值是 ...

  9. k means算法C语言伪代码,K均值算法(K-Means)

    1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...

最新文章

  1. 你要的用户画像实践来了!
  2. 8、显示程序占用内存多少.txt
  3. Linux文本模式中文乱码
  4. 如何在Eclipse和Android Studio中导入library project
  5. 【后端过程记录】用flask搭建服务器作后端接收数据 将base64字符串码解码为可读取文件 载入训练好的模型进行预测
  6. VTK:图表之RandomGraphSource
  7. ABAP Create Decision Step in Workflow
  8. 《JavaScript 高级程序设计》笔记 第7章及以后
  9. debian10树莓派4安装mysql_树莓派4上如何安装 Raspbian Buster
  10. matlab时域分析论文,基于Matlab语言的数字信号时域相关性研究与分析.doc
  11. 游戏工委:已有63家单位响应防止未成年人沉迷通知
  12. 你的跨境电商独立站访问性能如何?
  13. redis的持久化(RDB与AOF)未完待续
  14. Linux系统编程 -- stdin stdout stderr
  15. 播放.avi后缀视频报出0xc00d5212,编码格式不支持
  16. Map-Based Indoor Pedestrian Navigation Using an Auxiliary Particle Filter
  17. 金笛邮件倒入专题之Umail倒入
  18. 微信小程序——如何实现账号的注册、登录?
  19. 怎么简单把word转成PDF并生成书签
  20. 图表制作办公首选--实用图表工具Echars

热门文章

  1. [中秋特别定制版本]绝美登录页面搭配[登录数据存储到服务器](服务器宝塔数据库开通+短信服务开通+后端redis验证码缓存)
  2. 超快速的python代理IP提取程序
  3. CSDN招聘兼职Blog技术编辑一名
  4. 如何评估移动GPU性能:以及4个需要了解的Android GPU 本地性能测试工具
  5. 管理驾驶舱后台内存数据库解决方案
  6. 学计算机好还是学电子信息类好,电子信息类就业前景好吗 就业方向有哪些
  7. SOCKET函数详解
  8. 大数据开发语言Scala(三)——伴生类和伴生对象
  9. 残差网络(Residual Network,ResNet)原理与结构概述
  10. 【计算机科学基础】加密算法