标签:
在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,採用了极大似然函数对其模型中的參数进行预计,简单来讲即对于一系列样本,Logistic回归问题属于监督型学习问题,样本中含有训练的特征
以及标签
。在Logistic回归的參数求解中。通过构造样本属于类别
和类别
的概率:
这样便能得到Logistic回归的属于不同类别的概率函数:
此时,使用极大似然预计便可以预计出模型中的參数。
可是。假设此时的标签是未知的。称为隐变量,如无监督的学习问题,典型的如K-Means聚类算法,此时不能直接通过极大似然预计预计出模型中的參数。
在上述存在隐变量的问题中,不能直接通过极大似然预计求出模型中的參数,EM算法是一种解决存在隐含变量优化问题的有效方法。
EM算法是期望极大(Expectation Maximization)算法的简称,EM算法是一种迭代型的算法。在每一次的迭代过程中。主要分为两步:即求期望(Expectation)步骤和最大化(Maximization)步骤。
设是定义在实数域上的函数,假设对于随意的实数
。都有
那么是凸函数。若
不是单个实数,而是由实数组成的向量,此时。假设函数
的Hesse矩阵
是半正定的,即
那么是凸函数。特别地。假设
或者
。那么称
为严格凸函数。
假设函数是凸函数,
是随机变量,那么
特别地,假设函数是严格凸函数,那么
当且仅当
即随机变量是常量。
(图片来自參考文章1)
注:若函数是凹函数。上述的符号相反。
设离散型随机变量的概率分布为:
当中。,假设
绝对收敛,则称
为
的数学期望,记为
,即:
若连续型随机变量的概率密度函数为
。则数学期望为:
设是随机变量
的函数。即
,若
是离散型随机变量,概率分布为:
则:
若是连续型随机变量,概率密度函数为
。则
在迭代的过程中。调整这两个概率,使得下界不断的上升,这样就能求得的极大值。
注意,当等式成立时。说明此时已经等价于。由
在确定了后,调整參数
使得
取得极大。这便是
如果有有一批数据各自是由两个正态分布:
产生,当中,和
未知,
。可是不知道详细的
是第产生,即能够使用
和
表示。
这是一个典型的涉及到隐藏变量的样例,隐藏变量为和
。
能够使用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)
标签:
原文地址:http://www.cnblogs.com/lcchuguo/p/5122027.html