对ChiMerge问题的解析与程序实现(matlab)

此问题与数据挖掘中的ChiMerge算法相关,用matlab程序实现。


问题描述:

ChiMerge是监督的、自底向上的数据离散化方法。它依赖于卡方分析:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止标准。

(1)、简述ChiMerge如何工作。

(2)、取鸢尾花数据集作为待离散化的数据集合,鸢尾花数据集可以从UCI机器学习数据库得到。使用ChiMerge方法,对四个数值属性分别进行离散化。(令停止条件为:max-interval=6)。你需要写一个小程序,以避免麻烦的数值计算。提交你的简要分析和检验结果:分裂点、最终的区间以及源程序文档。

问题分析及回答:

(1)、ChiMerge的工作原理:

ChiMerge算法过程:

第一步:初始化:

       根据要离散的属性对实例进行排序;每个实例属于一个区间。

第二步:合并区间,又包括两步骤:

       A、计算每一对相邻区间的卡方值;

       B、将卡方值最小的一对区间合并。

       简化为:

        将离散属性值进行升序排序;

       将每个实例设置成单独区间;

       While(截止条件)

       {

              循环对每对相邻区间进行卡方计算,找出最小卡方值的相邻区间;

              对相邻区间进行合并;

       }

(2)对鸢尾花数值的ChiMerge处理:

