パターン認識コース(二)-GaussハイブリッドモデルEMアルゴリズムGMM実現python
4784 ワード
前言 EM及びパラメータ推定アルゴリズムの知識詳細https://www.jianshu.com/p/8b00a806d883 本笔记本是笔者课程学习中所做的笔记本(绝対オリジナル) 問題があったら交流区で勉強を検討することを歓迎して、QQ:76132272 コードワードは容易ではありません.親切な人は手当たり次第にいいねをつけます.
GMM-EM
観測データ状況 cはカテゴリ数、すなわちガウスモデルの数 である
パラメータ推定ターゲット
は、ガウス分布の平均値と分散、および2種類の分布確率 の2種類を例に挙げる.
EMアルゴリズムの主要手順初期化推定量 終了条件に達するまで、次の手順を繰り返します. Eステップ、計算 Mステップ、反復更新パラメータ、
インプリメンテーションコード
参考資料
https://github.com/wrayzheng/gmm-em-clustering/blob/master/gmm.py https://blog.csdn.net/chasdmeng/article/details/38709063
GMM-EM
観測データ状況
パラメータ推定ターゲット
EMアルゴリズムの主要手順
インプリメンテーションコード
'''
Author: Arthur_Pang
Time: 2019/10/19 18:47
Description: Pattern Recognition Course 2th assignment - Gaussian mixture model Expectation Maximum
'''
'''
'''
from sklearn.datasets.samples_generator import make_blobs
import logging
import numpy as np
from scipy.stats import multivariate_normal
from matplotlib import pyplot
logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger()
class MyGMM(object):
def __init__(self,s,c,t):
self.data=None
self.label=None
self.sample_num=s #
self.clusters=c #
self.features_num=2 #
self.iter_num=t #
self.mu=None
self.conv=None
self.pc=None
pass
def update(self):
pass
'''
func: sklearn make_blobs
'''
def make_gauss_probs(self):
logger.info(' {} {} '.format(self.sample_num,self.clusters))
self.data,self.label=make_blobs(n_samples=self.sample_num,n_features=self.features_num,centers=self.clusters)
pyplot.scatter(self.data[:,0],self.data[:,1],c=self.label);
pyplot.title('samples distribution')
pyplot.show()
#print(data,target)
pass
'''
func:EM ,
2 6 :\mu_1 \mu_2 \sigma_1 \sigma_2 P_c_1 P_c_2
: mu conv pc
'''
def init_params(self):
N=self.sample_num
D=self.clusters
K=self.features_num
mu = np.random.rand(K, D)
conv = np.array([np.eye(D)] * K)
pc = np.array([1.0 / K] * K)
logger.info("Parameters initialized.")
print(' ',"mu:", mu, "conv:", conv, "pc:", pc,sep='
')
self.mu=mu
self.conv=conv
self.pc=pc
'''
func:
f(X|\theta)
'''
def phi(self,Y, mu_k, cov_k):
norm = multivariate_normal(mean=mu_k, cov=cov_k)
return norm.pdf(Y)
'''
func:EM E ,
return: T
'''
def get_Expectation(self):
#
gamma = np.mat(np.zeros((self.sample_num, self.features_num)))
#
prob = np.zeros((self.sample_num, self.features_num))
#
for k in range(self.clusters):
prob[:, k] = self.phi(self.data, self.mu[k], self.conv[k])
prob = np.mat(prob)
#
for k in range(self.clusters):
gamma[:, k] = self.pc[k] * prob[:, k]
#
for i in range(self.sample_num):
gamma[i, :] /= np.sum(gamma[i, :])
return gamma
'''
func: EM M
'''
def maximize(self,gamma):
#
cov = []
#
for k in range(self.clusters):
# k
Nk = np.sum(gamma[:, k])
# mu
#
self.mu[k, :] = np.sum(np.multiply(self.data, gamma[:, k]), axis=0) / Nk
# conv
cov_k = ( self.data - self.mu[k]).T * np.multiply((self.data - self.mu[k]), gamma[:, k]) / Nk
cov.append(cov_k)
# pc
self.pc[k] = Nk / self.sample_num
self.conv = np.array(cov)
'''
func: EM
'''
def EM(self):
self.make_gauss_probs()
self.init_params()
logger.info('begin iterations')
for i in range(self.iter_num):
gamma=self.get_Expectation()
self.maximize(gamma)
logger.info(' we get the params ')
print("mu:", self.mu, "conv:", self.conv, "pc:", self.pc,sep='
')
gmm=MyGMM(100,2,100)
gmm.EM()
参考資料
https://github.com/wrayzheng/gmm-em-clustering/blob/master/gmm.py https://blog.csdn.net/chasdmeng/article/details/38709063