यह उत्तर इस बात की जानकारी देगा कि ऐसा क्या हो रहा है जो GMM की फिटिंग के दौरान एक विलक्षण सहसंयोजक मैट्रिक्स की ओर अग्रसर होता है, ऐसा क्यों हो रहा है और इसे रोकने के लिए हम क्या कर सकते हैं।
इसलिए हम एक ग्रेसियन मिक्सचर मॉडल की फिटिंग के दौरान किसी डेटासेट में फिटिंग को पुन: उपयोग करके शुरू करते हैं।
0. तय करें कि कई स्रोतों / समूहों (ग) आप अपने डेटा को फिट करने के लिए चाहते हैं
1. प्रारंभ मापदंडों मतलब , सहप्रसरण Σ ग , और fraction_per_class π ग प्रति क्लस्टर ग
μcΣcπc
E−Step–––––––––
- प्रत्येक डाटापॉइंट के लिए गणना संभावना आर मैं ग डाटापॉइंट कि x मैं के साथ क्लस्टर सी के अंतर्गत आता है:
आर मैं ग = π सी एन ( एक्स मैं | μ ग , Σ ग )xiricxi
जहांएन(एक्स|μ,Σ)के साथ mulitvariate गाऊसी वर्णन करता है:
एन(एक्समैं,μग,Σग)=1ric=πcN(xi | μc,Σc)ΣKk=1πkN(xi | μk,Σk)
N( x) | μ,Σ)
आरमैंगप्रत्येक डाटापॉइंट के लिए हमें देता हैxमैंमाप की:पीआरओबीएकखमैंएलमैंटीवाईटीजएकटीxibelongstoclasN(xi,μc,Σc) = 1( २)π)n2|Σसी|12ई एक्स पी ( -12(xमैं-μसी)टीΣ- 1सी(xमैं-μसी) )
आरमैं सीएक्समैंपीr o b a b i l l i t y t h a t x मैं बी ई एल ओ एन जी जीरों टी ओ सी एल एक रों रों ग पीr o b a b i l l i t y ओ च एक्समैं ओ वी ई आर एक एल एल सी एल एक रों रों ई रों एक्समैंआरमैं सी
म- एसटी ई पी----------
मसीπसीμसीΣसी using आरमैं सी with:
मसी = Σ मैंआरमैंसी
πc = mcm
μc = 1mcΣiricxi
Σc = 1mcΣiric(xi−μc)T(xi−μc)
Mind that you have to use the updated means in this last formula.
Iteratively repeat the E and M step until the log-likelihood function of our model converges where the log likelihood is computed with:
ln p(X | π,μ,Σ)= Σ एनमैं = १ l n ( Σकके = १πकएन( x)मैं | μ क, Σक) )
इसलिए अब हमने गणना के दौरान एकल चरण निकाले हैं, हमें इस बात पर विचार करना होगा कि मैट्रिक्स के विलक्षण होने का क्या मतलब है। एक मैट्रिक्स विलक्षण है अगर यह उलटा नहीं है। यदि मैट्रिक्स है, तो एक मैट्रिक्स उल्टा हैएक्स ऐसा है कि एक एक्स= एक्सए = मैं। यदि यह नहीं दिया जाता है, तो मैट्रिक्स को एकवचन कहा जाता है। यह एक मैट्रिक्स की तरह है:
[ ०000]
विलक्षण और निम्नलिखित विलक्षण नहीं है। यह प्रशंसनीय भी है, कि यदि हम यह मान लें कि उपरोक्त मैट्रिक्स मैट्रिक्स है
ए कोई मैट्रिक्स नहीं हो सकता है
एक्स जो इस मैट्रिक्स को पहचान मैट्रिक्स के साथ बिंदीदार देता है
मैं(बस इस शून्य मैट्रिक्स और डॉट-उत्पाद को किसी अन्य 2x2 मैट्रिक्स के साथ लें और आप देखेंगे कि आपको हमेशा शून्य मैट्रिक्स मिलेगा) लेकिन यह हमारे लिए एक समस्या क्यों है? ठीक है, ऊपर बहुभिन्नरूपी के लिए सूत्र पर विचार करें। वहाँ तुम पाओगे
Σ- 1सीजो कोविरेसी मैट्रिक्स का उल्टा है। चूंकि एक विलक्षण मैट्रिक्स उल्टा नहीं है, इसलिए यह गणना के दौरान हमें एक त्रुटि देगा।
तो अब जब हम जानते हैं कि जीएमएम गणना के दौरान एक विलक्षण, नहीं, उल्टे मैट्रिक्स कैसा दिखता है और यह हमारे लिए क्यों महत्वपूर्ण है, तो हम इस मुद्दे में कैसे भाग सकते हैं? सबसे पहले, हम इसे प्राप्त करते हैं
0E और M चरण के बीच पुनरावृत्ति के दौरान यदि मल्टीवेरेट गौसियन एक बिंदु पर गिरता है, तो कोविरियस मैट्रिक्स। यह तब हो सकता है जब हमारे पास एक डेटासेट होता है, जिसमें हम 3 गॉसियंस फिट करना चाहते हैं, लेकिन जिसमें वास्तव में केवल दो वर्ग (क्लस्टर) होते हैं, जो कि शिथिल रूप से बोलते हैं, इनमें से दो तीन गॉसियन अपने स्वयं के क्लस्टर को पकड़ते हैं जबकि अंतिम गॉसियन केवल इसे प्रबंधित करता है एक एकल बिंदु को पकड़ने के लिए जिस पर वह बैठता है। हम देखेंगे कि यह नीचे कैसा दिखता है। लेकिन चरण दर चरण: मान लें कि आपके पास एक दो आयामी डेटासेट हैं, जिसमें दो क्लस्टर शामिल हैं, लेकिन आप यह नहीं जानते हैं और इसके लिए तीन गॉसियन मॉडल फिट करना चाहते हैं, वह है c = 3. आप E चरण और प्लॉट में अपने मापदंडों को इनिशियलाइज़ करते हैं। आपके डेटा के शीर्ष पर स्थित गौस जैसे (हो सकता है कि आप नीचे बाईं ओर और ऊपर दाईं ओर दो अपेक्षाकृत बिखरे हुए क्लस्टर देख सकें):
पैरामीटर को इनिशियलाइज़ करने के बाद, आप इसे E, T स्टेप्स के अनुसार करते हैं। इस प्रक्रिया के दौरान तीन गॉसियन घूमने-फिरने और अपने इष्टतम स्थान की खोज करने की तरह होते हैं। यदि आप मॉडल मापदंडों का पालन करते हैं, तो यह है
μसी तथा
πसीआप देखेंगे कि वे अभिसरण करते हैं, कि कुछ संख्या में पुनरावृत्तियों के बाद वे अब परिवर्तित नहीं होंगे और इसके साथ ही गौसियन ने अंतरिक्ष में अपना स्थान पाया है। उस स्थिति में जहां आपके पास एक विलक्षणता मैट्रिक्स है, जहां आप smth से मुठभेड़ करते हैं। जैसे:
जहाँ मैंने तीसरे गाऊसी मॉडल को लाल रंग के साथ परिक्रमा की है। तो आप देखते हैं, कि यह गौसियन एक एकल डाटापॉइंट पर बैठता है जबकि बाकी दो लोग दावा करते हैं। यहाँ मुझे ध्यान देना है कि इस तरह की आकृति को खींचने में सक्षम होने के लिए मैंने पहले से ही सहसंयोजक-नियमितीकरण का उपयोग किया है जो विलक्षणता से बचने के लिए एक विधि है और नीचे वर्णित है।
ठीक है, लेकिन अब हम यह नहीं जानते हैं कि हम एक विलक्षण मैट्रिक्स का क्यों और कैसे सामना करते हैं। इसलिए हमें की गणनाओं को देखना होगा
आरमैं सी और यह
सी ओ वीई और एम चरणों के दौरान। अगर तुम देखो
आरमैं सी सूत्र फिर से:
आरमैं सी= πसीएन( x)मैं | μ सी, Σसी)Σकके = १πकएन( x)मैं | μ क, Σक)
आप देखते हैं कि वहाँ
आरमैं सीयदि उनके क्लस्टर सी और कम मूल्यों के तहत बहुत अधिक संभावना है, तो बड़े मूल्य होंगे। इस मामले को और स्पष्ट करने के लिए उस मामले पर विचार करें जहां हमारे पास दो अपेक्षाकृत फैले हुए गॉसियन हैं और एक बहुत तंग गॉसियन है और हम गणना करते हैं
आरमैं सी प्रत्येक डेटापॉइंट के लिए
एक्समैंजैसा कि चित्र में चित्रित किया गया है:
इसलिए बायें से दाएं बिंदुओं के माध्यम से जाएं और कल्पना करें कि आप प्रत्येक के लिए संभावना को लिखेंगे
एक्समैंयह लाल, नीले और पीले रंग के गाऊसी के अंतर्गत आता है। आप जो देख सकते हैं, वह अधिकांश के लिए है
एक्समैंयह संभावना है कि यह पीले गाऊसी से संबंधित है, बहुत कम है। ऊपर के मामले में जहां तीसरा गॉसियन एक एकल डाटापॉइंट पर बैठता है,
आरमैं सी यह इस एक डेटापॉइंट के लिए केवल शून्य से बड़ा है जबकि यह हर दूसरे के लिए शून्य है
एक्समैं। (इस डाटापॉइंट पर पतन होता है -> ऐसा तब होता है जब अन्य सभी बिंदु एक या दो होने की अधिक संभावना वाले भाग होते हैं और इसलिए यह एकमात्र बिंदु है जो गौसियन तीन के लिए रहता है -> कारण यह होता है कि बीच में मिल सकता है गॉज़ियंस के प्रारंभिककरण में डेटासेट स्वयं। यदि हमने गॉसियंस के लिए अन्य प्रारंभिक मानों को चुना था, तो हमने एक और तस्वीर देखी होगी और तीसरा गॉसियन शायद नहीं गिरेगा)। यह पर्याप्त है अगर आप आगे और आगे इस गॉसियन spikes।
आरमैं सीतालिका तब स्मथ दिखती है। जैसे:
जैसा कि आप देख सकते हैं, द
आरमैं सीतीसरे कॉलम के लिए, जो कि तीसरे गॉसियन के लिए है, इस एक पंक्ति के बजाय शून्य हैं। यदि हम देखते हैं कि किस डाटापॉइंट का प्रतिनिधित्व यहां किया गया है तो हमें डाटापॉइंट मिलता है: [23.38566343 8.07067598]। ठीक है, लेकिन हम इस मामले में एक विलक्षण मैट्रिक्स क्यों प्राप्त करते हैं? खैर, और यह हमारा अंतिम चरण है, इसलिए हमें एक बार और सहसंयोजक मैट्रिक्स की गणना पर विचार करना होगा जो है:
Σसी = Σ मैंआरमैं सी( x)मैं- μसी)टी( x)मैं- μसी)
हमने वह सब देखा है
आरमैं सी इसके बजाय शून्य हैं
एक्समैं[23.38566343 8.07067598] के साथ। अब सूत्र चाहता है कि हम गणना करें
( x)मैं- μसी)। अगर हम देखें
μसीइस तीसरे गॉसियन के लिए हमें [23.38566343 8.07067598] मिलता है। ओह, लेकिन रुको, बिल्कुल वैसा ही
एक्समैं और यही बिशप ने लिखा: "मान लीजिए कि मिश्रण मॉडल के घटकों में से एक है, तो हम कहते हैं कि
जे वें घटक, इसका मतलब है
μजे
डेटा बिंदुओं में से एक के बराबर
μजे= एक्सnn के कुछ मान के लिए "(बिशप, 2006, p.434)। तो क्या होगा? ठीक है, यह शब्द शून्य होगा और इसलिए इस डेटापॉइंट को कोविरेंस-मैट्रिक्स के लिए शून्य नहीं मिलने का एकमात्र मौका था (क्योंकि इस डेटापॉइंट के बाद से) केवल एक ही जहाँ
आरमैं सी> 0), यह अब शून्य हो जाता है और जैसा दिखता है:
[ ०000]
नतीजतन, जैसा कि ऊपर कहा गया है, यह एक विलक्षण मैट्रिक्स है और बहुभिन्नरूपी गौसियन की गणना के दौरान एक त्रुटि पैदा करेगा। तो हम ऐसी स्थिति को कैसे रोक सकते हैं। ठीक है, हमने देखा है कि अगर यह है तो सहसंयोजक मैट्रिक्स विलक्षण है
0आव्यूह। इसलिए विलक्षणता को रोकने के लिए हमें बस यह रोकना होगा कि सहसंयोजक मैट्रिक्स एक बन जाता है
0आव्यूह। यह बहुत कम मान जोड़कर किया जाता है (
sklearn's 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()