GMM全称Gaussian Mixture Model,是一种机器学习算法,是一种聚类模型,它是多个高斯分布函数的线性组合。
通常用来解决同一集合下的数据包含多种不同分布的情况。
(mu,thera,W)为高斯混合模型需要求解的参数。K:为簇的个数,需要人为确定。
EM算法,即期望最大化算法。
目标函数对W求导:
为了让求出参数更加拟合数据分布 ,需要多轮迭代 ,直到收敛。
# GMM:高斯混合模型
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
'''产生身高的数据'''
np.random.seed(100)
# 男生
sim_data_boy = np.random.normal(180,8,2000)
# 直方图,bins参数代表有多少个区间
pd.Series(sim_data_boy).hist(bins=200)
# 男生
sim_data_girl = np.random.normal(160,6,2000)
pd.Series(sim_data_girl).hist(bins=200)
plt.show()
'''混合数据'''
sim_datas = list(sim_data_girl)
sim_datas.extend(sim_data_boy)
sim_datas = np.array(sim_datas)
ax2 = pd.Series(sim_datas).hist(bins=200)
plt.show()
'''编程实现EM算法'''
# 初始化theta
W1 = 0.5
W2 = 0.5
mu1 = 170
mu2 = 150
std1 = 10
std2 = 5
# 维度
d = 1
# 样本总数
n = len(sim_datas)
'''开始迭代'''
for i in range(1000):
# E-step:产生响应R
rz1_up = W1 * stats.norm(mu1,std1).pdf(sim_datas)
rz_down = W1 * stats.norm(mu1,std1).pdf(sim_datas) + W2 * stats.norm(mu2,std2).pdf(sim_datas)
rz2_up = W2 * stats.norm(mu2,std2).pdf(sim_datas)
rz1 = rz1_up / rz_down
rz2 = rz2_up / rz_down
# M-step:
mu1 = np.sum(rz1 * sim_datas) / np.sum(rz1)
mu2 = np.sum(rz2 * sim_datas) / np.sum(rz2)
std1 = np.sqrt(np.sum(rz1 * np.square(sim_datas - mu1)) / (d * np.sum(rz1)))
std2 = np.sqrt(np.sum(rz2 * np.square(sim_datas - mu2)) / (d * np.sum(rz2)))
W1 = np.sum(rz1) / n
W2 = np.sum(rz2) / n
if i % 100 == 0:
print(mu1,mu2,std1,std2)
# 生成测试数据
data_test = range(int(min(sim_datas)),int(max(sim_datas)))
m_predict = stats.norm(mu1,std1).pdf(data_test)
f_predict = stats.norm(mu2,std2).pdf(data_test)
plt.plot(data_test,m_predict,"b")
plt.plot(data_test,f_predict,"r")
plt.show()