欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

weka: naive bayes

发布时间:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 weka: naive bayes 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

m_NumClasses               训练数据中类的个数

m_NumAttributes            属性的个数

m_Instances                   训练数据

m_ClassDistribution        类的概率分布, 即P(C)。 其类型是Estimator, 估值器

m_Distributions[m_NumAttributes][m_NumClasses]  每个属性在每个类中的概率分布。 其类型也是Estimator。

 

 

1) 数值类型要用连续分布的Estimator, 如NormalEstimator

2) 名词性类型, 如(少年人、中年人、老年人), 需要离散化, 如DiscreteEstimator

 

然后增量式的训练。

 

针对每个样本, 修改m_Distributions[m_NumAttributes][m_NumClasses], 以及 m_ClassDistribution

 

 

识别时, 通过调用函数 distributionForInstance, 该函数返回正规化的一组值, 表示该待测样本在每个类中的概率

 

public void updateClassifier(Instance instance) throws Exception {if (!instance.classIsMissing()) {Enumeration enumAtts = m_Instances.enumerateAttributes();int attIndex = 0;while (enumAtts.hasMoreElements()) {Attribute attribute = (Attribute) enumAtts.nextElement();if (!instance.isMissing(attribute)) {m_Distributions[attIndex][(int)instance.classValue()].addValue(instance.value(attribute), instance.weight());}attIndex++;}m_ClassDistribution.addValue(instance.classValue(),instance.weight());}}

 

 

 

核心是  Estimator, 如NormalEstimator

//data表示属性的值, weight表示该属性值所在样本的样本权重 public void addValue(double data, double weight) {if (weight == 0) {return;}data = round(data);m_SumOfWeights += weight;m_SumOfValues += data * weight;m_SumOfValuesSq += data * data * weight;if (m_SumOfWeights > 0) {m_Mean = m_SumOfValues / m_SumOfWeights;double stdDev = Math.sqrt(Math.abs(m_SumOfValuesSq - m_Mean * m_SumOfValues) / m_SumOfWeights);// If the stdDev ~= 0, we really have no idea of scale yet, // so stick with the default. Otherwise...if (stdDev > 1e-10) {m_StandardDev = Math.max(m_Precision / (2 * 3), // allow at most 3sd's within one interval stdDev);}}}/*** Get a probability estimate for a value** @param data the value to estimate the probability of* @return the estimated probability of the supplied value*///计算该属性的值为data的概率public double getProbability(double data) {data = round(data);double zLower = (data - m_Mean - (m_Precision / 2)) / m_StandardDev;double zUpper = (data - m_Mean + (m_Precision / 2)) / m_StandardDev;double pLower = Statistics.normalProbability(zLower);double pUpper = Statistics.normalProbability(zUpper);return pUpper - pLower;}

 

 

 

对应到bogofilter的bayes,

类个数为2; 属性个数就是token的个数

Estimator就是简单的计数

训练时,

扫描待训练邮件的逐个token,增加其在对应类别中的计数===>m_Distributions;

增加对应类别的样本数====> m_ClassDistribution

 

 

分类时,

1)得到各个类的先验概率                            P(C)

2)乘以该属性在该类中出现的概率                P(D|C), D为待测文档,D由一组token组成

P(C|D) = P(C) *P(D|C)/P(D); 其中P(D)不必求,都一样, 只需要求出P(C)*P(D|C)即可

其中, P(D|C) = P(t1|C)*,,,*P(tn|C)........条件独立。 只需要 P(ti|C) 与 P(tj|C) 独立即可。 因此是条件独立

总结

以上是生活随笔为你收集整理的weka: naive bayes的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。