Weka算法Clusterers-Xmeans源码分析(二)

机器学习(ML)(三)——分类算法 机器学习 阅读详情


上一篇文章不知道为什么前面部分乱码了,我会在这篇文章后面写个总结,总结之前开头的部分。


首先处理两个问题,第一个是splitCenter用于对已有中心进行分裂,第二个是newCentersAfterSplit,根据分裂后的BIC计算出新的聚类中心,这个分裂机制可以算是XMeans区别于KMeans的最大不同点。


一、splitCenter

 protected Instances splitCenter(Random random,
			        Instance center,
			        double variance,
			        Instances model) throws Exception {
    m_NumSplits++;
    AlgVector r = null;
    Instances children = new Instances(model, 2);

    if (m_DebugVectorsFile.exists() && m_DebugVectorsFile.isFile()) {
      Instance nextVector = getNextDebugVectorsInstance(model);
      PFD(D_RANDOMVECTOR, "Random Vector from File " + nextVector);
      r = new AlgVector(nextVector);
    }
    else {
      //这个model是表头,r是生成一个随机向量,每一维都是0到1之间
      r = new AlgVector(model, random);
    }
    r.changeLength(Math.pow(variance, 0.5));//改变向量的长度为sqrt(variance)这个variance就是聚类点到聚类中心的平均偏差
    PFD(D_RANDOMVECTOR, "random vector *variance "+ r);
    
    // 首先生成两个聚类中心的向量
    AlgVector c = new AlgVector(center);
    AlgVector c2 = (AlgVector) c.clone();
    c = c.add(r);//c+r
    Instance newCenter = c.getAsInstance(model, random);
    children.add(newCenter);
    PFD(D_FOLLOWSPLIT, "first child "+ newCenter);
    
    // c2-r
    c2 = c2.substract(r);
    newCenter = c2.getAsInstance(model, random);
    children.add(newCenter);
    PFD(D_FOLLOWSPLIT, "second child "+ newCenter);

    return children;
  }

执行过后的结果如图所示:



二、newCentersAfterSplit

protected Instances newCentersAfterSplit(double[] pbic, 
					 double[] cbic,
					 double cutoffFactor,
					 Instances splitCenters) {

    // 
    boolean splitPerCutoff = false;
    boolean takeSomeAway = false;
    boolean[] splitWon = initBoolArray(m_ClusterCenters.numInstances());//这个数组存放每个聚类中心是否分裂的决定
    int numToSplit = 0;
    Instances newCenters = null;
    
    for (int i = 0; i < cbic.length; i++) {
      if (cbic[i] > pbic[i]) {
	// 如果child的BIC比较大,就分裂,为什么是BIC越大越好而不是越小越好?Weka的BIC公式貌似没取负。
	splitWon[i] = true; numToSplit++;
	PFD(D_FOLLOWSPLIT, "Center " + i + " decide for children");
      }
      else {
	// 默认是false,不用重新赋值。
	PFD(D_FOLLOWSPLIT, "Center " + i + " decide for parent");
      }
    }

    if ((numToSplit == 0) && (cutoffFactor > 0)) {
      splitPerCutoff = true;
      
      // 如果没有节点需要分裂,则使用cutoffFactor来决定要分裂的数量,这么做的原因是为了防止陷入局部最优点。
      numToSplit = (int) 
        ((double) m_ClusterCenters.numInstances() * m_CutOffFactor); 
    }

    // 把pbic和cbic进行相减,并排序,以便找出差最大的,优先分裂。
    double[] diff = new double [m_NumClusters];
    for (int j = 0; j < diff.length; j++) {
      diff[j] = pbic[j] - cbic[j];
    }    
    int[] sortOrder = Utils.sort(diff);
    
    //检查一下最多的可分裂数量
    int possibleToSplit = m_MaxNumClusters - m_NumClusters; 

    if (possibleToSplit > numToSplit) {
      // 如果可分裂数量多于numToSplit,就按照numToSplit去分裂
      possibleToSplit = numToSplit;
    }
    else
      takeSomeAway = true;

    // 如果有splitPerCuteoff标,说明使用了cutoffFactor来决定分裂多少,这时候splitWon里面肯定都是false,需要设置一定数量的为true
    if (splitPerCutoff) {
      for (int j = 0; (j < possibleToSplit) && (cbic[sortOrder[j]] > 0.0);
	   j++) {
	splitWon[sortOrder[j]] = true;
      }
      m_NumSplitsStillDone += possibleToSplit;
    } 
    else {
      // take some splits away if max number of clusters would be exceeded
      if (takeSomeAway) {
	int count = 0;
	int j = 0;//如果有这个标,说明能分裂的数量小于了splitWon中的数量,需要将一定数量得true设置为false
	for (;j < splitWon.length && count < possibleToSplit; j++){
	  if (splitWon[sortOrder[j]] == true) count++;
	}
	
	while (j < splitWon.length) {
	  splitWon[sortOrder[j]] = false;
	  j++;
	}
      }
    }
   
    // 进行分裂操作,即若splitWon==true就分裂,否则保持原样
    if (possibleToSplit > 0) 
      newCenters = newCentersAfterSplit(splitWon, splitCenters);
    else
      newCenters = m_ClusterCenters;
    return newCenters;
  }



