码迷,mamicode.com
首页 > 编程语言 > 详细

newLISP bayes算法

时间:2015-02-01 13:32:34      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:newlisp

理解条件概率

在理解条件概率的前提下,参考之前的文章理解条件概率

两阶段算法-训练和查询

现在来看看大名鼎鼎的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时候,增量训练都是最好的方法。

查询

最终都是为了查询。






newLISP bayes算法

标签:newlisp

原文地址:http://blog.csdn.net/csfreebird/article/details/43370541

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!