有关属性离散化算法CACC的补充说明

题目:有关属性离散化算法CACC的补充说明

注:本文有更新,参见有关属性离散化算法CACC的再次补充说明》。以下为原文:

        在《贝叶斯网络结构学习之连续参数处理方法》中,开篇就提到“首先必须说明:严格来说,这不是一篇完整的文档,因为文档最后并没有给出确定的结果,至少个人不认为文档引用的几个程序一定是正确的。”,本篇给出一个肯定性的回答:文中提到的两个CACC实现版本中Julio Zaragoza的实现代码是正确的。

        本篇补充说明主要是为了复现CACC原论文【Tsai C J, Lee C I,Yang W P. A discretization algorithm based on Class-Attribute Contingency Coefficient[J]. Information Sciences, 2008, 178(3):714-731.】中Table 6的结果,用来离散化Table 2的Age数据集。

        执行Julio Zaragoza的代码,你会发现并得不到Table 6的结果,这是因为论文中对CACC的描述与具体实现有一点差异,当然可能不是作者有意为之,下面阐述这点很小的差异:

        注意作者在式(4)定义cacc时区别于式(3)的是用y’替代了y,而y’与y的区别是除以了一个log(n),其中n是间隔个数(number of intervals)。在Julio Zaragoza的实现代码中,第143行到第153行实际在实现(虽然程序中以变量y命名的):


然后第155行到第156行得到y’ :


注意代码中除以log(n)中的n等于length(discscheme)-1,这里的discscheme指的是离散化的边界值,比如discscheme=[3, 10.5, 28, 48.5, 61.5, 71]是将年龄3~71划分成了5个离散值,即[3,10.5], (10.5, 28], (28, 48.5], (48.5, 61.5], (61.5, 71],显然划分的间隔数量比discscheme包含的元素个数少一个,因此n=length(discscheme)-1,这显然是正确的。然后第158行到第159行实际在计算式(4):

        但是,执行Julio Zaragoza的代码的确得不到Table 6的结果。为了方便地看结果,我注释掉了代码第82行的caccval,并不要每次都输出这个值:


然后去掉了第100行代码最后的分号:


这样做是为了每次只输出Maximum cacc,即Table 6的最后一列。

        然后执行main.m文件,输出如下:

>> main

cacc discretization…

globalcacc =

   0.5925

globalcacc = 

   0.6903

discdata = 

    1     1

    1     1

    1     1

    2     2

    2     2

    2     2

    2     3

    2     3

    2     3

    2     2

    2     2

    2     2

    3     1

    3     1

    3     1

discvalues =

   [3×1 double]

   [3×1 double]

discscheme =

   [1×4 double]

        很明显这并不是Table 6的结果。这让我百思不得其解,一次偶然的机会,我突然似乎得到了Table 6的结果,具体过程不表,这里只说最后结果,将第156行修改为:


        其实就是把原来的“减1”去掉了,也就是说,这时候不再是除以log(n),而是除以log(n+1)。然后再次运行main.m文件,输出如下:

>> main

cacc discretization…

globalcacc = 

   0.5045

globalcacc =

   0.6473

globalcacc =

    0.6612

globalcacc =

   0.7263

discdata =

    1     1

    1     1

    1     1

    2     2

    2     2

    2     2

    3     3

    3     3

    3     3

    4     2

    4     2

    4     2

    5     1

    5     1

    5     1

discvalues =

   [5×1 double]

   [3×1 double]

discscheme =

   [1×6 double]

        这时候再与Table 6的结果比较会发现一模一样,尤其是四个Maximum cacc最能说明问题,一模一样!

 

【注】本文假设你已经将Julio Zaragoza的CACC实现代码保存为cacc.m和main.m两个文件。其中原Julio Zaragoza的CACC实现代码参见《贝叶斯网络结构学习之连续参数处理方法》或者代码的链接:

https://cn.mathworks.com/matlabcentral/fileexchange/41740-discretization-methods–class-attribute-contingency-coefficient–cacc-matlab-?s_tid=prof_contriblnk

Published by

风君子

独自遨游何稽首 揭天掀地慰生平