三、总结

首先来回顾一下整个算法流程:

1、随机选取聚类中心

2、对于每个实例,分配到离其最近的聚类中心

3、重新计算新的聚类中心

4、尝试对新的聚类中心进行分裂

5、回到2,若连续两个循环结果相同,则结束

可以看出,和传统的Kmeans相比,Xmeans最重要的改进在于可以自动决定聚类中心的数量,并进行“智能”的分裂。


最后总结一下第一篇文章开头(虽然现在已经乱码了)提出的问题:

1、如何计算各用例之间的“距离”

答:默认使用欧式距离,但可以定制传入距离函数,来计算任意两个用例的距离。

2、所谓的“迭代退出条件”是什么。

迭代有两层,分别为外层迭代和内层迭代,每一次外层迭代产生不同的聚类中心,每一次内层迭代将用例分配到各聚类中心。

外层迭代退出条件有三个:(1)达到最大迭代次数,(2)两次外层迭代产生聚类中心数量相等,即聚类中心没有分裂,(3)达到最大的聚类个数

内层迭代退出条件有二个:(1)两次内层迭代所有用例分配到的聚类中心一样(2)达到最大迭代次数

3、如何确定聚类中心

答:所有属性的算数平均值为聚类中心。

4、在实现过程中有没有一些用来提高效率的trick

使用了KDTree来寻找某个用例离得最近的中心。




Weka算法Clusterers-Xmeans源码分析(一) Weka算法Clusterers-Xmeans源码分析 阅读详情

相关推荐

Weka算法Classifier-tree-J48源码分析(一)算法和基本数据结构

Weka分类树J48源码解析

锐之锋芒 2万+

x-means简介

转载自https://www.cnblogs.com/porco/p/xmeans_intro.html,后续有时间看完原论文后再更新,先占坑。 本文基于《X-means》和《BIC-notes》(原论文中BIC公式有误,这是对BIC的补充) K-means的缺点 每一轮迭代的计算花费大 需要用户指定K 易于收敛到局部最优解 X-means的改进 使用kd-tree加速原K-mea...

小太阳~ 8237

GEE土地分类:Google Earth Engine 进行非监督土地覆盖分类(k-means,、CascadeKMeans、wekaLVQ和wekaXMeans聚类分析)和 时序的NDVI 分析

本文介绍了四种聚类算法(K-Means、CascadeKMeans、WekaLVQ 和 WekaXMeans)的原理、优缺点及适用场景,并通过 Google Earth Engine 平台展示了这些算法在土地覆盖分类和 NDVI 分析中的应用。K-Means 适合处理简单且均匀分布的数据,CascadeKMeans 通过分层聚类提高大规模数据处理的效率,WekaLVQ 适合非线性可分数据,WekaXMeans 则自动选择最佳簇数量,适合复杂数据集。文章还详细描述了如何使用 GEE 加载气候数据、训练模型、进

