原理: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)