가우스 혼합 모델의 특이점 문제


15

패턴 인식 및 기계 학습 책 9 장에는 가우스 혼합 모델에 대한이 부분이 있습니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 솔직히 말해서 이것이 왜 특이점을 만드는지 이해하지 못합니다. 누구든지 나에게 이것을 설명 할 수 있습니까? 죄송하지만 머신 러닝 분야의 학부생이자 초보자이므로 제 질문에 약간 어리석은 소리가 들리지만 도와주세요. 대단히 감사합니다


그것은 쉽게 고정 된 것처럼 보이며, 다시 매개 변수를 설정 한 다음 최적화 할 때 너무 가깝게 γ k 에 불이익을 줍니다. σk2=τ2γkγk
probabilityislogic

1
@probabilityislogic 내가 여기에 있는지 확실하지 않습니다 :(
Dang Manh Truong

답변:


11

최대 우도를 사용하여 가우스를 단일 데이터 포인트에 맞추려면 해당 포인트에 "붕괴"하는 매우 뾰족한 가우시안을 얻게됩니다. 다변량 가우시안 경우 단수 공분산 행렬로 이어지는 점이 하나 일 때 분산은 0입니다. 따라서이를 특이성 문제라고합니다.

분산이 0에 도달하면 가우스 성분 (수식 9.15)의 가능성이 무한대가되고 모형이 과적 합됩니다. 분산이 0이 될 수 없기 때문에 하나의 가우시안을 여러 포인트에 맞추면 발생하지 않습니다. 그러나 동일한 페이지의 PRML에 표시된대로 가우시안이 혼합되어있을 때 발생할 수 있습니다.

여기에 이미지 설명을 입력하십시오

최신 정보 :
이 책은 특이성 문제를 해결하는 두 가지 방법을 제안합니다.

1) 특이점 발생시 평균 및 분산 재설정 여기에 이미지 설명을 입력하십시오

2) 사전을 추가하여 MLE 대신 MAP 사용. 여기에 이미지 설명을 입력하십시오


단일 가우스 사례에 대해 왜 분산이 0이 될 수 없습니까? 교과서는 말합니다 : "이 문제는 단일 가우시안 분포의 경우에 발생하지 않았다는 점을 상기하십시오. 차이를 이해하기 위해, 단일 가우시안이 데이터 포인트로 붕괴되면 다른가에서 발생하는 가능성 함수에 곱셈 요소를 제공 할 것입니다. 데이터 포인트와 이러한 요소는 기하 급수적으로 빠르게 제로가되어 무한대가 아닌 제로가 될 가능성이 높아집니다. ""나는 그것을 많이 이해하지 못한다 :(
Dang Manh Truong

@DangManhTruong는 분산의 정의에 따라 이므로 모든 점이 동일한 값을 가지지 않으면 항상 0이 아닌 분산을 갖습니다. var(x)=E[(xμ)2]
dontloo

내가 참조! 고마워 : D 그래서 실제로 우리는 그것을 피하기 위해 무엇을해야합니까? 이 책은 그것에 대해 설명하지 않습니다.
Dang Manh Truong 2016 년

@DangManhTruong 안녕하세요, 답변에 추가했습니다. 살펴보십시오 :)
dontloo

@DangManhTruong 천만에요
dontloo

3

단일 가우시안 분포의 경우에는이 문제가 발생하지 않았 음을 기억하십시오. 차이를 이해하기 위해 단일 가우시안이 데이터 포인트로 축소되면 다른 데이터 포인트에서 발생하는 가능성 함수에 곱셈 요소가 영향을 미치며 이러한 요소는 기하 급수적으로 빠르게 0이되어 전반적인 가능성은 0이됩니다. 무한대보다.

나는 또한이 부분에 혼란스러워하며 여기 내 해석이 있습니다. 단순성을 위해 1D 사례를 사용하십시오.

단일 가우시안이 데이터 포인트 에서 "붕괴"할 때 ( 즉, μ = x i ) 전체 가능성은 다음과 같습니다.엑스나는μ=xi

p(x)=p(xi)p(xi)=(12πσ)(niN12πσe(xnμ)22σ2)

