您的位置:首页 > 编程语言 > Java开发

机器学习文本分类Improved Iterative Scaling算法以及JAVA实现

2014-02-12 12:46 579 查看

IIS算法数学理论

背景

IIS算法主要用来计算参数估计的maximum-likelihood。 这篇文章主要是解读Adam Berger的算法(IIS Algorithm)。首先这里采用的是概率模型。





其中



参数解释:



:表示再输入文档是x的情况下,输出label为y的概率。(在Adam的文章中这个是表示language
modeling的一个句子概率问题,但是这里用于文本分类)。y就是你的模型中会包含有多少个的label,然后去判断你输入的文档属于每个label的概率,当然概率最大的就会判断哪一个。



:这个其实就是我们用IIS算法训练出来的权重,i的范围就是1到n,n就是你的所有training
dataset 里面的feature总数。



:就是feature function了。我这里feature function的定义就是,如果在一篇文章里
word[i] 属于 document x并且 word[i] 也属于label y就为1,否则为0.

&space;\in&space;\;&space;document\;x\;\&\&\;word[i]&space;also&space;\in&space;label[y]\\&space;0,&space;&&space;otherwise&space;\end{matrix}\right.]





:是用在标准化的,使得概率在0到1之间。


:这个是表示

.

Improved Iterative Scaling算法

Maximum-likelihood

首先我们构造基于对数的log-likelihood.





这里的

表示<x,y> pair出现在dataset中的概率,一般都是

.。
然后具体的推导不在这里详细详述,推导可以看adam上的论文,我这里直接把结果给出来。因为要求最大的可能性,所以我们需要求这个公式的最大值,就是说对这个公式就导,求导的话,因为

有n个值,所以就要求n次偏导数。从而求到每一个的

.

因为这个式子优化还是比较麻烦,所以Adam文章中采用办法就是一点一点的迭代。原理就是如果我们能够找到一个

使得下面的式子成立就可以了。





而且又有



所以只需要上式右边的式子大于0即可,可以看到现在要求的变量变成了

。 然后论文最后,再继续优化上式,得到一个式子可以单独的求取

,如下:







其实就是表示在<x,y>这个pair中的所有的feature,在文本分类模型中,就是总共有多少种feature(注意不是多少个.)





因为这里可能每一个的

都会不一样,所以可能需要用牛顿迭代求解的方法去求解

。但是,其实有两篇文章(忘了什么名字了)都证明只需要取最大的

来代替就可以了,就是说我们希望计算的方便。

所以我们这里选择:



针对所有的x 和y.

最后可以得到

的表达式:





IIS算法流程

第一步,随便选择

,一般初始化每一个都是0.

第二步,不断执行一下的操作收敛为止,一般很快。

-----求解

, 用上面最后推导出来的式子

-----Set



算法的实现和模型训练测试

这里因为代码太长不可能完全放出来,所以打算讲解一部分的核心代码然后把完整代码和数据都放到出来大家下载好了。

首先是feature function的定义。

/**
* feature function
* wordInLabel[c] is a map, to denote that if this word is also in this label.
* Note: a word can belongs to many labels.
* allFeature List has contained all the words in training dataset
* @param i: denote the word[i] in document d
* @param d: doc[d], the number of this document
* @param c: the label of this document
* @return
*/
private int featureFun(int i,int d,int c){

if(doc[d].getDoc().containsKey(allFeature.get(i)) && wordInLabel[c].containsKey(allFeature.get(i)))
return 1;
else return 0;
}


doc 是我定义的一个document的结构,这个结构里面包含一个 map<word,value>容器的document, key是单词,value是这个单词在这个document中出现的次数。这个结构另外一个成员就是label. 就是这篇document的label.主要是用在训练过程中,测试过程不需要。

接下来直接上训练阶段的核心代码,就是不停迭代求解

然后更新

的过程。

[code] /**
* Train the data.
* getExponentialProb(x,y) function is used to calculate p(y|x)
* lamda[] is the final weight coefficients we can get.
* @param times: the iteration time, depends on your choice
*/
private void trainData(int times){
lambda = new double[allFeature.size()];
double[] delta = new double[allFeature.size()];
for(int t=0;t
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息