注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Koala++'s blog

计算广告学 RTB

 
 
 

日志

 
 

Weka开发[15]-ZeroR源代码介绍(入门篇)  

2009-03-07 14:55:40|  分类: 机器学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最近除了外语,实在想不出有什么值得去做的事情,但外语也不可能学一天,想想还是再写两篇吧,以前写的ID3虽然比较简单,但是对于刚接触的人也许也不是那么简单,这次介绍Weka中默认的分类器ZeroR,用这个入门应该是比较好的选择。

       首先提一下,ZeroR很多人以为是乱猜,实际是如果类别是离散值,就返回最有可能的类别,如果是连续值,则返回类别的平均值。

       下面函数的前面两句话哪个分类器都有,就不说了。这个函数简单地让我不知道怎么讲了。m_Counts如果是离散(Nominal)的类别,就把它初始化为一个有类别数大小的一维数组,如果是类别是连续(Numeric)值,那就是一个值。

       下面while循环,这种写法是枚举数据集中的每一个样本,如果是离散值,m_Counts相应的类别下标加上这个样本的权重(这里不用太深究到底什么是权重,你可以认为所有的样本权重都是1),如果是连续值,m_Counts加上类别值乘以这个样本的权重。

       统计完每一个样本,如果是连续值,那么就用m_Counts除以总权重,其实这就是高中时学的加权平均的计算方法。如果是离散值,那就是类别出现最多(懒得去想weight的事了)的类别作为m_ClassValue

public void buildClassifier(Instances instances) throws Exception

    {

        // can classifier handle the data?

        getCapabilities().testWithFail(instances);

 

        // remove instances with missing class

        instances = new Instances(instances);

        instances.deleteWithMissingClass();

 

        double sumOfWeights = 0;

 

        m_Class = instances.classAttribute();

        m_ClassValue = 0;

        switch (instances.classAttribute().type())

        {

        case Attribute.NUMERIC:

            m_Counts = null;

            break;

        case Attribute.NOMINAL:

            m_Counts = new double[instances.numClasses()];

            for (int i = 0; i < m_Counts.length; i++)

            {

                m_Counts[i] = 1;

            }

            sumOfWeights = instances.numClasses();

            break;

        }

        Enumeration enu = instances.enumerateInstances();

        while (enu.hasMoreElements())

        {

            Instance instance = (Instance) enu.nextElement();

            if (!instance.classIsMissing())

            {

                if (instances.classAttribute().isNominal())

                {

                    m_Counts[(int) instance.classValue()] += instance.weight();

                } else

                {

                    m_ClassValue += instance.weight() * instance.classValue();

                }

                sumOfWeights += instance.weight();

            }

        }

        if (instances.classAttribute().isNumeric())

        {

            if (Utils.gr(sumOfWeights, 0))

            {

                m_ClassValue /= sumOfWeights;

            }

        } else

        {

            m_ClassValue = Utils.maxIndex(m_Counts);

            Utils.normalize(m_Counts, sumOfWeights);

        }

    }

分类一个样本,当然就是返回m_ClassValue值了(我希望这么简单的东西,你不至于还不知道是什么吧)

    public double classifyInstance(Instance instance)

    {

        return m_ClassValue;

    }

    列出这个函数是感觉return (double[]) m_Counts.clone()这种写法的确是很不错,不用那么麻烦。

public double[] distributionForInstance(Instance instance) throws Exception

    {

 

        if (m_Counts == null)

        {

            double[] result = new double[1];

            result[0] = m_ClassValue;

            return result;

        } else

        {

            return (double[]) m_Counts.clone();

        }

    }

  评论这张
 
阅读(2600)| 评论(5)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017