가우스 혼합 모델 (GMM) 의 실현 과 시각 화

高斯混合模型(GMM)实现和可视化_第1张图片
  • 고 스 분포 공식 및 이미지 예시
  • 고 스 분포 확률 밀도 열력 도
  • 고 스 혼합 모델 실현 코드
  • 고 스 혼합 모델 클 러 스 터 효과 도
  • 참고 문헌

  • 저자: 김 량[email protected]) csdn 블 로그:http://blog.csdn.net/u012176591
    정리 할 코드 파일 과 데 이 터 를 이동 하 십시오.http://download.csdn.net/detail/u012176591/8748673
    1. 가우스 분포 공식 및 이미지 예제
    D - 차원 연속 공간의 고 스 분포 확률 밀 도 를 정의 하 는 표현 식 N (x |μ,Σ)=1(2π)D/21|Σ|1/2exp{−12(x−μ)TΣ−1(x−μ)}
    그 등고선 이 형성 하 는 형상 과 협 방 차 행렬Σ 밀접 한 관 계 를 가진다. 다음 과 같이 뒤의 코드 에는 각 이미지 에 대응 하 는 고 스 분포 의 매개 변수 가 있다.
    高斯混合模型(GMM)实现和可视化_第2张图片
    2. 가우스 분포 확률 밀도 열력 도
    코드 는 다음 과 같 습 니 다:
    fig,axes = plt.subplots(nrows=3,ncols=1,figsize=(4,12))
    
    #     
    mean = [0,0]
    cov = [[1,0],
           [0,1]] 
    x,y = np.random.multivariate_normal(mean,cov,5000).T
    axes[0].plot(x,y,'x')
    axes[0].set_xlim(-6,6) 
    axes[0].set_ylim(-6,6) 
    
    #   ,          
    mean = [0,0]
    cov = [[0.5,0],
           [0,3]] 
    x,y = np.random.multivariate_normal(mean,cov,5000).T
    axes[1].plot(x,y,'x')
    axes[1].set_xlim(-6,6) 
    axes[1].set_ylim(-6,6) 
    
    #   ,               
    mean = [0,0]
    cov = [[1,2.3],
           [2.3,1.4]] 
    x,y = np.random.multivariate_normal(mean,cov,5000).T
    axes[2].plot(x,y,'x'); plt.axis('equal')
    axes[2].set_xlim(-6,6) 
    axes[2].set_ylim(-6,6) 

    우 리 는 아래 의 고 스 혼합 모델 에서 세 번 째 협 방 차 행렬, 즉 확률 밀도 의 등고선 은 타원 이 고 축방향 은 반드시 좌표 축 과 평행 하지 않다.
    다음 그림 은 고 스 밀도 함수 의 열 그림 입 니 다.
    高斯混合模型(GMM)实现和可视化_第3张图片
    다음은 작도 코드 입 니 다.
    #                 
    def gaussian(x,mean,cov):    
        dim = np.shape(cov)[0] #  
        covdet = np.linalg.det(cov+np.eye(dim)*0.01) #       
        covinv = np.linalg.inv(cov+np.eye(dim)*0.01) #       
        xdiff = x - mean
        #    
        prob = 1.0/np.power(2*np.pi,1.0*2/2)/np.sqrt(np.abs(covdet))*np.exp(-1.0/2*np.dot(np.dot(xdiff,covinv),xdiff))
    
        return prob
    
    
    #               
    mean = [0,0]
    cov = [[1,2.3],
           [2.3,1.4]] 
    x,y = np.random.multivariate_normal(mean,cov,5000).T
    cov = np.cov(x,y) #               ,         
    n=200
    x = np.linspace(-6,6,n)
    y = np.linspace(-6,6,n)
    xx,yy = np.meshgrid(x, y)
    zz = np.zeros((n,n))
    for i in range(n):
        for j in range(n):
            zz[i][j] = gaussian(np.array([xx[i][j],yy[i][j]]),mean,cov)
    
    gci = plt.imshow(zz,origin='lower') #   origin='lower'   tuixan    
    plt.xticks([5,100,195],[-5,0,5])
    plt.yticks([5,100,195],[-5,0,5])
    plt.title(u'        ',{'fontname':'STFangsong','fontsize':18})

    3. 가우스 혼합 모델 실현 코드:
    다음은 몇 가지 기능 함수 로 주 함수 에서 호출 되 었 습 니 다.
    #       ,
    #     array  ,       
    def gaussian(x,mean,cov):
    
        dim = np.shape(cov)[0] #  
        #                  0   
        covdet = np.linalg.det(cov+np.eye(dim)*0.01) #         
        covinv = np.linalg.inv(cov+np.eye(dim)*0.01) #       
        xdiff = x - mean
        #    
        prob = 1.0/np.power(2*np.pi,1.0*dim/2)/np.sqrt(np.abs(covdet))*np.exp(-1.0/2*np.dot(np.dot(xdiff,covinv),xdiff))
        return prob
    
    
    #         
    def getconvs(data,K):
        convs = [0]*K
        for i in range(K):
            #                      ,              
            convs[i] = np.cov(data.T)  
        return convs
    
    
    def isdistinct(means,criter=0.03): #             
        K = len(means)
        for i in range(K):
            for j in range(i+1,K):
                if criter > np.linalg.norm(means[i]-means[j]):
                    return 0       
        return True
    #        
    def getmeans(data,K,criter):
        means = [0]*K
        dim  = np.shape(data)[1]
        minmax = [] #          
        for i in range(dim):
            minmax.append(np.array([min(data[:,i]),max(data[:,i])]))
    
        while True:
            #        
            for i in range(K):
                means[i] = []
                for j in range(dim):
                    means[i].append(np.random.random()*(minmax[j][1]-minmax[j][0])+minmax[j][0])  
                means[i] = np.array(means[i])
    
            if isdistinct(means,criter):
                break  
        return means
    
    # k-means       。
    # K-means         ,           
    def kmeans(data,K):
        N = np.shape(data)[0]#    
        dim = np.shape(data)[1] #  
    
        means = getmeans(data,K,criter=15)
        means_old = [np.zeros(dim) for k in range(K)]
    
    
        while np.sum([np.linalg.norm(means_old[k]-means[k]) for k in range(K)]) > 0.01:
    
            means_old = cp.deepcopy(means)
    
            numlog = [0]*K
            sumlog = [np.zeros(dim) for k in range(K)]
            for n in range(N):
                distlog = [np.linalg.norm(data[n]-means[k]) for k in range(K)]
                toK = distlog.index(np.min(distlog))
    
                numlog[toK] += 1
                sumlog[toK] += data[n]
    
            for k in range(K):
                means[k] = 1.0/numlog[k]*sumlog[k]
        return means
    
    #          ,     K   2,         
    def visualresult(data,gammas,K):
        N = np.shape(data)[0]#    
        dim = np.shape(data)[1] #  
    
        minmax = [] #          
        xy = []
        n=200
        for i in range(dim):
            delta = 0.05*(np.max(data[:,i])-np.min(data[:,i]))
            xy.append(np.linspace(np.min(data[:,i])-delta,np.max(data[:,i])+delta,n))
        xx,yy = np.meshgrid(xy[0], xy[1])
        zz = np.zeros((n,n))
        for i in range(n):
            for j in range(n):
                zz[i][j] = np.sum(gaussian(np.array([xx[i][j],yy[i][j]]),means[k],convs[k]) for k in range(K))
        gci = plt.imshow(zz,origin='lower',alpha = 0.8) #   origin='lower'   tuixan    
        plt.xticks([0,len(xy[0])-1],[xy[0][0],xy[0][-1]])
        plt.yticks([0,len(xy[1])-1],[xy[1][0],xy[1][-1]])
    
        for i in range(N):
            if gammas[i][0] >0.5:
                plt.plot((data[i][0]-np.min(data[:,0]))/(xy[0][1]-xy[0][0]),(data[i][1]-np.min(data[:,1]))/(xy[1][1]-xy[1][0]),'r.')
            else:
                plt.plot((data[i][0]-np.min(data[:,0]))/(xy[0][1]-xy[0][0]),(data[i][1]-np.min(data[:,1]))/(xy[1][1]-xy[1][0]),'k.')
    
        deltax = xy[0][1]-xy[0][0]
        deltay = xy[1][1]-xy[1][0]
    
        plt.plot((means[0][0]-xy[0][0])/deltax,(means[0][1]-xy[1][0])/deltay,'*r',markersize=15)
        plt.plot((means[1][0]-xy[0][0])/deltax,(means[1][1]-xy[1][0])/deltay,'*k',markersize=15)
    
        plt.title(u'       ',{'fontname':'STFangsong','fontsize':18})

    가우스 혼합 모델 의 주 함수
    N = np.shape(data)[0]#    
    dim = np.shape(data)[1] #  
    K = 2 #      
    
    means = kmeans(data,K)
    
    convs = getconvs(data,K)
    
    pis = [1.0/K]*K
    gammas = [np.zeros(K) for i in range(N)] #*N       *N,  N array       
    
    loglikelyhood = 0
    oldloglikelyhood = 1
    
    while np.abs(loglikelyhood - oldloglikelyhood)> 0.0001:
        oldloglikelyhood = loglikelyhood
    
    
        # E_step
        for n in range(N):
            respons = [pis[k]*gaussian(data[n],means[k],convs[k]) for k in range(K)]
    
            sumrespons = np.sum(respons)
            for k in range(K):
                gammas[n][k] = respons[k]/sumrespons
    
        # M_step
        for k in range(K):
            nk = np.sum([gammas[n][k] for n in range(N)])
            means[k] = 1.0/nk * np.sum([gammas[n][k]*data[n] for n in range(N)],axis=0)
    
            xdiffs = data - means[k]
            convs[k] = 1.0/nk * np.sum([gammas[n][k]*xdiffs[n].reshape(dim,1)*xdiffs[n] for n in range(N)],axis=0)
            pis[k] = 1.0*nk/N
    
        #        
        loglikelyhood =np.sum( [np.log(np.sum([pis[k]*gaussian(data[n],means[k],convs[k]) for k in range(K)])) for n in range(N) ])
        #print means
        #print loglikelyhood
        #print '=='*10
    
    visualresult(data,gammas,K)

    4. 가우스 혼합 모델 클 러 스 터 효과 도
    高斯混合模型(GMM)实现和可视化_第4张图片
    5. 참고 문헌:
  • K - means 집합 과 EM 사상http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006910.html
  • (EM 알고리즘) EM 알고리즘http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html
  • 의사 결정 트 리 에서 베 이 루스 분류 알고리즘, EM, HMM 에 대해 배 웠 다.http://blog.csdn.net/v_july_v/article/details/7577684
  • EM 알고리즘 학습 (기대 극 대화 알고리즘)http://www.vjianke.com/XUHV3.clip
  • EM 알고리즘 - 이론 과 응용http://blog.sina.com.cn/s/blog_a8fead9b01014p6k.html
  • EM 알고리즘 의 간단 한 예http://blog.sina.com.cn/s/blog_a7da5cda010158b3.html
  • 고 스 혼합 모델 (GMM)http://www.cnblogs.com/mindpuzzle/archive/2013/04/24/3036447.html
  • 고 스 혼합 모델http://www.cnblogs.com/zhangchaoyang/articles/2624882.html
  • CS 229 강의 노트, Andrew Ng 강의http://cs229.stanford.edu/notes/cs229-notes7b.pdf
  • https://github.com/lzhang10/maxent/blob/master/doc/manual.pdf
  • http://nlp.stanford.edu/software/classifier.shtml
  • https://github.com/juandavm/em4gmm 최대 기대 알고리즘 으로 고 스 혼합 모델 을 풀 고 dat 폴 더 의 압축 파일 은 데이터
  • 입 니 다.
  • http://insideourminds.net/python-unsupervised-learning-using-em-algorithm-implementation/ Python 이 실현 하 는 기대 최대 화 알고리즘, 데 이 터 는 아이 리 스 데이터
  • 좋은 웹페이지 즐겨찾기