당신은 참조 , 왼쪽 용어 P ( X I ) , GMM의 병리학 경우와 같지만, 어떤 다른 데이터 포인트의 가능성이다 오른쪽의 기간 P ( XI ) 여전히 같은 용어가 들어 전자 - ( X N - μ를 ) 2σ0p(xi)p(xi)0σ0만큼 기하 급수적으로 빠르므로 우도에 대한 전체적인 효과는 0이됩니다.e(xnμ)22σ20σ0

여기서 중요한 점은 단일 가우시안을 피팅 할 때 하나의 구성 요소가 전체 데이터 가능성에 대한 페널티없이 하나의 데이터 포인트에 "초점을 맞출"수있는 혼합 사례와 달리 모든 데이터 포인트가 하나의 매개 변수 를 공유해야한다는 것입니다. .μ,σ


2

이 답변은 데이터 세트에 GMM을 피팅하는 동안 단일 공분산 행렬로 이어지는 일에 대한 통찰력을 제공하며, 왜 이런 일이 일어나고 있으며,이를 방지하기 위해 할 수있는 일도 있습니다.

따라서 가우스 혼합 모델을 데이터 세트에 피팅하는 동안 단계를 다시 시작하는 것이 가장 좋습니다.


0. 데이터에 적합한 소스 / 클러스터 수 (c) 결정
1. 클러스터 당 매개 변수 평균 , 공분산 Σ c 및 fraction_per_class π c 초기화 c μcΣcπc

