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

转自 Koala++'s blog 感谢原作者

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

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

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

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

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

publicvoid 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 = newdouble[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值了(我希望这么简单的东西,你不至于还不知道是什么吧)

publicdouble classifyInstance(Instance instance)

{

returnm_ClassValue;

}

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

publicdouble[] distributionForInstance(Instance instance) throws Exception

{

if (m_Counts == null)

{

double[] result = newdouble[1];

result[0] = m_ClassValue;

return result;

} else

{

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

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值