ননপ্যারমেট্রিক ক্লাস্টারিংয়ের জন্য পাইএমসি: গাউসিয়ান মিশ্রণের পরামিতিগুলি অনুমান করার জন্য ডিরিচলেট প্রক্রিয়াটি গুচ্ছ হতে ব্যর্থ হয়েছে


10

সমস্যা সমাধান

খেলনা সংক্রান্ত প্রথম সমস্যার মধ্যে আমি পাইএমসি প্রয়োগ করতে চেয়েছিলাম তা হ'ল ননপ্যারমেট্রিক ক্লাস্টারিং: কিছু তথ্য দেওয়া হলে এটিকে গাওসিয়ান মিশ্রণ হিসাবে মডেল করুন এবং গুচ্ছের সংখ্যা এবং প্রতিটি ক্লাস্টারের গড় এবং সমবায়তা শিখুন। এই পদ্ধতিটি সম্পর্কে আমি যা জানি তার বেশিরভাগই মাইকেল জর্ডান এবং ইয়ে হোয়ে তেহ, প্রায় ২০০ 2007 সালে ভিডিও বক্তৃতা (স্পারসিটিটি রেগে যাওয়ার আগে) এবং ডঃ ফননেসবেকের এবং ই চেনের টিউটোরিয়ালগুলি পড়ার শেষ কয়েক দিন [fn1], [ fn2]। তবে সমস্যাটি ভালভাবে অধ্যয়ন করা হয়েছে এবং এর কিছু নির্ভরযোগ্য বাস্তবায়ন রয়েছে [fn3]।

খেলনার এই সমস্যায়, আমি এক-মাত্রিক গাউসিয়ান থেকে দশটি অঙ্কএন(μ=0,σ=1) এবং forty থেকে চল্লিশটি অঙ্কন করি । আপনি নীচে দেখতে পাচ্ছেন যে, কোন মিশ্রণ উপাদানটি থেকে কোন নমুনা এসেছে তা সহজেই জানাতে আমি আঁকাগুলি পরিবর্তন করি নি।এন(μ=4,σ=2)

গাউসিয়ান মিশ্রণের মডেল ডেটা

আমি প্রতিটি ডাটা নমুনা মডেল , জন্য এবং যেখানে এই জন্য ক্লাস্টার ইঙ্গিত তম ডেটা পয়েন্ট: । হ'ল ব্যবহৃত কাটা ডিরিচলেট প্রক্রিয়াটির দৈর্ঘ্য: আমার জন্য, ।Yআমি~এন(μz- রআমি,σz- রআমি)আমি=1,,50z- রআমিআমিz- রআমি[1,,এনডিপি]এনডিপিএনডিপি=50

Dirichlet প্রক্রিয়া পরিকাঠামো সম্প্রসারিত, প্রতিটি : ক্লাস্টার আইডি শ্রেণীগত দৈব চলক থেকে ড্র, যার সম্ভাবনা ভর ফাংশন লাঠি ভাঙার কনস্ট্রাক্ট কর্তৃক প্রদত্ত হয় সঙ্গে একটি জন্য ঘনত্বের প্যারামিটার । স্টিক-ব্রেকিং দীর্ঘ ভেক্টর , যা প্রথমে iid বিটা-বিতরণকৃত ড্রগুলি উপর নির্ভর করে প্রাপ্ত করে 1 এর সমষ্টি হতে হবে , দেখুন [fn1]। এবং যেহেতু আমি ডেটাতে আমার অজানাটিকে সম্পর্কে অবহিত করতে চাই , তাই আমি [fn1] অনুসরণ করি এবং ধরে নিই ।z iC a t e g o r i c a l ( p ) p S t i c k ( α ) α N D P p N D P α α α U n i f o r m ( 0.3 , 100 )z- রআমিz- রআমি~সিএকটিটিRআমিএকটি(পি)pStick(α)αএনডিপিপিএনডিপিααα~ইউএনআমিRমি(0.3,100)

