Các vấn đề đơn lẻ trong mô hình hỗn hợp Gaussian


15

Trong chương 9 của cuốn sách Nhận dạng mẫu và học máy, có phần này về mô hình hỗn hợp Gaussian:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây Thành thật mà nói tôi không thực sự hiểu tại sao điều này sẽ tạo ra một điểm kỳ dị. bất cứ ai có thể giải thích điều này với tôi? Tôi xin lỗi nhưng tôi chỉ là một sinh viên và một người mới học máy, vì vậy câu hỏi của tôi nghe có vẻ hơi ngớ ngẩn, nhưng xin hãy giúp tôi. Cảm ơn rât nhiều


Trông giống như nó dễ dàng cố định quá, reparameterize để σk2=τ2γk và sau đó phạt γk cho quá gần bằng không khi tối ưu hóa.
xác suất

1
@probabilityislogic Không chắc chắn nếu tôi theo dõi ở đây :(
Đặng Mạnh Trường

Câu trả lời:


11

Nếu chúng ta muốn điều chỉnh Gaussian cho một điểm dữ liệu duy nhất bằng khả năng tối đa, chúng ta sẽ nhận được một Gaussian rất nhọn "sụp đổ" đến điểm đó. Phương sai bằng 0 khi chỉ có một điểm, trong trường hợp Gaussian đa biến, dẫn đến ma trận hiệp phương sai số ít, do đó, nó được gọi là bài toán số ít.

Khi phương sai về 0, khả năng thành phần Gaussian (công thức 9.15) trở nên vô cùng và mô hình trở nên quá mức. Điều này không xảy ra khi chúng ta chỉ khớp một Gaussian với một số điểm vì phương sai không thể bằng 0. Nhưng nó có thể xảy ra khi chúng ta có một hỗn hợp Gaussian, như được minh họa trên cùng một trang PRML.

nhập mô tả hình ảnh ở đây

Cập nhật :
Cuốn sách gợi ý hai phương pháp để giải quyết vấn đề đơn lẻ, đó là

1) đặt lại giá trị trung bình và phương sai khi số ít xảy ra nhập mô tả hình ảnh ở đây

2) sử dụng MAP thay vì MLE bằng cách thêm trước. nhập mô tả hình ảnh ở đây


Về trường hợp Gaussian đơn, tại sao phương sai không thể bằng 0? Sách giáo khoa nói: "Hãy nhớ lại rằng vấn đề này không phát sinh trong trường hợp phân phối Gaussian duy nhất. Để hiểu sự khác biệt, lưu ý rằng nếu một Gaussian đơn lẻ sụp đổ vào một điểm dữ liệu, nó sẽ đóng góp các yếu tố nhân cho hàm khả năng phát sinh từ hàm kia điểm dữ liệu và các yếu tố này sẽ về 0 nhanh theo cấp số nhân, mang lại khả năng tổng thể về 0 chứ không phải vô cùng. "nhưng tôi không hiểu điều đó lắm :(
Dang Manh Truong

@DangManhTruong rằng vì theo định nghĩa của phương sai, , trừ khi tất cả các điểm là các giá trị như nhau, chúng tôi luôn luôn có một sai khác không. var(x)=E[(xμ)2]
dontloo

Tôi hiểu rồi! Cảm ơn: D Vậy trong thực tế chúng ta nên làm gì để tránh nó? Cuốn sách không giải thích về điều đó.
Đặng Mạnh Trường

@DangManhTruong xin chào, tôi đã thêm nó vào câu trả lời, xin hãy xem :)
dontloo

@DangManhTruong bạn được chào đón
dontloo

3

Hãy nhớ lại rằng vấn đề này đã không phát sinh trong trường hợp phân phối Gaussian duy nhất. Để hiểu sự khác biệt, lưu ý rằng nếu một Gaussian đơn lẻ sụp đổ vào một điểm dữ liệu, nó sẽ đóng góp các yếu tố nhân cho hàm khả năng phát sinh từ các điểm dữ liệu khác và các yếu tố này sẽ chuyển sang 0 theo cấp số nhân, mang lại khả năng tổng thể về 0 hơn vô cùng.

