机器学习之--EM算法及实践

原理:https://www.cnblogs.com/Gabby/p/5344658.html

高斯混合模型实践:

  主要公式应用公式(推导省略):   

    

import numpy as np
import matplotlib.pyplot as plt

dataset = np.mat([170,165,162,159,173,169,165,170,172,166,161,171]).reshape(-1,1)
labelset = np.mat([1,2,2,2,1,1,1,2,1,2,2,1]).reshape(-1,1)
print('数据dataset.T:',dataset.T)
# print(labelset,len(labelset))

#高斯函数
def gaosi(xi,u,o):
    return np.exp( np.multiply((xi - u),(xi - u)) / -( 2 * o ) ) / np.sqrt(2 * np.pi * o)

def a(x):
    return x - 100
#初始化参数u1,u2,o1,o2       o为方差的平方
u1 = 170            #男生初始平均身高
u2 = 161          #女生初始平均身高
o1 = 8
o2 = 6
print('初始参数:',u1,u2,o1,o2)
while True:
    pa1 = gaosi(dataset,u1,o1)
    pa2 = gaosi(dataset,u2,o2)
    Q1 = pa1 / (pa1 + pa2)
    Q2 = pa2 / (pa1 + pa2)
    Q1sum = np.sum(Q1)
    Q2sum = np.sum(Q2)
    # print('Q1:',Q1)
    # print(Q1.T * dataset)
    newu1 = Q1.T * dataset / Q1sum
    newu2 = Q2.T * dataset / Q2sum
    newo1 = Q1.T * np.multiply(dataset - u1,dataset - u1) / Q1sum
    newo2 = Q2.T * np.multiply(dataset - u2,dataset - u2) / Q2sum
    # print('旧u1.u2,o1,o2', u1, u2,o1,o2)
    # print('新newu1, newu2,newo1,newo2', newu1, newu2,newo1,newo2)
    if newu1 == u1 and newu2 == u2 :
        # print('相等,停止')
        break
    else:
        u1 = newu1
        u2 = newu2
        o1 = newo1
        o2 = newo2
    # print()
print('收敛参数:',u1,u2,o1,o2)

原文地址:https://www.cnblogs.com/cxhzy/p/10810267.html