এটি প্রতিটি ডেটা নমুনার ক্লাস্টার আইডি কীভাবে উত্পন্ন হয় তা নির্দিষ্ট করে। প্রত্যেকটি ক্লাস্টার একটি সংশ্লিষ্ট গড় এবং মানক চ্যুতির রয়েছে এবং । তারপরে, এবং । μ z- র আমি σ z- র আমি μ z- র আমি ~ এন ( μ = 0 , σ = 50 ) σ z- র আমি ~ ইউ এন আমি মি ( 0 , 100 )এনডিপিμz- রআমিσz- রআমিμz- রআমি~এন(μ=0,σ=50)σz- রআমি~ইউএনআমিRমি(0,100)

(আমি এর আগে [fn1] অজান্তেই অনুসরণ করেছিলাম এবং on , অর্থাৎ, সাথে একটি থেকে একটি অঙ্কন করছি a ফিক্সড-প্যারামিটার স্বাভাবিক বিতরণ এবং একটি ইউনিফর্ম থেকে। তবে https://stats.stackexchange.com/a/71932/31187 প্রতি আমার ডেটা এই ধরণের শ্রেণিবিন্যাসকে সমর্থন করে না)) μ z iN ( μ 0 , σ 0 ) μ 0 σ 0μz- রআমিμz- রআমি~এন(μ0,σ0)μ0σ0

সংক্ষেপে, আমার মডেলটি হ'ল:

iYআমি~এন(μz- রআমি,σz- রআমি) যেখানে 1 থেকে 50 (ডেটা নমুনার সংখ্যা ।আমি

N D P - 1 = 49 p S t i c k ( α ) N D P α U n i f o r m ( 0.3 , 100 )z- রআমি~সিএকটিটিRআমিএকটি(পি) এবং 0 এবং মধ্যে মান গ্রহণ করতে পারে ; , একটি দীর্ঘ ভেক্টর; এবং , একটি স্কেলার। (আমি এখন আগে ডিরিচ্লেটের কাটা দৈর্ঘ্যের সমান উপাত্তের নমুনাগুলির সংখ্যার তুলনায় কিছুটা আক্ষেপ করছি, তবে আমি আশা করি এটি পরিষ্কার হয়ে গেছে।)এনডিপি-1=49পি~এসটিআমি(α)এনডিপিα~ইউএনআমিRমি(0.3,100)

σ z iU n i f o r m ( 0 , 100 ) N D P N D Pμz- রআমি~এন(μ=0,σ=50) এবং । এইগুলির অর্থ এবং মানক বিচ্যুতিগুলির 's রয়েছে ( সম্ভাব্য ক্লাস্টারের প্রত্যেকটির জন্য একটি ))σz- রআমি~ইউএনআমিRমি(0,100)এনডিপিএনডিপি

গ্রাফিকাল মডেলটি এখানে: নামগুলি ভেরিয়েবলের নাম, নীচের কোড বিভাগটি দেখুন।

চিত্রলেখ

সমস্যা বিবৃতি

বেশ কয়েকটি টুইট এবং ব্যর্থ স্থির হওয়া সত্ত্বেও, শিখানো প্যারামিটারগুলি ডেটা উত্পন্ন করে এমন সত্যের মানগুলির সাথে মোটেই সাদৃশ্যপূর্ণ নয়।

বর্তমানে, আমি বেশিরভাগ এলোমেলো ভেরিয়েবলগুলি স্থির মানগুলিতে আরম্ভ করছি। গড় এবং স্ট্যান্ডার্ড বিচ্যুতি ভেরিয়েবলগুলি তাদের প্রত্যাশিত মানগুলিতে আরম্ভ করা হয় (অর্থাত্ 0 সাধারণের জন্য, ইউনিফর্মগুলির জন্য তাদের সমর্থনের মাঝামাঝি)। আমি সমস্ত ক্লাস্টার আইডি 0 তে শুরু করি এবং আমি কনসেন্টেশন প্যারামিটার । α = 5z- রআমিα=5

এই জাতীয় সূচনাগুলির সাথে, 100'000 এমসিসিএম পুনরাবৃত্তি কেবল একটি দ্বিতীয় ক্লাস্টারটি খুঁজে পাবে না। এর প্রথম উপাদানটি 1 এর কাছাকাছি, এবং of এর প্রায় সমস্ত অঙ্কন সমস্ত ডেটা নমুনার জন্য একই, প্রায় 3.5 এর মতো around আমি প্রথম বিশ ডেটা নমুনার জন্য এখানে প্রত্যেক 100 তম ড্র দেখাই, অর্থাত, জন্য :μ z- র আমি আমি μ z- র আমি আমি = 1 , , 20পিμz- রআমিআমিμz- রআমিআমি=1,,20

শূন্য-সূচনা ক্লাস্টার আইডি সহ

প্রথম দশটি ডেটা নমুনা এক মোডের এবং বাকী অন্যটি থেকে এসেছে তা মনে করে, উপরের ফলাফলটি স্পষ্টতই এটি ক্যাপচারে ব্যর্থ হয়েছিল।

যদি আমি ক্লাস্টার আইডিগুলি এলোমেলোভাবে শুরু করার অনুমতি দিই, তবে আমি একাধিক ক্লাস্টার পাই তবে ক্লাস্টারটির অর্থ সমস্ত একই 3.5 স্তরের আশেপাশে ঘুরে বেড়ানো:

র্যান্ডম-ইনিশিয়ালাইজড ক্লাস্টার আইডি সহ

এটি আমার পরামর্শ দেয় যে এটি এমসিএমসির ক্ষেত্রে স্বাভাবিক সমস্যা, এটি যেখান থেকে রয়েছে তার থেকে পূর্ববর্তী কোনও অন্য মোডে পৌঁছতে পারে না: মনে রাখবেন যে ক্লাস্টার আইডি কেবলমাত্র তাদের নয়, ক্লাস্টার আইডিগুলির সূচনা পরিবর্তন করার পরে এই বিভিন্ন ফলাফল ঘটে happen আর কিছু.z- রআমি

আমি কি কোনও মডেলিংয়ের ভুল করছি? অনুরূপ প্রশ্ন: https://stackoverflow.com/q/19114790/500207 একটি ডিরিচলেট বিতরণ ব্যবহার করতে এবং একটি 3-উপাদান গাউসিয়ান মিশ্রণটি ফিট করতে চায় এবং কিছুটা অনুরূপ সমস্যার মধ্যে চলছে। আমার কি এই ধরণের ক্লাস্টারিংয়ের জন্য একটি সম্পূর্ণ সংযোগকারী মডেল স্থাপন এবং গীবস স্যাম্পলিং ব্যবহার করা উচিত? (আমি একটি নির্দিষ্ট ঘনত্ব ich ব্যবহার না করে প্যারাম্যাট্রিক ডিরিচলেট বিতরণ মামলার জন্য গিবস স্যাম্পলারটি বাস্তবায়িত করেছি এবং এটি ভালভাবে কাজ করেছে, তাই পিএমসি কমপক্ষে সেই সমস্যাটি সহজেই সমাধান করতে সক্ষম হবে বলে আশা করি।)α

পরিশিষ্ট: কোড

import pymc
import numpy as np

### Data generation

# Means and standard deviations of the Gaussian mixture model. The inference
# engine doesn't know these.
means = [0, 4.0]
stdevs = [1, 2.0]

# Rather than randomizing between the mixands, just specify how many
# to draw from each. This makes it really easy to know which draws
# came from which mixands (the first N1 from the first, the rest from
# the secon). The inference engine doesn't know about N1 and N2, only Ndata
N1 = 10
N2 = 40
Ndata = N1+N2

# Seed both the data generator RNG  as well as the global seed (for PyMC)
RNGseed = 123
np.random.seed(RNGseed)

def generate_data(draws_per_mixand):
    """Draw samples from a two-element Gaussian mixture reproducibly.

    Input sequence indicates the number of draws from each mixand. Resulting
    draws are concantenated together.

    """
    RNG = np.random.RandomState(RNGseed)
    values = np.hstack([RNG.normal(means[i], stdevs[i], ndraws)
                        for (i,ndraws) in enumerate(draws_per_mixand)])
    return values

observed_data = generate_data([N1, N2])


### PyMC model setup, step 1: the Dirichlet process and stick-breaking

# Truncation level of the Dirichlet process
Ndp = 50

# "alpha", or the concentration of the stick-breaking construction. There exists
# some interplay between choice of Ndp and concentration: a high concentration
# value implies many clusters, in turn implying low values for the leading
# elements of the probability mass function built by stick-breaking. Since we
# enforce the resulting PMF to sum to one, the probability of the last cluster
# might be then be set artificially high. This may interfere with the Dirichlet
# process' clustering ability.
#
# An example: if Ndp===4, and concentration high enough, stick-breaking might
# yield p===[.1, .1, .1, .7], which isn't desireable. You want to initialize
# concentration so that the last element of the PMF is less than or not much
# more than the a few of the previous ones. So you'd want to initialize at a
# smaller concentration to get something more like, say, p===[.35, .3, .25, .1].
#
# A thought: maybe we can avoid this interdependency by, rather than setting the
# final value of the PMF vector, scale the entire PMF vector to sum to 1? FIXME,
# TODO.
concinit = 5.0
conclo = 0.3
conchi = 100.0
concentration = pymc.Uniform('concentration', lower=conclo, upper=conchi,
                             value=concinit)

# The stick-breaking construction: requires Ndp beta draws dependent on the
# concentration, before the probability mass function is actually constructed.
betas = pymc.Beta('betas', alpha=1, beta=concentration, size=Ndp)

@pymc.deterministic
def pmf(betas=betas):
    "Construct a probability mass function for the truncated Dirichlet process"
    # prod = lambda x: np.exp(np.sum(np.log(x))) # Slow but more accurate(?)
    prod = np.prod
    value = map(lambda (i,u): u * prod(1.0 - betas[:i]), enumerate(betas))
    value[-1] = 1.0 - sum(value[:-1]) # force value to sum to 1
    return value

# The cluster assignments: each data point's estimated cluster ID.
# Remove idinit to allow clusterid to be randomly initialized:
idinit = np.zeros(Ndata, dtype=np.int64)
clusterid = pymc.Categorical('clusterid', p=pmf, size=Ndata, value=idinit)

### PyMC model setup, step 2: clusters' means and stdevs

# An individual data sample is drawn from a Gaussian, whose mean and stdev is
# what we're seeking.

# Hyperprior on clusters' means
mu0_mean = 0.0
mu0_std = 50.0
mu0_prec = 1.0/mu0_std**2
mu0_init = np.zeros(Ndp)
clustermean = pymc.Normal('clustermean', mu=mu0_mean, tau=mu0_prec,
                          size=Ndp, value=mu0_init)

# The cluster's stdev
clustersig_lo = 0.0
clustersig_hi = 100.0
clustersig_init = 50*np.ones(Ndp) # Again, don't really care?
clustersig = pymc.Uniform('clustersig', lower=clustersig_lo,
                          upper=clustersig_hi, size=Ndp, value=clustersig_init)
clusterprec = clustersig ** -2

### PyMC model setup, step 3: data

# So now we have means and stdevs for each of the Ndp clusters. We also have a
# probability mass function over all clusters, and a cluster ID indicating which
# cluster a particular data sample belongs to.

@pymc.deterministic
def data_cluster_mean(clusterid=clusterid, clustermean=clustermean):
    "Converts Ndata cluster IDs and Ndp cluster means to Ndata means."
    return clustermean[clusterid]

@pymc.deterministic
def data_cluster_prec(clusterid=clusterid, clusterprec=clusterprec):
    "Converts Ndata cluster IDs and Ndp cluster precs to Ndata precs."
    return clusterprec[clusterid]

data = pymc.Normal('data', mu=data_cluster_mean, tau=data_cluster_prec,
                   observed=True, value=observed_data)

তথ্যসূত্র

  1. fn1: http://nbviewer.ipython.org/urls/raw.github.com/fonnesbeck/Bios366/master/notebooks/Sication5_2-Dirichlet-Processes.ipynb
  2. এফএন 2: http://blog.echen.me/2012/03/20/infinite- মিশ্রণ- মডেলস- ননপ্যারামেট্রিক- বেয়েস- এবং- ডিরিচলেট- প্রসেস /
  3. fn3: http://scikit-learn.org/stable/auto_ex بیلস / মিশ্রণ / প্লট_জিএমএইচটিএমএল#example- মিশ্রণ-plot-gmm-py

উপাদানগুলির বৈকল্পিকগুলির জন্য আপনার পূর্ববর্তীটি ইউনিফর্ম (0,100) যা আপনাকে বড় সমস্যার কারণ হতে পারে। এই পূর্বের ভরগুলির মাত্র 2 %ই 1 এবং 2 এর প্রকৃত বৈকল্পিকগুলি কভার করে this এই পূর্ববর্তীটির অধীনে আপনার উপাদানগুলির প্রত্যাশিত প্রকরণটি 50 টি, এটি এমন একটি বিস্তৃত গাউসিয়ান যে এটি সহজেই কোনও একক উপাদান দিয়ে আপনার ডেটার জন্য অ্যাকাউন্ট করতে পারে।
জেরাদ

আপনি কি প্র্যাকিবিলিস্টিক প্রোগ্রামিং এবং বেইসিয়ান স্ট্যাটিস্টিক্স ফর হ্যাকার বইয়ের এই অধ্যায়টি পড়েছেন ? এটির একটি উদাহরণ রয়েছে যা আপনাকে সাহায্য করতে পারে!
টিম

এটি একটি উত্তরের জন্য কিছুটা সংক্ষিপ্ত বলে মনে হচ্ছে। এটি আরও একটি মন্তব্য বলে মনে হচ্ছে। কমপক্ষে আপনি ওপি পড়তে কী কী তথ্য পাবেন তা বাহ্যরেখা দিতে পারেন?
গ্লেন_বি -রিনস্টেট মনিকা

@ টিমরিচ হ্যাঁ আমি এটি পড়েছি, এবং স্নাতক স্কুলে ক্লাস নিয়েছি, এবং শিল্পে প্রয়োগিত পরিসংখ্যান করে কাজ করেছি;) এটি একটি পিএমসি-নির্দিষ্ট প্রশ্ন।
আহমেদ ফসিহ

1
μজেডআমি~এন(μ0,σ0)μ0,σ0

উত্তর:


4

আমি নিশ্চিত নই যে এই প্রশ্নটি এখন আর কেউ দেখছে কিনা তবে আমি মানক বিচ্যুতির আগে ফ্ল্যাটের বিষয়ে গাইয়ের অন্তর্দৃষ্টি অন্তর্ভুক্ত করার সময় টমস গিবস স্যাম্পলিং পরামর্শটি পরীক্ষা করার জন্য আপনার প্রশ্নটি rjags এ রেখেছি।

এই খেলনা সমস্যাটি কঠিন হতে পারে কারণ 10 এবং এমনকি 40 টি ডাটা পয়েন্ট কোনও তথ্যবহুল পূর্ববর্তী ব্যতীত প্রকরণটি অনুমান করার জন্য যথেষ্ট নয়। বর্তমান পূর্ববর্তী σziσUniform (0,100) তথ্যবহুল নয়। এটি ব্যাখ্যা করতে পারে কেন μzi এর প্রায় সমস্ত অঙ্কন দুটি বিতরণের প্রত্যাশিত গড়। যদি এটি আপনার প্রশ্নকে খুব বেশি পরিবর্তন না করে আমি যথাক্রমে 100 এবং 400 ডেটা পয়েন্ট ব্যবহার করব।

আমি সরাসরি আমার কোডটিতে স্টিক ব্রেকিং প্রক্রিয়াটি ব্যবহার করি নি। উইকিপিডিয়া dirichlet প্রক্রিয়ার জন্য পৃষ্ঠা আমার মনে পি ~ এর Dir (ক / ট) ঠিক হতে না পারে।

অবশেষে এটি কেবলমাত্র একটি আধা-প্যারামেট্রিক বাস্তবায়ন কারণ এটি এখনও বেশ কয়েকটি ক্লাস্টার কে নেয়। আমি জানি না কীভাবে rjags এ অসীম মিশ্রণের মডেল বানাতে হয়।

মার্কভ চেইন মিউ ক্লাস্টার 1

মার্কভ চেইন মিউ ক্লাস্টার 2

library("rjags")

set1 <- rnorm(100, 0, 1)
set2 <- rnorm(400, 4, 1)
data <- c(set1, set2)

plot(data, type='l', col='blue', lwd=3,
     main='gaussian mixture model data',
     xlab='data sample #', ylab='data value')
points(data, col='blue')

cpd.model.str <- 'model {
  a ~ dunif(0.3, 100)
  for (i in 1:k){
    alpha[i] <- a/k
    mu[i] ~ dnorm(0.0, 0.001)
    sigma[i] ~ dunif(0, 100)
  }
  p[1:k] ~ ddirich(alpha[1:k])
  for (i in 1:n){
    z[i] ~ dcat(p)
    y[i] ~ dnorm(mu[z[i]], pow(sigma[z[i]], -2))
  }
}' 


