ปัญหาเอกฐานในรูปแบบการผสมแบบเกาส์เซียน


15

ในบทที่ 9 ของการจดจำรูปแบบหนังสือและการเรียนรู้ของเครื่องมีส่วนนี้เกี่ยวกับแบบผสมแบบเกาส์:

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ บอกตามตรงฉันไม่เข้าใจจริง ๆ ว่าทำไมสิ่งนี้จึงสร้างความแปลกประหลาด ใครสามารถอธิบายสิ่งนี้ให้ฉันได้บ้าง ฉันขอโทษ แต่ฉันเป็นแค่ระดับปริญญาตรีและเป็นสามเณรในการเรียนรู้ของเครื่องดังนั้นคำถามของฉันอาจฟังดูไร้สาระ แต่โปรดช่วยฉันด้วย ขอบคุณมาก


ดูเหมือนว่ามันจะแก้ไขได้ง่ายเช่นกันเปลี่ยนขนาดเป็นแล้วลงโทษγ kเนื่องจากอยู่ใกล้กับศูนย์มากเกินไปเมื่อปรับให้เหมาะสม σk2=τ2γkγk
ความน่าจะเป็นทางการที่

1
@probabilityislogic ไม่แน่ใจว่าฉันกำลังติดตามที่นี่ :(
Dang Manh Truong

คำตอบ:


11

หากเราต้องการให้ Gaussian พอดีกับจุดข้อมูลเดียวโดยใช้โอกาสสูงสุดเราจะได้รับ Gaussian ที่แหลมคมมากที่ "ยุบ" ถึงจุดนั้น ความแปรปรวนเป็นศูนย์เมื่อมีเพียงจุดเดียวซึ่งในกรณีแบบเกาส์หลายตัวแปรนำไปสู่เมทริกซ์ความแปรปรวนร่วมเอกพจน์ดังนั้นจึงเรียกว่าปัญหาเอกฐาน

เมื่อความแปรปรวนมาถึงศูนย์ความน่าจะเป็นขององค์ประกอบเกาส์ (สูตร 9.15) จะเปลี่ยนไปเป็นอนันต์ สิ่งนี้ไม่ได้เกิดขึ้นเมื่อเราใส่ Gaussian เพียงหนึ่งจุดเข้ากับจำนวนจุดเนื่องจากความแปรปรวนไม่สามารถเป็นศูนย์ได้ แต่มันสามารถเกิดขึ้นได้เมื่อเรามีส่วนผสมของ Gaussians ดังแสดงในหน้าเดียวกันของ PRML

ป้อนคำอธิบายรูปภาพที่นี่

อัปเดต :
หนังสือเล่มนี้เสนอวิธีการสองวิธีในการแก้ไขปัญหาภาวะเอกฐานซึ่ง ได้แก่

1) การรีเซ็ตค่าเฉลี่ยและความแปรปรวนเมื่อภาวะเอกฐานเกิดขึ้น ป้อนคำอธิบายรูปภาพที่นี่

2) ใช้ MAP แทน MLE โดยเพิ่มก่อนหน้า ป้อนคำอธิบายรูปภาพที่นี่


เกี่ยวกับกรณี Gaussian เดียวเหตุใดความแปรปรวนจึงไม่เป็นศูนย์ ตำราเรียนกล่าวว่า: "จำได้ว่าปัญหานี้ไม่ได้เกิดขึ้นในกรณีของการแจกแจงแบบเกาส์เดียวเพื่อให้เข้าใจถึงความแตกต่างโปรดทราบว่าหากเกาส์เซียนตัวเดียวทรุดตัวลงบนจุดข้อมูล จุดข้อมูลและปัจจัยเหล่านี้จะเป็นศูนย์อย่างรวดเร็วชี้แจงให้โอกาสโดยรวมที่จะเป็นศูนย์มากกว่าอินฟินิตี้ "แต่ฉันไม่เข้าใจมันมาก :(
Dang Manh Truong

@ DangManhTruong นั่นเป็นเพราะตามคำจำกัดความของความแปรปรวน, , ยกเว้นว่าจุดทั้งหมดมีค่าเท่ากันเราจะมีความแปรปรวนที่ไม่เป็นศูนย์เสมอ โวลต์aR(x)=E[(x-μ)2]
dontloo

ฉันเห็น! ขอบคุณ: D ดังนั้นในทางปฏิบัติเราควรทำอย่างไรเพื่อหลีกเลี่ยงปัญหานี้? หนังสือไม่ได้อธิบายเกี่ยวกับเรื่องนั้น
Dang Manh Truong

@ DangManhTruong สวัสดีฉันเพิ่มไปยังคำตอบโปรดดู :)
dontloo

@ DangManhTruong ยินดีต้อนรับ
dontloo

3

จำได้ว่าปัญหานี้ไม่ได้เกิดขึ้นในกรณีของการแจกแจงแบบเกาส์เดียว เพื่อให้เข้าใจถึงความแตกต่างโปรดทราบว่าหากเกาส์เซียนตัวเดียวทรุดตัวลงบนจุดข้อมูลมันจะมีส่วนร่วมในการคูณปัจจัยกับฟังก์ชันความน่าจะเป็นที่เกิดขึ้นจากจุดข้อมูลอื่น ๆ และปัจจัยเหล่านี้จะเป็นศูนย์อย่างรวดเร็วแบบทวีคูณ กว่าอินฟินิตี้

