机器学习文本分类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
相关文章推荐
- VSM向量空间模型对文本的分类以及简单实现
- redis集群环境搭建以及java中jedis客户端集群代码实现 博客分类: redis
- 机器学习入门算法及其java实现-Apriori(文本关联性)算法
- java实现文本分类中卡方特征选择
- java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言 2 分类 2 稳定性 3 时间复杂度 4 Java实现版本 5 1、冒泡排序 6 2、选择排序
- 机器学习基本知识以及几种分类算法的Python实现(适合入门)
- 机器学习算法——KNN分类算法介绍以及Java实现
- 多项式和伯努利朴素贝叶斯文本分类模型 java实现
- 文本分类算法之--贝叶斯分类算法的实现Java版本
- 机器学习知识点(一)文本字符信息熵Java实现
- 贝叶斯文本分类 java实现
- 基于kNN的文本分类原理以及实现
- Yoon Kim的textCNN讲解,以及tensorflow实现,CNN文本分类
- 机器学习之文本分类-神经网络TensorFlow实现(一)
- redis集群环境搭建以及java中jedis客户端集群代码实现 博客分类: redis
- 我的Java开发学习之旅------>Base64的编码思想以及Java实现
- 基于机器学习的文本自动分类技术[1]
- 如何开发一个java开源框架-----Jvn框架之实现过滤静态文本跟参数转成实体类(第三讲)
- 堆排序的Java实现、性能分析以及适用场景
- Hash表分析以及Java实现