Tôi cũng hơi bối rối bởi phần này, và đây là cách giải thích của tôi. Lấy trường hợp 1D cho đơn giản.

Khi một đơn Gaussian "sụp đổ" vào một điểm dữ liệu , tức là μ = x i , khả năng tổng thể trở thành:xiμ=xi

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

Bạn thấy như , thuật ngữ trên trái p ( x i ) , mà cũng giống như trường hợp bệnh lý ở GMM, nhưng về lâu về quyền, đó là khả năng của các điểm dữ liệu khác p ( xi ) , vẫn chứa các thuật ngữ như e - ( x n - μ ) 2σ0p(xi)p(xi)0theo cấp số nhân nhanh nhưσ0e(xnμ)22σ20σ0 , do đó, hiệu ứng tổng thể đối với khả năng là nó đi về 0.

Vấn đề chính ở đây là khi lắp một Gaussian duy nhất, tất cả các điểm dữ liệu phải chia sẻ một tập hợp các thông số , không giống như trong trường hợp hỗn hợp nơi một thành phần có thể "tập trung" vào một điểm dữ liệu mà không bị phạt đến khả năng dữ liệu tổng thể .μ,σ


2

Câu trả lời này sẽ cung cấp cái nhìn sâu sắc về những gì đang xảy ra dẫn đến ma trận hiệp phương sai số ít trong quá trình lắp GMM vào tập dữ liệu, tại sao điều này xảy ra cũng như những gì chúng ta có thể làm để ngăn chặn điều đó.

Do đó, chúng tôi bắt đầu tốt nhất bằng cách tóm tắt lại các bước trong quá trình lắp Mô hình hỗn hợp Gaussian vào tập dữ liệu.


0. Quyết định có bao nhiêu nguồn / cụm (c) bạn muốn phù hợp với dữ liệu của mình
1. Khởi tạo các tham số có nghĩa là , hiệp phương sai Σ c và phân số_per_ class π c trên mỗi cụm c μcΣcπc

EStep_

  1. Tính toán cho mỗi datapoint xác suất r i c mà datapoint x i thuộc về cụm c với: r i c = π c N ( x i | L c , Σ c )xiricxi

    nơiN(x|μ,Σ)mô tả các Gaussian mulitvariate với: N(xi,μc,Σc)=1
    ric=πcN(xi | μc,Σc)Σk=1KπkN(xi | μk,Σk)
    N(x | μ,Σ)

    riccho chúng ta cho mỗi datapointxicác biện pháp:Probmộtbilitythmộttxibelongstoclas
    N(xi,μc,Σc) = 1(2π)n2|Σc|12exp(12(xiμc)TΣc1(xiμc))


    ricxi do đó nếuxirất gần với một gaussian c, nó sẽ nhận đượcgiá trịriccao đối với gaussian này và các giá trị tương đối thấp khác. M-Step_ Với mỗi cụm c: Tính tổng trọng lượngmcProbability that xi belongs to class cProbability of xi over all classesxiric

    MStep_

    mc(lỏng lẻo nói phần của điểm phân bổ cho các cụm c) và cập nhật , μ c , và Σ c sử dụng r i c với: m c = Σ i r i c π c = m cπcμcΣcric

    mc = Σiric

    μc=1
    πc = mcm

    Σc=1
    μc = 1mcΣiricxi

    Σc = 1mcΣiric(xiμc)T(xiμc)





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



X như vậy mà MộtX= =XMột= =Tôi. Nếu điều này không được đưa ra, ma trận được gọi là số ít. Đó là, một ma trận như:

[0000]