输入为:鸢尾花数据集(http://archive.ics.uci.edu/ml/datasets/Iris

ChiMerge.m

%ChiMerge.m:This Program will achieve the ChiMeige function!

%File Read Part:
%格式化读文件:
[a,b,p,q,class] = textread( 'Iris.txt','%f,%f,%f,%f,%s' );

%Data Processing
%处理字符串:
t=size(class);
for i=1:t(1,1)
    if strcmp(class(i,1),'Iris-setosa')==1
        c(i,1)=1;
    elseif strcmp(class(i,1),'Iris-versicolor')==1
            c(i,1)=2;
    elseif strcmp(class(i,1),'Iris-virginica')==1
            c(i,1)=3;
    end
end
%具体运行
h1=[a c];
h2=[b c];
h3=[p,c];
h4=[q,c];
disp('Case 1:');
chime(h1);
disp('End!');
disp('Case 2:');
chime(h2);
disp('End!');
disp('Case 3:');
chime(h3);
disp('End!');
disp('Case 4:');
chime(h4);
disp('End!');

chime.m

%建立chime函数用于卡方值的计算及数据离散化操作
function m=chime(h)
%进行chimerge核心操作,建立区间矩阵,然后通过卡方检验离散化数据!
y=sortrows(h,1);%排序操作
ty=size(y);
leny=ty(1,1);
x=[y(:,1) y(:,1)];%初始化区间矩阵
tx=size(x);
lenx=tx(1,1);
while lenx>6
%外层循环,用于结束条件判定
    min=9999;
for j=1:lenx-1
%内层循环,用于找出具有最小卡方值的相邻区间
        ans=0;
        m=zeros(3,7);%此(卡方表)矩阵用于保存计算卡方值的相关数据
        %后面4个for循环用于卡方表数据的设置
        for i=1:leny
            if y(i,1)>=x(j,1)&&y(i,1)<=x(j,2)
                m(1,y(i,2))=m(1,y(i,2))+1;
            elseif y(i,1)>=x(j+1,1)&&y(i,1)<=x(j+1,2)
                m(2,y(i,2))=m(2,y(i,2))+1;
            end
        end
        for i=1:3
            m(3,i)=m(1,i)+m(2,i);
        end
        for i=1:3
            m(i,7)=m(i,1)+m(i,2)+m(i,3);
        end
        for i=1:2
            for k=4:6
                m(i,k)=m(i,7)*m(3,k-3)/m(3,7);
                if m(i,k)==0
                    m(i,k)=0.1;
                end
            end
        End
        %计算出这两个相邻区间的卡方值
        for i=1:2
            for k=1:3
                ans=ans+((m(i,k)-m(i,k+3))^2)/m(i,k+3);
            end
        End
        %找出最小卡方值
        if ans<=min
            min=ans;
            key=j;
        end
End
%相邻区间合并步骤
    x(key,2)=x(key+1,2);
    x(key+1,:)=[];
    lenx=lenx-1;
end
x


运行结果:

Case 1:
x =
    4.3000    4.8000
    4.9000    4.9000
    5.0000    5.4000
    5.5000    5.7000
    5.8000    7.0000
    7.1000    7.9000
End!
Case 2:
x =
    2.0000    2.2000
    2.3000    2.4000
    2.5000    2.8000
    2.9000    2.9000
    3.0000    3.3000
    3.4000    4.4000
End!
Case 3:
x =
    1.0000    1.9000
    3.0000    4.4000
    4.5000    4.7000
    4.8000    4.9000
    5.0000    5.1000
    5.2000    6.9000
End!
Case 4:
x =
    0.1000    0.6000
    1.0000    1.3000
    1.4000    1.6000
    1.7000    1.7000
    1.8000    1.8000
    1.9000    2.5000
End!


结论:

最后区间:
a: [4.3 , 4.8],[4.9 , 4.9], [5.0 , 5.4], [5.5 , 5.7], [5.8 , 7.0], [7.1 , 7.9].
b: [2.0 , 2.2], [2.3 , 2.4], [2.5 , 2.8], [2.9 , 2.9], [3.0 , 3.3], [3.4 , 4.4].
p: [1.0 , 1.9], [3.0 , 4.4], [4.5 , 4.7], [4.8 , 4.9], [5.0 , 5.1], [5.2 , 6.9].
q: [0.1 , 0.6], [1.0 , 1.3], [1.4 , 1.6], [1.7 , 1.7], [1.8 , 1.8], [1.9 , 2.5].
分裂点:
a: 4.3, 4.9, 5.0, 5.5, 5.8, 7.1
b: 2.0, 2.3, 2.5, 2.9, 3.0, 3.4
p: 1.0, 3.0, 4.5, 4.8, 5.0, 5.2
q: 0.1, 1.0, 1.4, 1.7, 1.8, 1.9
时间: 2025-01-31 05:48:48

对ChiMerge问题的解析与程序实现(matlab)的相关文章

SUN核心解析--常规程序编写--集合类

上次关于JAVA的文章<SUN核心解析--常规程序--基本类>从简单基本类简单说名了JAVA的部分原理以及JAVA的底层对于编写优秀代码的重要性,但是就知识面是较窄的,包括今天说的集合类,也只是皮毛而已,只是从我个人的角度,由一点点实践希望可以在这方面起到一点抛砖引玉的作用,下面进入正题:   首先我从自己的角度来说,对于JAVA的内存管理思想(因为从我的角度来说不知道内存大致怎么样的,学习集合类只是应付一些常规开发而已,对集合类的底层根本一无所知,也许通过本文对集合类还是不太理解,但是大致原

123-克里金插值 程序 基于MATLAB 详细说明也可以哈

问题描述 克里金插值 程序 基于MATLAB 详细说明也可以哈 各位大侠,有没有可以使用的克里金插值程序?能成功运行的MATLAB程序最好了 解决方案 参考克里金插值工具箱 下载地址克里金插值工具箱,也提供sample程序下载. 解决方案二: 这里有一个克里金插值的MAtlab工具箱 http://blog.csdn.net/congduan/article/details/6765231 我在做数学建模的时候用过 解决方案三: 这种网上一般都有现成的代码下载,下面这个链接就可以下载http:/

解析Java程序中对象内存的分配和控制的基本方法_java

一.对象与内存控制的知识点 1.java变量的初始化过程,包括局部变量,成员变量(实例变量和类变量). 2.继承关系中,当使用的对象引用变量编译时类型和运行时类型不同时,访问该对象的属性和方法是有区别的. 3.final修饰符特性. 二.java变量的划分与初始化过程 java程序的变量大体可以分为成员变量和局部变量,成员变量可以分为实例变量(非静态变量)和类变量(静态变量),一般我们遇到的局部变量会在下列几种情况中出现: (1)形参:在方法签名中定义的局部变量,由调用方为其赋值,随着方法结束消

1.Android中解析json程序代码

Android程序解析json数据可以通过gson的方式,这种情况需要导入相应的jar包.测试代码如下: @Override    protected void onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);       setContentView(R.layout.activity_main);         if (savedInstanceState == null) {  

解析应用程序用户界面设计的15项黄金规则

好友曾向我展示了最新的 iPhone和iPad版<极品飞车>.游戏的渲染效果令人印象深刻,是款蓄势待发的优秀游戏.但是,游戏的前端是典型的UI设计偏差案例.但界面中有大量的属性数据等内容,它在玩家没有时间做决定时提供了过多的内容.这些内容能够显著改变他们的游戏体验,但却在玩家往往感受不到变化的时候呈现. 极品飞车(from itunes.apple.com) 这促使我开始思考UI设计的黄金法则.以下是我认为创造最佳体验应当使用的UI设计方法.坦诚地说,这些规则只是通用做法,并不完全适用于你的U

让木马不在兴风作浪:解析木马程序的藏身之处_网络冲浪

特洛伊木马往往是在你不注意的时候就进入到你的系统中兴风作浪,本文就介绍了一些他们经常藏身的地方.看完本文,那怕你不是高手你也能轻松的清除系统中的木马程序. 1.集成到程序中 其实木马也是一个服务器-客户端程序,它为了不让用户能轻易地把它删除,就常常集成到程序里,一旦用户激活木马程序,那么木马文件和某一应用程序捆绑在一起,然后上传到服务端覆盖原文件,这样即使木马被删除了,只要运行捆绑了木马的应用程序,木马又会被安装上去了.绑定到某一应用程序中,如绑定到系统文件,那么每一次Windows启动均会启动

深入解析C++程序中激发事件和COM中的事件处理_C 语言

本机 C++ 中的事件处理在处理本机 C ++ 事件时,您分别使用 event_source 和 event_receiver 特性设置事件源和事件接收器,并指定 type=native.这些特性允许应用它们的类在本机的非 COM 上下文中激发和处理事件. 声明事件 在事件源类中,对一个方法声明使用 __event关键字可将该方法声明为事件.请确保声明该方法,但不要定义它:这样做会产生编译器错误,因为将该方法转换为事件时编译器会隐式定义它.本机事件可以是带有零个或多个参数的方法.返回类型可以是

实例解析Ruby程序中调用REXML来解析XML格式数据的用法_ruby专题

REXML 是由 Sean Russell 编写的库.它不是 Ruby 的唯一 XML 库,但它是很受欢迎的一个,并且是用纯 Ruby 编写( NQXML 也是用 Ruby 编写的, 但 XMLParser 封装了用 C 编写的 Jade 库). 在他的 REXML 概述中,Russell 评论道: 我有这样的问题:我不喜欢令人困惑的 API.有几种用于 Java 实现的 XML 解析器 API.其中大多数都遵循 DOM 或 SAX,并且在基本原理上与不断出现的众多 Java API 非常相似.

php中DOMDocument与SimpleXML创建与解析xml程序

例子: DOM XML 解析器函数是 PHP 核心的组成部分.无需安装就可以使用这些函数. XML 文件 将在我们的例子中使用下面的 XML 文件:  代码如下 复制代码 <?xml version="1.0" encoding="ISO-8859-1"?> <note> <to>George</to> <from>John</from> <heading>Reminder</