您的位置:首页 > 其它

EM算法

2016-07-07 21:37 204 查看
首先参考:

http://blog.csdn.net/zouxy09/article/details/8537620

个人理解:

个人感觉EM算法很类似于非监督式学习。

粘贴一个他人对于EM算法的理解:

楼主讲得很精彩。。。我理解的EM算法是最大似然估计方法–参数估计方法的一种 为什么要引入EM呢 我觉得 因为参数theta本身是依赖于数据的完整特征 但是只观察了部分特征X 因此需要引入隐藏特征Z 才能建立起theta与X,Z的关系。。。

怎么开始这个过程呢?我们现在自己的脑袋里假设存在一个theta(当然我们未知) 利用这个theta对数据进行了采样 由于每个数据的X特征已知 只须采样每个样本的Z特征 (这是一次实验) 利用实验观察的数据(X,Z)来修正我们对theta的理解,即使最大化似然函数的theta值作为新值;然后利用新的theta来做下一次实验 再利用新的数据修正我们对当前theta的理解 。不断重复上述过程 直到现实的观察与我们对世界的理解基本吻合 就停止实验。

至于EM算法为什么容易陷入局部最优解 要采取多次随机初始化呢?我认为 每个人对世界的认识都有限 只能根据自己的经验去判断 与外界缺乏联系 因此 只能做到自己认为的最好

本文尝试对于其男女身高的例子进行实验。

代码如下:

首先调用generate函数对于男女的身高分布进行声称,均值为mean,方差为std,个数为n

之后调用EM函数,进行times迭代,初始均值可以随机赋值,此处我手动进行赋值,分别是两个不同的初始身高高度。

结果显示,EM算法确实有效。

最后的结果显示,如果两者的原始分布交集相对较小,也就是原始数据比较容易进行区分,那么最后的结果能够比较清晰的进行二者的区分,否则误差相对较大。

样例分析:

1.均值180 170 方差2 男女各10000 随机mean1 = 170 mean2 = 190

(mean1,mean2,std1,std2):
(169.97589930156715, 180.01701518616133, 1.9629567480395163, 1.9857011750828248)
(169.97539624120708, 180.01651413192377, 1.9624112563779825, 1.9862350099220498)
(169.97539624120708, 180.01651413192377, 1.9624112563779825, 1.9862350099220498)
(169.97539624120708, 180.01651413192377, 1.9624112563779825, 1.9862350099220498)
(169.97539624120708, 180.01651413192377, 1.9624112563779825, 1.9862350099220498)
(169.97539624120708, 180.01651413192377, 1.9624112563779825, 1.9862350099220498)
(169.97539624120708, 180.01651413192377, 1.9624112563779825, 1.9862350099220498)
(169.97539624120708, 180.01651413192377, 1.9624112563779825, 1.9862350099220498)
(169.97539624120708, 180.01651413192377, 1.9624112563779825, 1.9862350099220498)
(169.97539624120708, 180.01651413192377, 1.9624112563779825, 1.9862350099220498)


2.均值180 170 方差2 男女各10000 随机mean1 = 174 mean2 = 175

(mean1,mean2,std1,std2):
(169.92893153326384, 179.93420472704722, 1.9257251014113226, 2.069114191816253)
(169.97353237597937, 179.98265023376908, 1.9712505788225929, 2.0164247796129069)
(169.97751660146625, 179.98667330645316, 1.9754871278843007, 2.0122068019745281)
(169.97751660146625, 179.98667330645316, 1.9754871278843007, 2.0122068019745281)
(169.97751660146625, 179.98667330645316, 1.9754871278843007, 2.0122068019745281)
(169.97751660146625, 179.98667330645316, 1.9754871278843007, 2.0122068019745281)
(169.97751660146625, 179.98667330645316, 1.9754871278843007, 2.0122068019745281)
(169.97751660146625, 179.98667330645316, 1.9754871278843007, 2.0122068019745281)
(169.97751660146625, 179.98667330645316, 1.9754871278843007, 2.0122068019745281)
(169.97751660146625, 179.98667330645316, 1.9754871278843007, 2.0122068019745281)


由1、2可以看出随机起始对于最后结果影响不大。

3.均值180 170 方差10 男女各10000 随机mean1 = 174 mean2 = 175

(mean1,mean2,std1,std2):
(165.57915106386295, 183.69694677993988, 6.5755582245120934, 6.7858790164944214)
(165.66022093726508, 183.77537686378852, 6.6007945826830223, 6.7617992605839961)
(165.71073487383427, 183.82452161474896, 6.6165806936918425, 6.7467890475737828)
(165.74099623325432, 183.85404693930388, 6.6260701694023441, 6.7378092797732068)
(165.76023394595703, 183.87285229693535, 6.6321140242306011, 6.7321034313665198)
(165.77121755660454, 183.88360655757407, 6.635565911765231, 6.7288425061864361)
(165.78036693382813, 183.89257157883145, 6.6384436396982665, 6.7261268616821397)
(165.78768197949117, 183.89974770002163, 6.6407437384721346, 6.7239527625089224)
(165.79316532889686, 183.90513252602062, 6.6424671378236502, 6.722320807280056)
(165.7968201065826, 183.90872311929192, 6.6436161020369315, 6.7212329801588151)


由2、3可以看出起始分布的方差,也就意味着二者的重叠度对于u 最后结果影响较大,因此二者趋向于向差异性更大的方向增长;或者说由于方差较大,因此有一部分第一类的被误分为第二类,从而使得其进一步增大。

与之相反的是方差相对减小。

import numpy as np

def generate(mean,std,n):
return np.random.normal(loc = mean,scale = std, size = n);

def EM(times,distribution,mean1,mean2):
l = len(distribution);
gen = np.zeros(l);
mean1 = np.array(mean1);
mean2 = np.array(mean2);
while times!=0:
times = times -1
d1 = np.abs(distribution - mean1)
d2 = np.abs(distribution - mean2)
diff = d1 - d2 #diff>0 means d1 > d2 which means is a man
menIndex = diff>0
women = [];
men = [];
for i in range(0,l):
if menIndex[i] == True:
men.append(distribution[i])
else:
women.append(distribution[i])
mean1 = np.mean(women);
std1 = np.std(women);
mean2 = np.mean(men);
std2 = np.std(men);
print(mean1,mean2,std1,std2);
return mean1,mean2,std1,std2

men = generate(180,2,10000);
women = generate(170,2,10000);
distribution = men.tolist()
distribution.extend(women.tolist())
mean1 = 175
mean2 = 190
times = 20
(mean1,mean2,std1,std2) = EM(times,distribution,mean1,mean2);


Reference:

[1]http://blog.csdn.net/zouxy09/article/details/8537620
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法