EStep_

  1. 각 데이터 포인트에 대한 계산은 확률 (R)의 난에 C를 데이터 포인트가 X 와 클러스터 C에 속한다 : R I C = π (C) N ( X I | μ C , Σ의 C )xiricxi

    여기서N(x
    ric=πcN(xi | μc,Σc)Σk=1KπkN(xi | μk,Σk)
    은 다음과 함께 다중 변량 가우스를 나타냅니다. N ( x i , μ c , Σ c ) = 1N(x | μ,Σ)

    ric는 각 데이터 포인트xi에대한 측정 값을 제공합니다 :Probabi
    N(xi,μc,Σc) = 1(2π)n2|Σc|12exp(12(xiμc)TΣc1(xiμc))


    ricxi 경우에 따라서X나는매우 가깝게 한 가우스 C이고 그것이 높게되며,R에게난을된 c값 그렇지 않으면이 가우시안과 상대적으로 낮은 값입니다. MStep_ 각 군집에 대해 c : 총 중량 계산mcProbability that xi belongs to class cProbability of xi over all classesxiric

    MStep_

    mc(느슨하게 클러스터 C에 할당 된 포인트의 일부분을 말하고) 및 업데이트 , μ CΣ c를 이용하여 , R의 난의 C를 다음과 함께 m C = Σ I R I C π C = m CπcμcΣcric

    mc = Σiric

    μc=1
    πc = mcm

    Σc=1
    μc = 1mcΣiricxi

    이 마지막 공식에서 업데이트 된 평균을 사용해야한다는 점에 유의하십시오. 모델의 로그 우도 함수가 로그 우도를 다음과 같이 계산할 때 수렴 될 때까지 E와 M 단계를 반복적으로 반복하십시오. lnp(X|π,μ, k = 1
    Σc = 1mcΣiric(xiμc)T(xiμc)





    ln p(X | π,μ,Σ) = Σi=1N ln(Σk=1KπkN(xi | μk,Σk))



XAX=XA=I

[0000]


AXIΣc1
0다변량 가우시안이 E와 M 단계 사이의 반복 동안 한 지점으로 떨어지면 위의 공분산 행렬. 예를 들어 우리가 3 명의 가우시안에 적합하지만 실제로 2 개의 클래스 (클러스터)로 구성되어 느슨하게 말하면이 3 명의 가우시안은 자신의 클러스터를 잡는 반면 마지막 가우시안은 그것을 관리합니다. 하나의 단일 지점을 잡기 위해. 우리는 이것이 어떻게 보이는지 볼 것입니다. 그러나 단계적으로 : 두 개의 클러스터로 구성된 2 차원 데이터 세트가 있지만 그것을 알지 못하고 3 개의 가우시안 모델, 즉 c = 3을 맞추기를 원한다고 가정하십시오 .E 단계 및 플롯에서 매개 변수를 초기화하십시오. 당신의 데이터 위에 가우스가 보이는 것 같습니다. (아마 왼쪽과 오른쪽 위의 두 개의 상대적으로 흩어져있는 클러스터를 볼 수 있습니다) : enter image description hereμcπcenter image description here

riccovric
ric=πcN(xi | μc,Σc)Σk=1KπkN(xi | μk,Σk)
ricricxienter image description herexixiricxiricenter image description hereric
Σc = Σiric(xiμc)T(xiμc)
ricxi(xiμc)μcxijμjμj=xn Nric

[0000]


00매트릭스. 이것은 공분산 행렬의 digonal에 아주 작은 값 ( sklearn의 GaussianMixture 에서이 값은 1e-6으로 설정 됨)을 추가하여 수행됩니다 . 가우시안이 붕괴 될 때 알아 채고 평균 및 / 또는 공분산 행렬을 임의로 새로운 값으로 설정하는 등 특이점을 방지하는 다른 방법도 있습니다. 이 공분산 정규화는 아래 코드에서 구현되어 설명 된 결과를 얻습니다. 아마도 단일 공분산 행렬을 얻으려면 코드를 여러 번 실행해야 할 수도 있습니다. 이것은 매번 발생하지 않아야하며 가우스의 초기 설정에 따라 달라집니다.
import matplotlib.pyplot as plt
from matplotlib import style
style.use('fivethirtyeight')
from sklearn.datasets.samples_generator import make_blobs
import numpy as np
from scipy.stats import multivariate_normal


# 0. Create dataset
X,Y = make_blobs(cluster_std=2.5,random_state=20,n_samples=500,centers=3)

# Stratch dataset to get ellipsoid data
X = np.dot(X,np.random.RandomState(0).randn(2,2))


class EMM:

    def __init__(self,X,number_of_sources,iterations):
        self.iterations = iterations
        self.number_of_sources = number_of_sources
        self.X = X
        self.mu = None
        self.pi = None
        self.cov = None
        self.XY = None



    # Define a function which runs for i iterations:
    def run(self):
        self.reg_cov = 1e-6*np.identity(len(self.X[0]))
        x,y = np.meshgrid(np.sort(self.X[:,0]),np.sort(self.X[:,1]))
        self.XY = np.array([x.flatten(),y.flatten()]).T


        # 1. Set the initial mu, covariance and pi values
        self.mu = np.random.randint(min(self.X[:,0]),max(self.X[:,0]),size=(self.number_of_sources,len(self.X[0]))) # This is a nxm matrix since we assume n sources (n Gaussians) where each has m dimensions
        self.cov = np.zeros((self.number_of_sources,len(X[0]),len(X[0]))) # We need a nxmxm covariance matrix for each source since we have m features --> We create symmetric covariance matrices with ones on the digonal
        for dim in range(len(self.cov)):
            np.fill_diagonal(self.cov[dim],5)


        self.pi = np.ones(self.number_of_sources)/self.number_of_sources # Are "Fractions"
        log_likelihoods = [] # In this list we store the log likehoods per iteration and plot them in the end to check if
                             # if we have converged

        # Plot the initial state    
        fig = plt.figure(figsize=(10,10))
        ax0 = fig.add_subplot(111)
        ax0.scatter(self.X[:,0],self.X[:,1])
        for m,c in zip(self.mu,self.cov):
            c += self.reg_cov
            multi_normal = multivariate_normal(mean=m,cov=c)
            ax0.contour(np.sort(self.X[:,0]),np.sort(self.X[:,1]),multi_normal.pdf(self.XY).reshape(len(self.X),len(self.X)),colors='black',alpha=0.3)
            ax0.scatter(m[0],m[1],c='grey',zorder=10,s=100)


        mu = []
        cov = []
        R = []


        for i in range(self.iterations):               

            mu.append(self.mu)
            cov.append(self.cov)


            # E Step
            r_ic = np.zeros((len(self.X),len(self.cov)))

            for m,co,p,r in zip(self.mu,self.cov,self.pi,range(len(r_ic[0]))):
                co+=self.reg_cov
                mn = multivariate_normal(mean=m,cov=co)
                r_ic[:,r] = p*mn.pdf(self.X)/np.sum([pi_c*multivariate_normal(mean=mu_c,cov=cov_c).pdf(X) for pi_c,mu_c,cov_c in zip(self.pi,self.mu,self.cov+self.reg_cov)],axis=0)
            R.append(r_ic)

            # M Step

            # Calculate the new mean vector and new covariance matrices, based on the probable membership of the single x_i to classes c --> r_ic
            self.mu = []
            self.cov = []
            self.pi = []
            log_likelihood = []

            for c in range(len(r_ic[0])):
                m_c = np.sum(r_ic[:,c],axis=0)
                mu_c = (1/m_c)*np.sum(self.X*r_ic[:,c].reshape(len(self.X),1),axis=0)
                self.mu.append(mu_c)

                # Calculate the covariance matrix per source based on the new mean
                self.cov.append(((1/m_c)*np.dot((np.array(r_ic[:,c]).reshape(len(self.X),1)*(self.X-mu_c)).T,(self.X-mu_c)))+self.reg_cov)
                # Calculate pi_new which is the "fraction of points" respectively the fraction of the probability assigned to each source 
                self.pi.append(m_c/np.sum(r_ic)) 



            # Log likelihood
            log_likelihoods.append(np.log(np.sum([k*multivariate_normal(self.mu[i],self.cov[j]).pdf(X) for k,i,j in zip(self.pi,range(len(self.mu)),range(len(self.cov)))])))



        fig2 = plt.figure(figsize=(10,10))
        ax1 = fig2.add_subplot(111) 
        ax1.plot(range(0,self.iterations,1),log_likelihoods)
        #plt.show()
        print(mu[-1])
        print(cov[-1])
        for r in np.array(R[-1]):
            print(r)
        print(X)

    def predict(self):
        # PLot the point onto the fittet gaussians
        fig3 = plt.figure(figsize=(10,10))
        ax2 = fig3.add_subplot(111)
        ax2.scatter(self.X[:,0],self.X[:,1])
        for m,c in zip(self.mu,self.cov):
            multi_normal = multivariate_normal(mean=m,cov=c)
            ax2.contour(np.sort(self.X[:,0]),np.sort(self.X[:,1]),multi_normal.pdf(self.XY).reshape(len(self.X),len(self.X)),colors='black',alpha=0.3)




EMM = EMM(X,3,100)     
EMM.run()
EMM.predict()

0

Imho, 모든 대답은 근본적인 사실을 그리워합니다. 가우스 혼합 모델의 매개 변수 공간을 살펴보면이 공간은 혼합물에 전체 구성 요소 수가 적은 부분 ​​공간을 따라 특이합니다. 이는 미분 값이 자동으로 0이고 일반적으로 전체 부분 공간이 mle로 표시됨을 의미합니다. 보다 철학적으로, 전체 순위 공분산보다 작은 부분 공간은 모수 공간의 경계이며, 경계에서 mle이 발생할 때 항상 의심되어야합니다. '진짜'몰. Drton, Sturmfeld 및 Sullivant의 "대수 통계"라는 책이 있습니다. 이 문제에 대해서는이 책에서 자세히 설명합니다. 정말로 궁금한 점이 있다면 그것을 봐야합니다.


-2

단일 가우시안의 경우 평균은 데이터 포인트 중 하나와 같을 수 있습니다 (엑스 예) 가능성 함수에 다음과 같은 용어가 있습니다.

(엑스|엑스,σ제이11)σ제이엑스1(2π)1/2σ제이특급(1σ제이|엑스σ제이|2)=1(2π)1/2σ제이
한계 σ제이0 지수의 인수가 사라지기 때문에 이제 명확하게 분기됩니다.

그러나 데이터 포인트의 경우 엑스미디엄 평균과 다른 σ제이우리는

(엑스미디엄|엑스미디엄,σ제이11)=1(2π)1/2σ제이특급(1σ제이|엑스미디엄σ제이|2)
이제 지수의 인수가 한계에서 분기되고 음수입니다. σ제이0. 결과적으로 우도 함수에서이 두 항의 곱은 사라집니다.

평균을 식별 할 이유가 없으므로이 답변은 잘못되었습니다 μ제이 표준 편차 σ제이.
시안
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.