此星光明博客 463

机器学习三-xmeans

能力有限,只是表面上理解了公式和图所表达的内容论文参见:点击打开链接已有文章分析参见:点击打开链接具体java代码实现:点击打开链接核心应该是 分割前BIC分数 &gt;分割后BIC分数     结论是 原簇可分割为两个新簇图示如下公式如下公式含义参见代码具体内容 代码分析如下: * 计算给定中心的BIC。 * * @参数k是簇的数量。 * * @参数n样本总数。 * ...

只作为个人备忘录 3290

Java实现对Weka算法的应用案例

Java实现对Weka算法的应用案例。Java实现对Weka算法的应用案例。Java实现对Weka算法的应用案例。

weka中K-means使用演示

聚类分析算法K-means在weka下使用方法

【Estimation of the Number of Clusters】X-means in ICML 2000 个人理解

估计无标签数据的类别数量并聚类。

研究兴趣:开放集识别、开放世界识别、新类发现、增量学习、少样本学习 653

X-means.zip_X means matlab_改进K-means算法_改进的k-means_聚类 改进

对K-means聚类算法的改进X-means算法。针对K值如何设定的问题,利用BIC准则判断聚类点数量。同时附有两个初始聚类点的选择程序,自己选吧。

#Paper Reading# X-means:Extending K-means with Efficient Estimation of the Number of Clusters

论文题目:X-means:Extending K-means with Efficient Estimation of the Number of Clusters 论文地址:http://cs.uef.fi/~zhao/Courses/Clustering2012/Xmeans.pdf 论文大体内容: 针对K-means的一些缺点,本文提出了K-means的拓展版——X-means聚类

John159151的专栏 2002

R语言实战:5分钟搞定相加交互效应分析(逻辑回归/Cox回归/GLMM/GEE全支持)

本文详细介绍了如何利用R语言中的`scitable`包快速实现相加交互效应分析,支持逻辑回归、Cox回归、GLMM和GEE等多种模型。通过自动化计算RERI、AP和SI等指标,大幅提升临床研究和流行病学分析的效率与准确性,特别适合处理多因素联合作用的复杂场景。

fanta的博客 670

如何下载最新版本的VMware Workstation

随着虚拟化技术的发展,VMware Workstation作为行业领先的桌面虚拟化软件,为用户提供了在单一物理计算机上运行多个操作系统的能力。本文将详细介绍如何从Broadcom支持网站下载最新的VMware Workstation Pro版本。

安呀智数据坊的博客 669

Weka算法Clusterers-Xmeans源码分析

转自:http://blog.youkuaiyun.com/roger__wong/article/details/39755615 http://blog.youkuaiyun.com/roger__wong/article/details/39617309 [java] view plaincopy "font-size:18px">上几篇博客

neuqxzy的专栏 1443

Windows C语言编程:Beep API实现蜂鸣器原理与实战

如果你在 Windows 上写过 C 语言程序,想给程序加个简单的提示音,第一个想到的可能是 printf("\a") 。这个转义字符确实能在某些终端里发出“嘀”的一声,但它太原始、太不可控了,而且很多时候根本没声音。那么,有没有一种更“Windows”、更可控、更专业的方法来让你的程序“说话”呢? 答案是肯定的,而且它比你想象的要强大和复杂。Windows 提供了一个名为 Beep 的 API 函数,专门用于生成蜂鸣声。你可能觉得这功能太简单,甚至有点过时——不就是让电脑“哔”一声吗?但恰恰是这个看似简单

weixin_34109408的博客 395

XMeans聚类算法

