理解条件概率
在理解条件概率的前提下,参考之前的文章理解条件概率
两阶段算法-训练和查询
现在来看看大名鼎鼎的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.
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随着时间不断增长的i时候,增量训练都是最好的方法。
查询
最终都是为了查询。