ฉันยังสับสนในส่วนนี้และนี่คือการตีความของฉัน พกเคส 1D เพื่อความเรียบง่าย

เมื่อ Gaussian เดียว "ยุบ" บนจุดข้อมูล , เช่น, μ = x i , โอกาสโดยรวมจะกลายเป็น:xผมμ=xi

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

คุณเห็นว่าคำศัพท์ทางซ้ายp ( x i ) ซึ่งเป็นเหมือนกรณีทางพยาธิวิทยาใน GMM แต่คำทางด้านขวาซึ่งเป็นโอกาสของจุดข้อมูลอื่นp ( xi )ยังคงมีคำเช่นe - ( x n - μ ) 2σ0p(xi)p(xi)ซึ่ง0เร็วแบบเอ็กซ์โพเนนเชียลเท่ากับσ0ดังนั้นผลกระทบโดยรวมของความน่าจะเป็นที่จะให้มันเป็นศูนย์e(xnμ)22σ20σ0

ประเด็นหลักที่นี่คือเมื่อติดตั้ง Gaussian เพียงจุดเดียวจุดข้อมูลทั้งหมดจะต้องแบ่งพารามิเตอร์หนึ่งชุดซึ่งแตกต่างจากกรณีของการผสมที่องค์ประกอบหนึ่งสามารถ "โฟกัส" ที่จุดข้อมูลหนึ่งโดยไม่มีการลงโทษต่อความน่าจะเป็นของข้อมูล .μ,σ


2

คำตอบนี้จะให้ข้อมูลเชิงลึกเกี่ยวกับสิ่งที่เกิดขึ้นซึ่งนำไปสู่เมทริกซ์ความแปรปรวนร่วมเอกพจน์ในช่วงที่เหมาะสมของ GMM กับชุดข้อมูลสาเหตุที่เกิดขึ้นเช่นเดียวกับสิ่งที่เราสามารถทำได้เพื่อป้องกันไม่ให้

ดังนั้นเราจึงควรเริ่มต้นด้วยการสรุปขั้นตอนในระหว่างการปรับแบบจำลองแบบผสมของเกาส์เซียนเป็นชุดข้อมูล


0. กำหนดจำนวนแหล่งที่มา / กลุ่ม (c) ที่คุณต้องการให้พอดีกับข้อมูลของคุณ
1. เริ่มต้นพารามิเตอร์หมายถึง , ความแปรปรวนร่วมΣ c , และ fraction_per_class π cต่อคลัสเตอร์ c μcΣcπc