参考博客: https://blog.youkuaiyun.com/quiet_girl/article/details/79553898 https://blog.youkuaiyun.com/luman1991/article/details/79340381 K-means的缺点 每一轮迭代的计算花费大 需要用户指定K 易于收敛到局部最优解 X-means的改进 使用kd-tree加速原K-means...

qq_31157999的博客 7537

ENVI哨兵一号数据处理

使用ENVI+SarScape处理哨兵数据

Rjjjjj11的博客 2万+

btstack ble ota开发笔记(2)-mcuboot移植

紧接上一篇文章,要实现一个完整的ota demo,除了实现ota image的传输通道外,还需要“bootloader”这个角色来帮我们实现ota image的校验、安全、引导以及启动,这里我选择开源的组件mcuboot,下面开始介绍mcuboot在stm32f4-discovery上的移植。首先估算下bootloader & application image的大小,确定好flash的分布情况,因为后续会涉及到flash的操作(读、写、擦除),为了方便程序的编写,各个image area在flash中的起

weixin_38177846的博客 2350

【Python/Pytorch 】-- K-means聚类算法

时间演变聚类算法:将时间演变聚类算法用在去噪上,基本思想是,具有相似信号演化的体素具有相似的模型参数值,并且由机器学习决定的集群数量远远小于体素的数量。因此,对一个聚类进行平均可以大大提高聚类级逆解的信噪比,这可以用作体素级优化的鲁棒初始猜测。在该演变算法的基础上,总结了K-means算法、X-means算法、最小二乘法、贝叶斯信息准则。

银尘博客 3342

K230+canMV开发中常见的数据类型转换参考示例

【代码】K230+canMV开发中常见的数据类型转换参考示例。

weixin_47446386的博客 68

[x-means] 1.x-means简介

本文基于《X-means》和《BIC-notes》(原论文中BIC公式有误,这是对BIC的补充) K-means的缺点 每一轮迭代的计算花费大 需要用户指定K 易于收敛到局部最优解 X-means的改进 使用kd-tree加速原K-means的每一轮迭代 用户指定K所属的范围,根据BIC score选到最优K 每一轮迭代只进行2-means(2-means对局部最优解不敏感) X...

weixin_30814329的博客 482

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

基于数据挖掘的入侵检测系统实验

数据挖掘算法可以挖掘隐藏于大数据中的信息。入侵数据也具有大数据的特点,数据挖掘的许多方法可以应用于入侵检测,如聚类、分类、关联分析、序列分析方法。 “物以类聚,人与群分”即为聚类的通俗理解。聚类将数据按相似性的原则进行分类,分类后的类别称为簇;每个簇内有很大的相似性,而不同簇之间有很大的相异性。聚类是将物理或抽象对象的集合划分成多个类的过程,每一类都由相似的对象组成。聚类分析也是无监督学习的过程;与分类不同,在学习的过程不依赖于预先定义的类或带类标记的训练集,而是通过自身算法进行分

Fright-Moch的博客 2925

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

基因组 组装

基因组 de novo 组装原理 Falcon软件的组装流程 为了错误校正,将原始子reads进行overlap 预组装和错误校正 错误校正后reads的overlap检测 overlap的过滤 从overlap构建图 从图构建contigs 几个解释: sub-reads是啥?为什么要进行错误校正?校正的原理是什么?length_cutoff和length_cutoff_pre分别是什么意思,为什么要设置这两个参数? sub-reads就是机器出来的reads经过处理后的子reads,方

wangprince2017 7701

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Weka算法Clusterers-Xmeans源代码分析(一)

<p></p><p><span style="font-size:18px">上几篇博客都是分析的分类器算法(有监督学习),这次就分析一个聚类算法(无监督学习)。</span></p><p><span style="font-size:18px"></span></p&gt...

weixin_30532837的博客 269
上一篇: Weka算法Clusterers-Xmeans源码分析(一)
下一篇: Weka算法Classifier-meta-AdaBoostM1源码分析(一)
ROger__Wong
博客等级 码龄14年 250粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值