机器学习入门算法及其java实现-EM(Expectation Maxium)算法
来源:互联网 发布:社区控烟网络会议记录 编辑:程序博客网 时间:2024/06/05 01:52
1、算法基本原理:
- EM算法一般用于存在隐变量或潜在变量的概率模型,可以算是一种含有隐的概率模型参数的极大似然估计法;
- 假设
θ 为模型的参数, 为模型的观测数据,γ 模型中存在的隐藏变量,EM算法的是通过最大化观测数据logP(Y|θ) 的方法来求出θ 的极大似然估计,可以转化为表达式:θ^=argmaxθ(logP(Y|θ)) - 经过转化,可以将问题转化为最大化
E(γ) 的问题,即θ^=argmaxγ(E(γ)) 。
2、算法推导过程:
- 根据极大似然法的原理,我们的目标是极大化观测数据
Y 关于参数θ 的对数似然函数,即:L(θ)=logP(Y|θ)=log∑γP(Y,γ|θ) =log(∑λP(Y|γ,θ)P(Z|θ)) - 因为EM算法是通过迭代的办法逐步接近极大
L(θ) 的,假设在第i 次迭代后θi ,此我们希望能够使L(θ)−L(θ(i))≥0 L(θ)−L(θi)=log(∑γP(Y|γ,θ)P(γ|θ))−log(P(Y|θi) =log(∑γP(γ|Y,θi)P(Y|γ,θ)P(γ|θ)P(γ|Y,θi))−logP(Y|θi) ≥∑γP(γ|Y,θi)log(P(Y|γ,θ)P(γ|θ)P(γ|Y,θi))−logP(Y|θi) 令=∑γP(γ|Y,θi)log(P(Y|γ,θ)P(γ|θ)P(γ|Y,θi)logP(Y|θi)) 则B(θ,θi)=L(θi)+∑γP(γ|Y,θi)log(P(Y|γ,θ)P(γ|θ)P(γ|Y,θi)logP(Y|θi)) 即函数L(θ)≥B(θ,θi) B(θ,θi) 是L(θ) 的一个下界,并且易知:L(θi)≥B(θi,θi) ,因此可以使B(θ,θi) 增大的θ 也可以使L(θ) 增大,为了使L(θ) 有尽可能大的增大,选择θi+1 使B(θ,θi) 打到极大,即:上式可以改写为:θ(i+1)=argmaxθB(θ,θi) θ(i+1)=argmaxθ(L(θi)+∑γP(γ|Y,θi)log(P(Y|γ,θ)P(γ|θ)P(γ|Y,θi)logP(Y|θi))) =argmaxθ∑γP(γ|Y),θilog(P(Y|γ,θ)P(γ|θ)) =argmaxθ∑γP(γ|Y,θi)log(P(Y,γ|θ)) 3、EM算法收敛性证明:=argmaxθQ(θ,θi) 根据对数函数函数性质:若 P(Y|θi) 单调递增且收敛到某一值则Q(θ,θi) 收敛。单调性:P(Y|θ)=P(Y,γ|θ)P(γ|Y,θ) logP(Y|θ)=logP(Y,γ|θ)−logP(γ|Y,θ) 令Q(θ,θi)=∑γlogP(Y,γ|θ)P(γ|Y,θi) 于是对数似然函数可以写成:H(θ,θi)=∑γlogP(γ|Y,θ)P(γ|Y,θi) 上式中logP(Y|θ)=Q(θ,θi)−H(θ,θi) θ 分别取为θi 和θi+1 并相减,有:logP(Y|θi+1)−logP(Y|θi) 因为=[Q(θi+1,θi)−Q(θi,θi)]−[H(θi+1,θi)−H(θi,θi)] θi+1 使Q(\theta,\theta^{i})达到极大,所以有:其第2项,可以推导得出:Q(θi+1,θi)−Q(θi,θi)≥0 H(θi+1,θi)−H(θi,θi) =∑γ(logp(γ|Y,θi+1)P(γ|Y,θi))P(γ|Y,θi) ≤log(∑γP(γ|Y,θi+1)P(γ|Y,θi)P(γ|Y,θi)) 又因为=log(P(γ|Y,θi+1))=0 P(Y|θi) 有界,所以L(θi)=log(P(Y|θi)) 收敛到某一值L∗ 。
4、算法步骤:
- 选择参数的初值
θ0 ,开始迭代; - E步:记
θi 为第i 次迭代参数θ 的估计值,在第i 次迭代的E步,计算:Q(θ,θi)=Eγ[logP(Y,γ|θ)|Y,θ] =∑γlog(P(Y,γ|θ)P(γ|Y,θi)) - M步:求使
Q(θ,θi) 极大化的θ ,确定第i+1 次迭代的参数的估计值θi+1 θi+1=argmaxθQ(θ,θi)
-重复第E步和第M步,直到对于较小的正数ξ1 ,ξ2 ,若满足 :或||θi+1−θi||≤ξq 则停止迭代。||Q(θi+1,θi)−Q(θi,θi)||≤ξ2
package binorandom;public class binomain { public static void main(String[] args) { int[] b=new int[1000]; for (int i=0;i<1000;i++){ b[i]=binorandom.getBinomial(1, 0.4); } int[] a=new int[1000]; for ( int i=0;i<999;i++){ if (b[i]==1){ a[i]=binorandom.getBinomial(1,0.5); } if(b[i]==0){ a[i]=binorandom.getBinomial(1,0.6); } System.out.print(a[i]+" "); } System.out.print(a[999]); }}package binorandom;public class binorandom { public static int getBinomial(int n, double p) { int x = 0; for(int i = 0; i < n; i++) { if(Math.random() < p) x++; } return x; }}//生成数据集合package EMpackage;import java.util.Scanner;public class EMmain { public static void main(String[] args){ System.out.println("请输入观测值个数"); Scanner input=new Scanner(System.in); int datanumber=input.nextInt(); System.out.println("请输入观测值(0或者1):"); Scanner input1=new Scanner(System.in); int[] obdata=new int[datanumber]; for(int i=0; i<datanumber;i++){ obdata[i]=input1.nextInt(); } System.out.println("您输入的是:"+" "); for (int b=0;b<datanumber-1;b++){ System.out.print(obdata[b]+" "); } System.out.println(obdata[datanumber-1]); double[] original=new double[3]; original=ori.original(); double eq=ori.eq(); System.out.println("初始条件为:"+" "+original[0]+" "+original[1]+" "+original[2]); System.out.println("停止条件为:"+" "+eq); input1.close(); input.close(); double[] original1=new double[3]; original1=EM.original1(original, obdata, datanumber); int x=0; while (euclid(minus(original1,original))>eq){ original=original1; original1=EM.original1(original,obdata,datanumber); x=x+1; } System.out.println("pi="+original1[0]+"\n"+"p="+original1[1]+"\n"+"q="+original1[2]+"\n"+x); }private static double euclid(double[] x) { double sum=0; for (int i=0;i<3;i++){ sum=sum+Math.pow(x[i], 2); } double euclid=Math.sqrt(sum); return euclid;}private static double[] minus(double[] x,double[] y) { double[] temp=new double[3]; for (int i=0;i<3;i++){ temp[i]=x[i]-y[i]; } return temp; }}package EMpackage;public class EM { public static double[] original1(double[] original,int[] obdata,int datanumber){ double[] ybl=new double[datanumber]; double[] uybl=new double[datanumber]; double[] l=new double[datanumber]; double datanumber1=datanumber; for (int i=0;i<datanumber;i++){ ybl[i]=(original[0]*Math.pow(original[1],obdata[i] )*Math.pow(1-original[1],1-obdata[i] ))/(original[0]*Math.pow(original[1],obdata[i])*Math.pow((1-original[1]),(1-obdata[i]))+(1-original[0])*Math.pow(original[2],obdata[i])*Math.pow((1-original[2]),(1-obdata[i]))); uybl[i]=obdata[i]*(original[0]*Math.pow(original[1],obdata[i] )*Math.pow(1-original[1],1-obdata[i] ))/(original[0]*Math.pow(original[1],obdata[i])*Math.pow((1-original[1]),(1-obdata[i]))+(1-original[0])*Math.pow(original[2],obdata[i])*Math.pow((1-original[2]),(1-obdata[i]))); l[i]=1; } double[] original1=new double[3]; original1[0]=(1/datanumber1)*sum(ybl,datanumber); original1[1]=(sum(uybl,datanumber)/sum(ybl,datanumber)); original1[2]=(sum(ybl,datanumber)-sum(uybl,datanumber))/(sum(l,datanumber)-sum(ybl,datanumber)); return original1; } private static double sum(double[] ybl,int datanumber) { double sum=0; for (int i=0;i<datanumber;i++){ sum=sum+ybl[i]; } return sum; }}package EMpackage;import java.util.Scanner;public class ori{ public static double[] original(){ System.out.println("请输入初始条件条件:"+" "); Scanner input=new Scanner(System.in); double original[]=new double[3]; for(int d=0; d<3;d++){ original[d]=input.nextDouble(); } return original; } public static double eq(){ System.out.println("请输入停止条件:"+" "); Scanner input=new Scanner(System.in); double eq=input.nextDouble(); return eq; } }//EM算法主程序
实验结果及实例分析
多次运算结果对比:
原始系数pi,p,q(0.4、0.5、0.6):
原始系数pi,p,q(0.5、0.5、0.5):
阅读全文
0 0
- 机器学习入门算法及其java实现-EM(Expectation Maxium)算法
- 机器学习小组知识点20:EM算法(Expectation - Maximization)
- EM(expection maxium)算法
- 机器学习入门算法及其java实现-KNN算法
- 机器学习入门算法及其java实现-ID3(决策树)算法
- 机器学习入门算法及其java实现-adaboost算法
- 【机器学习】EM算法入门
- 机器学习入门算法及其java实现-朴素贝叶斯
- Expectation Maximation(EM)算法
- EM算法:Expectation-Maximization
- EM(Expectation-Maximization)算法
- EM算法(Expectation Maximization)
- EM算法(Expectation Maximization)
- Expectation-Maximization(EM) 算法
- EM算法(Expectation Maximization)
- EM算法-expectation-maximization
- EM算法--expectation maximization
- EM算法(Expectation
- leetcode 69
- 第一篇文章献给艰难的Ubuntu16.04安装caffe之旅 cuda tensorflow Theano
- 快速理解数字签名(digital signature)和证书中心(certificate authority)
- UCOS-II任务间通信:邮箱
- 以太坊学习之常用命令
- 机器学习入门算法及其java实现-EM(Expectation Maxium)算法
- 电解电容的ESR,想说三句话
- Ubuntu16.04使用Qt Creator编译时报错“找不到 -lGL”之解决办法
- SSO CAS单点登陆
- 二叉排序
- Oracle 系统权限详细列表
- redis分布式锁
- ReactiveCocoa 讲解
- 推荐系统评测指标