không thể đảo ngược và theo số ít. Cũng có lý, nếu chúng ta giả sử rằng ma trận trên là ma trậnMột không thể có một ma trận X cung cấp cho chấm với ma trận này ma trận danh tính Tôi(Đơn giản chỉ cần lấy ma trận số 0 này và chấm sản phẩm này với bất kỳ ma trận 2x2 nào khác và bạn sẽ thấy rằng bạn sẽ luôn nhận được ma trận số 0). Nhưng tại sao điều này là một vấn đề đối với chúng tôi? Vâng, hãy xem xét các công thức cho đa biến bình thường ở trên. Ở đó bạn sẽ tìm thấyΣc-1đó là nghịch đảo của ma trận hiệp phương sai. Vì một ma trận số ít không thể đảo ngược, điều này sẽ gây ra lỗi cho chúng tôi trong quá trình tính toán.
Vì vậy, bây giờ chúng ta đã biết một ma trận đơn lẻ, không thể đảo ngược trông như thế nào và tại sao điều này lại quan trọng đối với chúng ta trong quá trình tính toán GMM, làm thế nào chúng ta có thể gặp phải vấn đề này? Trước hết, chúng tôi nhận được điều này0Ma trận hiệp phương sai ở trên nếu Gaussian đa biến rơi vào một điểm trong quá trình lặp giữa bước E và M. Điều này có thể xảy ra nếu chúng ta có một tập dữ liệu mà chúng ta muốn phù hợp với 3 gaussian nhưng thực tế chỉ bao gồm hai lớp (cụm) sao cho nói một cách lỏng lẻo, hai trong số ba gaussian này bắt cụm riêng của chúng trong khi gaussian cuối cùng chỉ quản lý nó để bắt một điểm duy nhất mà nó ngồi. Chúng ta sẽ thấy nó trông như thế nào dưới đây. Nhưng từng bước một: Giả sử bạn có bộ dữ liệu hai chiều bao gồm hai cụm nhưng bạn không biết điều đó và muốn khớp ba mô hình gaussian với nó, đó là c = 3. Bạn khởi tạo tham số của mình trong bước E và âm mưu các gaussian trên đầu dữ liệu của bạn trông có vẻ smth. thích (có lẽ bạn có thể thấy hai cụm tương đối rải rác ở phía dưới bên trái và trên cùng bên phải): enter image description here Sau khi khởi tạo tham số, bạn lặp lại các bước E, T. Trong thủ tục này, ba Gaussian đi lang thang và tìm kiếm vị trí tối ưu của họ. Nếu bạn quan sát các tham số mô hình, đó làμcπcbạn sẽ quan sát thấy chúng hội tụ, rằng sau một số lần lặp, chúng sẽ không còn thay đổi và do đó Gaussian tương ứng đã tìm thấy vị trí của nó trong không gian. Trong trường hợp bạn có một ma trận số ít bạn gặp phải smth. như: enter image description here Trường hợp tôi đã khoanh tròn mô hình gaussian thứ ba với màu đỏ. Vì vậy, bạn thấy, Gaussian này nằm trên một biểu dữ liệu duy nhất trong khi hai người khác yêu cầu phần còn lại. Ở đây tôi phải lưu ý rằng để có thể vẽ hình như tôi đã sử dụng chính quy hóa hiệp phương sai, đây là một phương pháp để ngăn ngừa ma trận điểm kỳ dị và được mô tả dưới đây.

