高斯混合模型的底层代码
import math
import copy
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D(3D建模)
生成数据方法
将数据点X使用全局变量处理,方便后续程序调用
将均值mu设置为全局变量,进行随机初始化,方便后面计算期望
将期望excep设置为全局变量,方便后续计算
将混合系数设置为全局变量,方便后续计算
def generate_data(sigma(用一个协方差矩阵把多个方差代表出来), N, mu1, mu2, mu3, mu4, alpha):
global X # 可观测数据集
X = np.zeros(全零矩阵)((N, 2)) # 初始化X,2行N列。2维数据,N个样本
X = np.matrix(X)
global mu # 随机初始化mu1,mu2,mu3,mu4
mu = np.random.random((4, 2))
mu = np.matrix(mu)
global excep # 期望第i个样本属于第j个模型的概率的期望
excep = np.zeros((N, 4))
global alpha_ # 初始化混合项系数
alpha_ = [0.25, 0.25, 0.25, 0.25]
for i in range(N):
if np.random.random(1) < 0.1: # 生成0-1之间随机数
X[i, :] = np.random.multivariate_normal(mu1, sigma, 1) # 用第一个高斯模型生成2维数据
elif 0.1 <= np.random.random(1) < 0.3:
X[i, :] = np.random.multivariate_normal(mu2, sigma, 1) # 用第二个高斯模型生成2维数据
elif 0.3 <= np.random.random(1) < 0.6:
X[i, :] = np.random.multivariate_normal(mu3, sigma, 1) # 用第三个高斯模型生成2维数据
else:
X[i, :] = np.random.multivariate_normal(mu4, sigma, 1) # 用第四个高斯模型生成2维数据
# print("可观测数据:\n",X) #输出可观测样本
# print("初始化的mu1,mu2,mu3,mu4:",mu) #输出初始化的mu
E步:
获取全局变量,固定均值、方差及聚类数量,更新期望数值
def e_step(sigma, k, N):
global X
global mu
global excep
global alpha_
#遍历每一个样本
for i in range(N): # 聚类样本数
denom = 0
# 每一个样本进行各