EStep_

  1. คำนวณหาแต่ละดาต้าพอยน์ความน่าจะเป็นr ฉันดาต้าพอยน์x ฉันเป็นของคลัสเตอร์ c ด้วย: r i c = π c N ( x i | μ c , Σ c )xiricxi

    โดยที่N(x|μ,Σ)อธิบาย mulitvariate Gaussian ด้วย: N(xi,μc,Σc)=1
    ric=πcN(xi | μc,Σc)Σk=1KπkN(xi | μk,Σk)
    N(x | μ,Σ)

    Rฉันจะช่วยให้เราแต่ละ DataPointxฉันวัดของ:PRoฉันลิตรฉันทีวายทีเอชทีxibelongstoclas
    N(xi,μc,Σc) = 1(2π)n2|Σc|12exp(12(xiμc)TΣc1(xiμc))


    ricxiเพราะฉะนั้นถ้าxฉันอยู่ใกล้กับหนึ่งคเกาส์ก็จะได้รับสูงRฉันค่า สำหรับ Gaussian นี้และมีค่าค่อนข้างต่ำ M-Step_ สำหรับแต่ละกลุ่ม c: คำนวณน้ำหนักรวมmcProbability that xi belongs to class cProbability of xi over all classesxiric

    MStep_

    mc(พูดหลวม ๆ ส่วนของคะแนนที่จัดสรรให้กับคลัสเตอร์ c) และอัปเดต , μ cและΣ cโดยใช้r i cด้วย: m c = Σ ฉันr ฉัน c π c = m cπcμcΣcric

    mc = Σiric

    μc=1
    πc = mcm

    Σc=1
    μc = 1mcΣiricxi

    ว่าคุณต้องใช้วิธีการที่ได้รับการปรับปรุงในสูตรสุดท้ายนี้ ทำซ้ำขั้นตอน E และ M ซ้ำแล้วซ้ำอีกจนกระทั่งฟังก์ชันบันทึกความน่าจะเป็นของโมเดลของเรามาบรรจบกันที่คำนวณความน่าจะเป็นบันทึกด้วย: lnp(X|π,μ,Σ)=Σ N ฉัน= 1 ln(Σ K
    Σ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 gaussians แต่จริง ๆ แล้วประกอบด้วยสองคลาสเท่านั้น (กลุ่ม) ที่พูดอย่างหลวม ๆ สองสาม gaussians เหล่านี้จับกลุ่มของตัวเองในขณะที่ gussian สุดท้ายเท่านั้นจัดการมัน เพื่อจับจุดเดียวที่มันอยู่ เราจะดูว่าลักษณะนี้เป็นอย่างไรด้านล่าง แต่ทีละขั้นตอน: สมมติว่าคุณมีชุดข้อมูลสองมิติซึ่งประกอบด้วยสองกลุ่ม แต่คุณไม่ทราบว่าและต้องการให้พอดีกับแบบจำลอง gaussian ทั้งสามแบบนั่นคือ c = 3 คุณเริ่มต้นพารามิเตอร์ของคุณในขั้นตอน E และพล็อต gaussians ด้านบนของข้อมูลของคุณซึ่งดู smth เช่น (คุณอาจเห็นกลุ่มกระจัดกระจายสองกลุ่มที่มุมล่างซ้ายและขวาบน): ป้อนคำอธิบายรูปภาพที่นี่μ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=xnric

[0000]


00มดลูก สิ่งนี้ทำได้โดยการเพิ่มค่าน้อยมาก (ในGaussianMixture ของ sklearnค่านี้ถูกตั้งค่าเป็น 1e-6) ไปยัง digonal ของเมทริกซ์ความแปรปรวนร่วม นอกจากนี้ยังมีวิธีอื่นในการป้องกันภาวะเอกฐานเช่นสังเกตเมื่อเกาส์เซียนยุบลงและตั้งค่าเฉลี่ยและ / หรือเมทริกซ์ความแปรปรวนร่วมเป็นค่าสูงใหม่ที่ไม่ได้ตั้งใจ การทำให้เป็นมาตรฐานความแปรปรวนร่วมนี้ยังนำไปใช้ในโค้ดด้านล่างซึ่งคุณจะได้รับผลลัพธ์ที่อธิบายไว้ บางทีคุณต้องรันโค้ดหลาย ๆ ครั้งเพื่อรับเมทริกซ์ความแปรปรวนร่วมเอกพจน์ตั้งแต่นั้นมา สิ่งนี้จะต้องไม่เกิดขึ้นในแต่ละครั้ง แต่ขึ้นอยู่กับการตั้งค่าเริ่มต้นของ 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 คำตอบทั้งหมดพลาดข้อเท็จจริงพื้นฐาน หากมีใครดูที่พื้นที่พารามิเตอร์สำหรับแบบจำลองการผสมแบบเกาส์พื้นที่นี้จะเป็นเอกพจน์ตามช่องว่างย่อยที่มีจำนวนส่วนประกอบน้อยกว่าในการผสม นั่นหมายความว่าอนุพันธ์นั้นเป็นศูนย์โดยอัตโนมัติและโดยทั่วไปแล้ว subspace ทั้งหมดจะปรากฏเป็น mle ยิ่งไปกว่านั้นในเชิงปรัชญาสเปซย่อยที่น้อยกว่าค่าความแปรปรวนร่วมแบบเต็มคือขอบเขตของพื้นที่พารามิเตอร์และหนึ่งควรจะสงสัยเมื่อ mle เกิดขึ้นในขอบเขต - มันมักจะแสดงให้เห็นว่ามีพื้นที่พารามิเตอร์ขนาดใหญ่ที่ซุ่มอยู่รอบ ๆ mle 'จริง' มีหนังสือชื่อว่า "Algebraic Statistics" โดย Drton, Sturmfeld และ Sullivant ปัญหานี้ถูกกล่าวถึงในหนังสือเล่มนี้โดยละเอียด หากคุณอยากรู้อยากเห็นจริง ๆ คุณควรดูที่


-2

สำหรับ Gaussian เดียวค่าเฉลี่ยอาจเท่ากับหนึ่งในจุดข้อมูล (xn ตัวอย่าง) จากนั้นมีคำต่อไปนี้ในฟังก์ชันความน่าจะเป็น:

ยังไม่มีข้อความ(xn|xn,σJ11)LimσJxn1(2π)1/2σJประสบการณ์(-1σJ|xn-σJ|2)=1(2π)1/2σJ
ขีด จำกัด σJ0 ตอนนี้มีความแตกต่างอย่างชัดเจนตั้งแต่การโต้แย้งของผู้แทนหายตัวไป

อย่างไรก็ตามสำหรับจุดข้อมูล xม. แตกต่างจากค่าเฉลี่ย σJ, เราจะมี

ยังไม่มีข้อความ(xม.|xม.,σJ11)=1(2π)1/2σJประสบการณ์(-1σJ|xม.-σJ|2)
และตอนนี้การโต้แย้งของ diverges ชี้แจง (และเป็นลบ) ในวงเงิน σJ0. ดังนั้นผลลัพธ์ของคำสองคำนี้ในฟังก์ชันความน่าจะเป็นจะหายไป

คำตอบนี้ไม่ถูกต้องเนื่องจากไม่มีเหตุผลที่จะระบุค่าเฉลี่ย μJ และส่วนเบี่ยงเบนมาตรฐาน σJ.
ซีอาน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.