简单易学的机器学习算法——EM算法
时间:2022-05-04
本文章向大家介绍简单易学的机器学习算法——EM算法,主要内容包括一、机器学习中的参数估计问题、二、EM算法简介、三、EM算法推导的准备、四、EM算法的求解过程、五、EM算法的收敛性保证、六、利用EM算法参数求解实例、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
一、机器学习中的参数估计问题
二、EM算法简介
在上述存在隐变量的问题中,不能直接通过极大似然估计求出模型中的参数,EM算法是一种解决存在隐含变量优化问题的有效方法。EM算法是期望极大(Expectation Maximization)算法的简称,EM算法是一种迭代型的算法,在每一次的迭代过程中,主要分为两步:即求期望(Expectation)步骤和最大化(Maximization)步骤。
三、EM算法推导的准备
注:若函数
是凹函数,上述的符号相反。
3、数学期望
四、EM算法的求解过程
五、EM算法的收敛性保证
六、利用EM算法参数求解实例
Python代码
#coding:UTF-8
'''
Created on 2015年6月7日
@author: zhaozhiyong
'''
from __future__ import division
from numpy import *
import math as mt
#首先生成一些用于测试的样本
#指定两个高斯分布的参数,这两个高斯分布的方差相同
sigma = 6
miu_1 = 40
miu_2 = 20
#随机均匀选择两个高斯分布,用于生成样本值
N = 1000
X = zeros((1, N))
for i in xrange(N):
if random.random() > 0.5:#使用的是numpy模块中的random
X[0, i] = random.randn() * sigma + miu_1
else:
X[0, i] = random.randn() * sigma + miu_2
#上述步骤已经生成样本
#对生成的样本,使用EM算法计算其均值miu
#取miu的初始值
k = 2
miu = random.random((1, k))
#miu = mat([40.0, 20.0])
Expectations = zeros((N, k))
for step in xrange(1000):#设置迭代次数
#步骤1,计算期望
for i in xrange(N):
#计算分母
denominator = 0
for j in xrange(k):
denominator = denominator + mt.exp(-1 / (2 * sigma ** 2) * (X[0, i] - miu[0, j]) ** 2)
#计算分子
for j in xrange(k):
numerator = mt.exp(-1 / (2 * sigma ** 2) * (X[0, i] - miu[0, j]) ** 2)
Expectations[i, j] = numerator / denominator
#步骤2,求期望的最大
#oldMiu = miu
oldMiu = zeros((1, k))
for j in xrange(k):
oldMiu[0, j] = miu[0, j]
numerator = 0
denominator = 0
for i in xrange(N):
numerator = numerator + Expectations[i, j] * X[0, i]
denominator = denominator + Expectations[i, j]
miu[0, j] = numerator / denominator
#判断是否满足要求
epsilon = 0.0001
if sum(abs(miu - oldMiu)) < epsilon:
break
print step
print miu
print miu
最终结果
[[ 40.49487592 19.96497512]]
参考文章:
1、(EM算法)The EM Algorithm (http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html)
2、数学期望(http://wenku.baidu.com/view/915a9c1ec5da50e2524d7f08.html?re=view)
- 面试题(一)关于内部类的面试题
- MyBatis魔法堂:各数据库的批量Update操作
- 在Win7的IIS上搭建FTP服务及用户授权
- JavaSE(四)之接口、访问控制
- 3X3 九宫格
- JS魔法堂:通过marquee标签实现信息滚动效果
- Java魔法堂:注解用法详解——@Override
- Windows下安装MongoDB
- IIS Express魔法堂:解除localhost域名的锁定
- JavaSE(三)之static、final、abstract修饰符
- 为经典版eclipse增加web and JavaEE插件
- 协议森林07 傀儡 (UDP协议)
- 【设计模式】—— 访问者模式Visitor
- JAVA EE Eclipse下配置Tomcat服务器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法