如何理解GMM模型及应用

1 篇文章 0 订阅
1 篇文章 0 订阅

什么是GMM?

GMM全称Gaussian Mixture  Model,是一种机器学习算法,是一种聚类模型,它是多个高斯分布函数的线性组合。

GMM解决什么问题?

通常用来解决同一集合下的数据包含多种不同分布的情况。

GMM概率分布模型的形式?

GMM的求解参数?

(mu,thera,W)为高斯混合模型需要求解的参数。K:为簇的个数,需要人为确定。

GMM求解参数的方法?

EM算法,即期望最大化算法。

EM算法的流程?

  1. 写出似然函数;
  2. 对似然函数取对数,并整理;
  3. 对似然函数求导 ,并令导数为0,求解似然方程;
  4. 解出似然函数。

GMM模型利用EM算法求解参数?【以一维数据为例,K=2】

  • GMM模型的似然函数:

  • 对似然函数取对数

  • 对似然函数求偏导?

  • 解似然函数

  • 求解W,利用带约束的Lagrange乘法,定义新目标函数:

目标函数对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()

结果图:

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值