cpd.model <- jags.model(textConnection(cpd.model.str),
                        data=list(y=data,
                                  n=length(data),
                                  k=5))
update(cpd.model, 1000)
chain <- coda.samples(model = cpd.model, n.iter = 1000,
                      variable.names = c('p', 'mu', 'sigma'))
rchain <- as.matrix(chain)
apply(rchain, 2, mean)

1
কেকেαআমি=একটি/কে500কে=25JAGSJAGSপি

1

আপনি যে দুর্বল মিশ্রণটি দেখছেন সম্ভবত পিআইএমসি যেভাবে নমুনা আঁকেন সে কারণে এটি সম্ভবত। হিসাবে ব্যাখ্যা করা অধ্যায় 5.8.1 PyMC নথিপত্রের, একটি বিন্যাস ভেরিয়েবলের সব উপাদান একসঙ্গে আপডেট করা হয়। আপনার ক্ষেত্রে, এর অর্থ এটি clustermeanএক ধাপে পুরো অ্যারে আপডেট করার চেষ্টা করবে এবং অনুরূপভাবে clusterid। পিএমসি গিবস স্যাম্পলিং করে না; এটি মেট্রোপলিস হয় যেখানে প্রস্তাবটি কিছু সাধারণ হিউরিস্টিক্স দ্বারা বেছে নেওয়া হয়েছে। এটি সম্পূর্ণ অ্যারের জন্য ভাল মানের প্রস্তাব দেওয়া অসম্ভব করে তোলে।


আপনি যখনই বলেছিলেন, "এটি এক ধাপে পুরো অ্যারে আপডেট করার চেষ্টা করবে", আমি গেটস বনাম মহানগর (এই উদাহরণে) এর অপূর্ণতাগুলি বুঝতে পেরেছি। স্ট্যান বা জ্যাজিএস সম্পর্কে এমন কোনও বিশেষ কি আছে যা তাদের আরও ভাল করতে দেয়? উভয় ক্ষেত্রেই, আমি পিএমসিতে গিবস বাস্তবায়নে কিছু সময় ব্যয় করতে যাচ্ছি। ধন্যবাদ! (লাইটস্পিড দেওয়ার পর থেকে আমি আপনার কাজের অনুরাগী হয়েছি, তাই দ্বিগুণ-ধন্যবাদ!)
আহমেদ ফসিহ

1
স্ট্যান বিচ্ছিন্ন ভেরিয়েবলগুলি পরিচালনা করে না, তবে জাগস চেষ্টা করার মতো।
টম মিনকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.