newLISP bayes算法使用

来源:互联网 发布:哔哩哔哩 mac 编辑:程序博客网 时间:2024/04/28 23:51

理解条件概率

要用bayes,先要理解条件概率,参考之前的文章理解条件概率

两阶段算法-训练和查询

现在来看看大名鼎鼎的bayes算法, 在数据挖掘中,bayes属于分类算法。bayes分成训练和查询两个阶段。训练指的是对样本数据集的训练,从而找出规律。newlispe提供了bayes-train函数


训练

先来看看函数原型:
syntax: (bayes-train list-M1 [list-M2 ... ] sym-context-D)
list-M1 [list-M2 ...] 是输入参数,都是一堆list,list中的元素可以是symbol或者string, 在bayes中,这些元素有一个规范的名称,叫做token. 因此list-M1 ... 这些称之为token list, 同时也表示不同的类别,所以也可以称之为traning set category.
我们在使用的时候,会事先经过一定的分析,将样本空间按照某种方法划分成几类数据集,每个数据集都用token list表示。因此,我们是带着目的来划分训练数据集,并为之提供良好的数据进行训练。另外,假定我们已经划分了3类,如果训练的时候只有一类数据,可以将另外两类数据用'() 作为参数,也是没有关系的。

bayes-train函数实际上就是统计每个token在这些输入的list中出现的次数,然后将统计结果以key/value的形式存入context中,也就是sym-context-D表示的context。

现在来看一个例子,token都是symbol, 一共有两个token list,训练结果存入context 'L中
> (bayes-train '(A A B C C) '(A B B C C C) 'L)(15 18)> (symbols L)(L:A L:B L:C L:L L:total)> 
用symbols函数显示了结果L中有若干个symbol, 其中total是总计,现在逐一显示它们的值。
> L:A(2 1)> L:B(1 2)> L:C(2 3)> L:total(5 6)

可以看到token A的次数在两个token list中分别是是2和1次,B和C次数分别是(1 2)和(2 3)次,总数是(5 6)
key是token value是在不同token list中的频次。


token也可以是string,不过注意,在结果context中,key是用_开头的,比如:
(bayes-train '("one" "two" "two" "three")             '("three" "one" "three")              '("one" "two" "three") 'S)   

在S中,key是_one, _two和_three。

这些token list,逻辑上表示的是token的排列顺序。token list可以包含百万的token,比如用于自然语言训练。


增量训练

值得注意的是,训练是可以不断进行的,如果再调用一次,你会发现token的频次是在递增的。比如:
> (bayes-train '(A A B C C) '(A B B C C C) 'L)(10 12)> L:A(4 2)> L:total(10 12)
这是个好消息,我们每次可以将L的结果保存在数据库中,以后有新的训练样本过来,可以继续训练,而不是从头开始。i而且,如果的确已经通过其他手段获得了token的频次,我们可以跳过一次训练,直接将结果保存在context中,帮助后续的训练。
新的token也可以加入进来,bayes-train函数能够正确的更新结果。
当训练集非常大的时候,或者训练数据随着时间不断增长的i时候,增量训练都是最好的方法。

查询

最终都是为了查询。bayes-query函数的原型如下:
syntax: (bayes-query list-L context-D [bool-chain [bool-probs]])

list-l 是一个token list,如同训练用的若干token list一样,context-D 是训练得到的上下文,包含了训练结果。后面两个参数不在此处讨论。
下面是一个很好理解的例子,三个traning set里面分别对应了三种类别的数据:颜色,人和编程语言,然后用一个包含了编程语言和人的token list来查询,
发现属于颜色分类的概率为0,属于编程语言和人的概率个有50%.

(bayes-train '("red" "blue" "yellow") '("girl" "boy" "uncle" "female") '("c++" "java" "newlisp") 'L)(3 4 3)> (bayes-query '("c++" "girl") L)(0 0.5 0.5)

这个例子很好理解,但是要注意,实际上训练的时候token应该会出现在多个token list(training set category)中,不大可能像这个例子一样仅在一个training set category中。
我们这里默认使用的是inverse Chi² 算法,需要保证不同的training set's categories要有相同的token出现:

If the inverse Chi² method is used, the total number of tokens in the different training set's categories should be equal or similar. 



bayes查询使用如下条件概率公式为计算基础
假定有两个training set category
p(A|tkn) = p(tkn|A) * p(A) / ( p(tkn|A) * p(A) + p(tkn|B) * p(B) )

说明:
1. p(A|tkn) 是计算training set category A 在某个token出现时的条件概率
2. ( p(tkn|A) * p(A) 指的是 token和A同时出现的概率。

假定有N个training set category
p(Mc|tkn) = p(tkn|Mc) * p(Mc) / sum-i-N( p(tkn|Mi) * p(Mi) )









0 0
原创粉丝点击