Ok, nhưng bây giờ chúng tôi vẫn không biết tại sao và làm thế nào chúng ta gặp phải một ma trận đơn lẻ. Vì vậy, chúng ta phải xem xét các tính toán củarTôiccovtrong các bước E và M. Nếu bạn nhìn vàorTôic công thức một lần nữa:
rTôic= =πcN(xTôi | μc,Σc)Σk= =1KπkN(xTôi | μk,Σk)
bạn thấy rằng có rTôicSẽ có giá trị lớn nếu chúng rất có thể nằm trong cụm c và giá trị thấp khác. Để làm cho điều này rõ ràng hơn, hãy xem xét trường hợp chúng ta có hai gaussian tương đối lan rộng và một gaussian rất chặt chẽ và chúng ta tính toánrTôic cho mỗi datapoint xTôinhư được minh họa trong hình: enter image description here Vì vậy, hãy đi qua các biểu dữ liệu từ trái sang phải và tưởng tượng bạn sẽ viết ra xác suất cho mỗixTôirằng nó thuộc về gaussian đỏ, xanh và vàng. Những gì bạn có thể thấy là cho hầu hết cácxTôixác suất nó thuộc về gaussian màu vàng là rất ít. Trong trường hợp ở trên, gaussian thứ ba nằm trên một biểu dữ liệu đơn,rTôic chỉ lớn hơn 0 đối với một điểm dữ liệu này trong khi nó là 0 đối với mọi điểm khác xTôi. (thu gọn vào datapoint này -> Điều này xảy ra nếu tất cả các điểm khác có nhiều khả năng là một hoặc hai gaussian và do đó đây là điểm duy nhất còn lại cho gaussian ba -> Lý do tại sao điều này xảy ra có thể được tìm thấy trong tương tác giữa chính tập dữ liệu trong phần khởi tạo của gaussian. Nghĩa là, nếu chúng ta đã chọn các giá trị ban đầu khác cho gaussian, chúng ta sẽ thấy một hình ảnh khác và gaussian thứ ba có thể sẽ không sụp đổ). Điều này là đủ nếu bạn càng ngày càng tăng gaussian này. CácrTôicbảng sau đó trông smth. như: enter image description here như bạn thấy,rTôic of the third column, that is for the third gaussian are zero instead of this one row. If we look up which datapoint is represented here we get the datapoint: [ 23.38566343 8.07067598]. Ok, but why do we get a singularity matrix in this case? Well, and this is our last step, therefore we have to once more consider the calculation of the covariance matrix which is:
Σc = Σiric(xiμc)T(xiμc)
we have seen that all ric are zero instead for the one xi with [23.38566343 8.07067598]. Now the formula wants us to calculate (xiμc). If we look at the μc for this third gaussian we get [23.38566343 8.07067598]. Oh, but wait, that exactly the same as xi and that's what Bishop wrote with:"Suppose that one of the components of the mixture model, let us say the j th component, has its mean μj exactly equal to one of the data points so that μj=xn for some value of n" (Bishop, 2006, p.434). So what will happen? Well, this term will be zero and hence this datapoint was the only chance for the covariance-matrix not to get zero (since this datapoint was the only one where ric>0), it now gets zero and looks like:

[0000]


Consequently as said above, this is a singular matrix and will lead to an error during the calculations of the multivariate gaussian. So how can we prevent such a situation. Well, we have seen that the covariance matrix is singular if it is the 0 matrix. Hence to prevent singularity we simply have to prevent that the covariance matrix becomes a 0 matrix. This is done by adding a very little value (in sklearn's GaussianMixture this value is set to 1e-6) to the digonal of the covariance matrix. There are also other ways to prevent singularity such as noticing when a gaussian collapses and setting its mean and/or covariance matrix to a new, arbitrarily high value(s). This covariance regularization is also implemented in the code below with which you get the described results. Maybe you have to run the code several times to get a singular covariance matrix since, as said. this must not happen each time but also depends on the initial set up of the gaussians.
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, all the answers miss a fundamental fact. If one looks at the parameter space for a Gaussian mixture model, this space is singular along the subspace where there are less than the full number of components in the mixture. That means that derivatives are automatically zero and typically the whole subspace will show up as a mle. More philosophically, the subspace of less than full rank covariances is the boundary of the parameter space and one should always be suspicious when the mle occurs on the boundary- it usually indicates that there is a bigger parameter space lurking around in which one can find the 'real' mle. There is a book called "Algebraic Statistics" by Drton, Sturmfeld, and Sullivant. This issue is discussed in that book in some detail. If you are really curious, you should look at that.


-2

For a single Gaussian, the mean may possibly equal one of the data points (xn for example) and then there is the following term in the likelihood function:

N(xn|xn,σj11)limσjxn1(2π)1/2σjexp(1σj|xnσj|2)=1(2π)1/2σj
The limit σj0 is now clearly divergent since the argument of the exponential vanishes.

However for a data point xm different from the mean σj, we will have

N(xm|xm,σj11)=1(2π)1/2σjexp(1σj|xmσj|2)
and now the argument of the exponential diverges (and is negative) in the limit σj0. As a result the product of these two terms in the likelihood function will vanish.

This answer is incorrect as there is no reason to identify mean μj and standard deviation σj.
Xi'an
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.