パターン認識コース(二)-GaussハイブリッドモデルEMアルゴリズムGMM実現python

4784 ワード

前言
  • EM及びパラメータ推定アルゴリズムの知識詳細https://www.jianshu.com/p/8b00a806d883
  • 本笔记本是笔者课程学习中所做的笔记本(绝対オリジナル)
  • 問題があったら交流区で勉強を検討することを歓迎して、QQ:76132272
  • コードワードは容易ではありません.親切な人は手当たり次第にいいねをつけます.
    GMM-EM
    観測データ状況
  • cはカテゴリ数、すなわちガウスモデルの数
  • である
    パラメータ推定ターゲット

  • は、ガウス分布の平均値と分散、および2種類の分布確率
  • の2種類を例に挙げる.
    EMアルゴリズムの主要手順
  • 初期化推定量
  • 終了条件に達するまで、次の手順を繰り返します.
  • Eステップ、計算
  • Mステップ、反復更新パラメータ、




  • インプリメンテーションコード
    '''
    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