패턴 인식 및 기계 학습 책 9 장에는 가우스 혼합 모델에 대한이 부분이 있습니다.
솔직히 말해서 이것이 왜 특이점을 만드는지 이해하지 못합니다. 누구든지 나에게 이것을 설명 할 수 있습니까? 죄송하지만 머신 러닝 분야의 학부생이자 초보자이므로 제 질문에 약간 어리석은 소리가 들리지만 도와주세요. 대단히 감사합니다
패턴 인식 및 기계 학습 책 9 장에는 가우스 혼합 모델에 대한이 부분이 있습니다.
솔직히 말해서 이것이 왜 특이점을 만드는지 이해하지 못합니다. 누구든지 나에게 이것을 설명 할 수 있습니까? 죄송하지만 머신 러닝 분야의 학부생이자 초보자이므로 제 질문에 약간 어리석은 소리가 들리지만 도와주세요. 대단히 감사합니다
답변:
최대 우도를 사용하여 가우스를 단일 데이터 포인트에 맞추려면 해당 포인트에 "붕괴"하는 매우 뾰족한 가우시안을 얻게됩니다. 다변량 가우시안 경우 단수 공분산 행렬로 이어지는 점이 하나 일 때 분산은 0입니다. 따라서이를 특이성 문제라고합니다.
분산이 0에 도달하면 가우스 성분 (수식 9.15)의 가능성이 무한대가되고 모형이 과적 합됩니다. 분산이 0이 될 수 없기 때문에 하나의 가우시안을 여러 포인트에 맞추면 발생하지 않습니다. 그러나 동일한 페이지의 PRML에 표시된대로 가우시안이 혼합되어있을 때 발생할 수 있습니다.
최신 정보 :
이 책은 특이성 문제를 해결하는 두 가지 방법을 제안합니다.
단일 가우시안 분포의 경우에는이 문제가 발생하지 않았 음을 기억하십시오. 차이를 이해하기 위해 단일 가우시안이 데이터 포인트로 축소되면 다른 데이터 포인트에서 발생하는 가능성 함수에 곱셈 요소가 영향을 미치며 이러한 요소는 기하 급수적으로 빠르게 0이되어 전반적인 가능성은 0이됩니다. 무한대보다.
나는 또한이 부분에 혼란스러워하며 여기 내 해석이 있습니다. 단순성을 위해 1D 사례를 사용하십시오.
단일 가우시안이 데이터 포인트 에서 "붕괴"할 때 ( 즉, μ = x i ) 전체 가능성은 다음과 같습니다.
당신은 참조 , 왼쪽 용어 P ( X I ) → ∞ , GMM의 병리학 경우와 같지만, 어떤 다른 데이터 포인트의 가능성이다 오른쪽의 기간 P ( X ∖ I ) 여전히 같은 용어가 들어 전자 - ( X N - μ를 ) 2 는→0σ→0만큼 기하 급수적으로 빠르므로 우도에 대한 전체적인 효과는 0이됩니다.
여기서 중요한 점은 단일 가우시안을 피팅 할 때 하나의 구성 요소가 전체 데이터 가능성에 대한 페널티없이 하나의 데이터 포인트에 "초점을 맞출"수있는 혼합 사례와 달리 모든 데이터 포인트가 하나의 매개 변수 를 공유해야한다는 것입니다. .
이 답변은 데이터 세트에 GMM을 피팅하는 동안 단일 공분산 행렬로 이어지는 일에 대한 통찰력을 제공하며, 왜 이런 일이 일어나고 있으며,이를 방지하기 위해 할 수있는 일도 있습니다.
따라서 가우스 혼합 모델을 데이터 세트에 피팅하는 동안 단계를 다시 시작하는 것이 가장 좋습니다.
0. 데이터에 적합한 소스 / 클러스터 수 (c) 결정
1. 클러스터 당 매개 변수 평균 , 공분산 Σ c 및 fraction_per_class π c 초기화 c
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()
Imho, 모든 대답은 근본적인 사실을 그리워합니다. 가우스 혼합 모델의 매개 변수 공간을 살펴보면이 공간은 혼합물에 전체 구성 요소 수가 적은 부분 공간을 따라 특이합니다. 이는 미분 값이 자동으로 0이고 일반적으로 전체 부분 공간이 mle로 표시됨을 의미합니다. 보다 철학적으로, 전체 순위 공분산보다 작은 부분 공간은 모수 공간의 경계이며, 경계에서 mle이 발생할 때 항상 의심되어야합니다. '진짜'몰. Drton, Sturmfeld 및 Sullivant의 "대수 통계"라는 책이 있습니다. 이 문제에 대해서는이 책에서 자세히 설명합니다. 정말로 궁금한 점이 있다면 그것을 봐야합니다.