কাটা কাটানো বহুজাতিক বিতরণ কীভাবে নমুনা করবেন?


9

কাটা কাটা বহুদিনের বিতরণের নমুনার জন্য আমার একটি অ্যালগরিদম দরকার। এটাই,

x1Zp1x1pkxkx1!xk!

যেখানে একটি নরমালাইজেশন ধ্রুবক, এর পজেটিভ উপাদান রয়েছে, এবং । আমি কেবলমাত্র the of এর মানগুলি ।Zxkxi=nxaxb

আমি কীভাবে এই ছাঁটাই বহুজাতিক বিতরণ নমুনা করতে পারি?

দ্রষ্টব্য: একটি অ-কাটা না হওয়া বহু-জাতীয় বিতরণের নমুনার জন্য অ্যালগরিদমের জন্য উইকিপিডিয়া দেখুন । এই অ্যালগরিদমকে কাটা কাটা বিতরণের সাথে কীভাবে মানিয়ে নেওয়ার কোনও উপায় আছে?

অভিন্ন সংস্করণ: সমস্যার একটি সহজ সংস্করণ সমস্ত সমান, । আপনি যদি কমপক্ষে এই ক্ষেত্রে ছাঁটাই হওয়া বিতরণটি নমুনা করতে একটি অ্যালগরিদম ডিজাইন করতে পারেন তবে দয়া করে এটি পোস্ট করুন। যদিও সাধারণ উত্তর না, এটি এই মুহুর্তে আমাকে অন্যান্য ব্যবহারিক সমস্যাগুলি সমাধান করতে সহায়তা করবে।pipi=1/k

উত্তর:


9

যদি আমি আপনি সঠিকভাবে বুঝতে, আপনি নমুনা করতে চান সম্ভাব্যতা সঙ্গে MULTINOMIAL বন্টন থেকে মানগুলি যেমন যে , তবে আপনি বন্টন ছেঁটে ফেলা হতে চান তাই সবার জন্য ।x1,,xkp1,,pkixi=naixibixi

আমি তিনটি সমাধান দেখতে পাচ্ছি (না কেটে নেওয়া মামলার মতো মার্জিত নয়):

  1. প্রত্যাখ্যান গ্রহণ. কাটা না হওয়া বহু-জাতীয় থেকে নমুনা, যদি কাটা সীমানার সাথে মানানসই নমুনা গ্রহণ করুন, অন্যথায় প্রত্যাখ্যান করুন এবং প্রক্রিয়াটি পুনরাবৃত্তি করুন। এটি দ্রুত, তবে খুব অদক্ষ হতে পারে।
rtrmnomReject <- function(R, n, p, a, b) {
  x <- t(rmultinom(R, n, p))
  x[apply(a <= x & x <= b, 1, all) & rowSums(x) == n, ]
}
  1. সরাসরি অনুকরণ। ডেটা উত্পন্ন প্রক্রিয়া সদৃশ ফ্যাশনে নমুনা, যেমন একটি এলোমেলো কলস থেকে একক মার্বেলের নমুনা এবং আপনি মোট মার্বেল নমুনা না করা পর্যন্ত এই প্রক্রিয়াটি পুনরাবৃত্তি করুন , তবে আপনি প্রদত্ত থেকে মোট মার্বেলের মোট সংখ্যা স্থাপন করার পরে ( ইতিমধ্যে সমান ) এরপরে এ জাতীয় কলঙ্ক থেকে অঙ্কন বন্ধ করুন। আমি এটি নীচের স্ক্রিপ্টে প্রয়োগ করেছি।nxibi
# single draw from truncated multinomial with a,b truncation points
rtrmnomDirect <- function(n, p, a, b) {
  k <- length(p)

  repeat {
    pp <- p         # reset pp
    x <- numeric(k) # reset x
    repeat {
      if (sum(x<b) == 1) { # if only a single category is left
        x[x<b] <- x[x<b] + n-sum(x) # fill this category with reminder
        break
      }
      i <- sample.int(k, 1, prob = pp) # sample x[i]
      x[i] <- x[i] + 1  
      if (x[i] == b[i]) pp[i] <- 0 # if x[i] is filled do
      # not sample from it
      if (sum(x) == n) break    # if we picked n, stop
    }
    if (all(x >= a)) break # if all x>=a sample is valid
    # otherwise reject
  }

  return(x)
}
  1. মহানগর অ্যালগরিদম। শেষ অবধি, তৃতীয় এবং সর্বাধিক দক্ষ পদ্ধতিটি হ'ল মেট্রোপলিস অ্যালগরিদম ব্যবহার করা । অ্যালগরিদম প্রথম নমুনা আঁকার জন্য সরাসরি সিমুলেশন (তবে আলাদাভাবে আরম্ভ করা যেতে পারে) ব্যবহার করে সূচনা করা হয় । নিম্নলিখিত পদক্ষেপগুলিতে পুনরাবৃত্তভাবে: প্রস্তাবিত মান সম্ভাব্যতা সহ হিসাবে গৃহীত হবে , অন্যথায় মান গ্রহণ করা হবে এটি স্থান, যেখানে। একটি প্রস্তাব আমি ফাংশন ব্যবহৃত যে লাগে মান এবং এলোমেলোভাবে 0 থেকে ফ্লিপ ক্ষেত্রে এবং অন্য বিভাগের প্যাচসমূহ এটা সংখ্যা।X1y=q(Xi1)Xif(y)/f(Xi1)Xi1f(x)ipixi/xi!qXi1step
# draw R values
# 'step' parameter defines magnitude of jumps
# for Meteropolis algorithm
# 'init' is a vector of values to start with
rtrmnomMetrop <- function(R, n, p, a, b,
                          step = 1,
                          init = rtrmnomDirect(n, p, a, b)) {

  k <- length(p)
  if (length(a)==1) a <- rep(a, k)
  if (length(b)==1) b <- rep(b, k)

  # approximate target log-density
  lp <- log(p)
  lf <- function(x) {
    if(any(x < a) || any(x > b) || sum(x) != n)
      return(-Inf)
    sum(lp*x - lfactorial(x))
  }

  step <- max(2, step+1)

  # proposal function
  q <- function(x) {
    idx <- sample.int(k, 2)
    u <- sample.int(step, 1)-1
    x[idx] <- x[idx] + c(-u, u)
    x
  }

  tmp <- init
  x <- matrix(nrow = R, ncol = k)
  ar <- 0

  for (i in 1:R) {
    proposal <- q(tmp)
    prob <- exp(lf(proposal) - lf(tmp))
    if (runif(1) < prob) {
      tmp <- proposal
      ar <- ar + 1
    }
    x[i,] <- tmp
  }

  structure(x, acceptance.rate = ar/R, step = step-1)
}

অ্যালগরিদম শুরু হয় এবং তারপরে বিতরণের বিভিন্ন অঞ্চল ঘুরে বেড়ায়। পূর্ববর্তীগুলির তুলনায় এটি স্পষ্টতই দ্রুত, তবে আপনার মনে রাখতে হবে যে আপনি যদি এটি সংখ্যার ছোট ছোট মামলার নমুনা ব্যবহার করতে চান তবে আপনি একে অপরের নিকটে থাকা ড্রগুলি দিয়ে শেষ করতে পারেন। আরেকটি সমস্যা হ'ল আপনাকে আকার সম্পর্কে সিদ্ধান্ত নিতে হবে , যেমন অ্যালগোরিদমকে কত বড় লাফ দেওয়া উচিত - খুব ছোট ধীরে ধীরে ধীরে ধীরে চলতে পারে, খুব বড় পরিমাণে অনেকগুলি অবৈধ প্রস্তাবনা তৈরি এবং তা প্রত্যাখ্যান করতে পারে। আপনি নীচে এর ব্যবহারের উদাহরণ দেখতে পারেন। প্লটগুলিতে আপনি দেখতে পাবেন: প্রথম সারিতে প্রান্তিক ঘনত্ব, দ্বিতীয় সারিতে ট্র্যাসপ্লট এবং পরের জোড়গুলির জন্য পরবর্তী জাম্প প্রদর্শনকারী প্লটগুলি।X1step

n <- 500
a <- 50
b <- 125
p <- c(1,5,2,4,3)/15
k <- length(p)
x <- rtrmnomMetrop(1e4, n, p, a, b, step = 15)

cmb <- combn(1:k, 2)

par.def <- par(mfrow=c(4,5), mar = c(2,2,2,2))
for (i in 1:k)
  hist(x[,i], main = paste0("X",i))
for (i in 1:k)
  plot(x[,i], main = paste0("X",i), type = "l", col = "lightblue")
for (i in 1:ncol(cmb))
  plot(jitter(x[,cmb[1,i]]), jitter(x[,cmb[2,i]]),
       type = "l", main = paste(paste0("X", cmb[,i]), collapse = ":"),
       col = "gray")
par(par.def)

এখানে চিত্র বর্ণনা লিখুন

এই বিতরণ থেকে স্যাম্পলিংয়ের সমস্যাটি হ'ল সাধারণভাবে একটি খুব অদক্ষ্য নমুনা কৌশল বর্ণনা করে । কল্পনা করুন যে এবং , এবং এর এর কাছাকাছি, আপনি বিভিন্ন সম্ভাবনার সাথে বিভাগগুলিতে নমুনা করতে চান তবে একই রকম প্রত্যাশা করুন শেষে ফ্রিকোয়েন্সি। চূড়ান্ত ক্ষেত্রে, দ্বি- বিতরণ কল্পনা করুন যেখানে এবং ,p1pka1==akb1=bkaibip1p2a1a2b1b2, সেক্ষেত্রে আপনি খুব বিরল ঘটনা ঘটে যাওয়ার প্রত্যাশা করেছেন (এ জাতীয় বিতরণের বাস্তব জীবনের উদাহরণ এমন গবেষক হবে যিনি নমুনাটি পুনরায় পুনরুদ্ধার করেন যতক্ষণ না তিনি তার অনুমানের সাথে সামঞ্জস্যপূর্ণ নমুনা খুঁজে পান, তাই এটি এলোমেলো নমুনার চেয়ে প্রতারণার সাথে আরও কিছু করার আছে) ।

যদি আপনি যেখানে আপনি নমুনা Rukhin (2007, 2008) যেমন সংজ্ঞায়িত বন্টন অনেক কম সমস্যাযুক্ত নমুনা আনুপাতিকভাবে প্রতিটি বিভাগের ক্ষেত্রে, অর্থাত 'র।npipi


রুখিন, আ.লীগ (২০০ 2007) চিকিত্সা বরাদ্দের সমস্যাগুলিতে সাধারণ অর্ডার পরিসংখ্যান এবং জ্যামিতিক এলোমেলো ভেরিয়েবলের যোগফল। পরিসংখ্যান এবং সম্ভাবনার অক্ষর, 77 (12), 1312-1321।

রুখিন, আ.লীগ (২০০৮) ভারসাম্য বন্টন সমস্যার নিয়ম বন্ধ: সঠিক এবং অ্যাসিম্পটোটিক বিতরণ। সিকোয়েনাল বিশ্লেষণ, 27 (3), 277-292।


অবৈধ নমুনাগুলি প্রত্যাখ্যান করা খুব ধীর হতে পারে। , একটি অনুবাদ করা সম্ভবত সহজ । এইভাবে আপনার কেবল উদ্বিগ্ন , উদ্বিগ্ন। তারপর আপনি যেখানে আপনি নমুনা প্রত্যাখ্যান লাইন অপসারণ করতে পারেন যদি লঙ্ঘন করা হয় (এক মান কল্পনা করা করতে পারেন যেখানে এই প্রত্যাখ্যানের খুব অদক্ষ হবে)yi=xiaim=niaiyibiaixaa
becko

@ বেকো যদি আপনি আমার বর্ণিত ব্যক্তির সাথে এই জাতীয় পদ্ধতির তুলনা করেন তবে আপনি দেখতে পাবেন যে তারা বিভিন্ন সমাধান দেয়।
টিম

বুঝতে পারছি না তারা কীভাবে আলাদা হতে পারে? আমি যা করেছি তা হ'ল ভেরিয়েবলের পরিবর্তন।
বেকো

@ বেকো আপনার প্রারম্ভিক বিন্দু এটি x[i] >= a। কল্পনা করুন যে আপনি মাথাগুলির উচ্চতা = 0.9 সহ একটি পক্ষপাতদুষ্ট মুদ্রা ছুঁড়েছেন। আপনি কমপক্ষে 10 টি মাথা এবং 10 টি লেজ না পাওয়া পর্যন্ত আপনি মুদ্রাটি টস করুন। স্টপিং পয়েন্টে আপনার লেজগুলির তুলনায় গড়ে আরও অনেক বেশি মাথা থাকে। শুরু করার x[1] = ... = x[k] = aঅর্থ হ'ল আপনি একে একে এড়িয়ে গেছেন যে প্রত্যেকটির প্রারম্ভিক পয়েন্টগুলি x[i]ভিন্ন কারণে p[i]
টিম

আমি আপনার পয়েন্ট দেখুন. আপনার সমাধান সম্পর্কে আমি কেবল পছন্দ করি না এটি হ'ল প্যারামিটারগুলির নির্দিষ্ট পছন্দগুলির জন্য এটি খুব অদক্ষ হতে পারে বলে আমি মনে করি।
বেকো

1

টিমের আর কোডটি পাইথনে অনুবাদ করার চেষ্টা করার জন্য আমার চেষ্টা এখানে। যেহেতু আমি এই সমস্যাটি বুঝতে কিছুটা সময় ব্যয় করেছি এবং পাইথনের অ্যালগরিদমগুলিকে কোড করেছি, লোকেরা আগ্রহী হলে আমি এখানে এগুলি ভাগ করে নেওয়ার জন্য ভেবেছিলাম।

  1. অ্যালগোরিদম স্বীকার করুন :
def sample_truncated_multinomial_accept_reject(k, pVec, a, b):
    x = list(np.random.multinomial(k, pVec, size=1)[0])
    h = [x[i] >= a[i] and x[i] <= b[i] for i in range(len(x))]
    while sum(h) < len(h):
        x = list(np.random.multinomial(k, pVec, size=1)[0])
        h = [x[i] >= a[i] and x[i] <= b[i] for i in range(len(x))]
    return x
  1. সরাসরি অনুকরণ
def truncated_multinomial_direct_sampling_from_urn(k, pVec, a, b):
    n = len(pVec)
    while True:
        pp = pVec 
        x = [0 for _ in range(n)] 
        while True:
            if sum([x[h] < b[h] for h in range(n)])==1:
                indx = [h for h in range(n) if x[h] < b[h]][0]
                x[indx] = k - sum(x)
                break
            i = np.random.choice(n, 1, p=pp)[0]
            x[i] += 1
            if x[i] == b[i]:
                pp = [pp[j]/(1-pp[i]) for j in range(n)]
                pp[i] = 0 
            if sum(x) == k:
                break  
        if sum([x[h] < a[h] for h in range(n)]) == 0:
            break 
    return x 
  1. মহানগর অ্যালগরিদম
def compute_log_function(x, pVec, a, b):
    x_less_a = sum([x[i] < a[i] for i in range(len(pVec))])
    x_more_a = sum([x[i] > b[i] for i in range(len(pVec))])
    if x_less_a or x_more_a or sum(x) != k:
        return float("-inf")
    return np.sum(np.log(pVec)*x - np.array([math.lgamma(h+1) for h in x]))
def sampling_distribution(original, pVec, a, b, step):
    x = copy.deepcopy(original) 
    idx = np.random.choice(len(x), 2, replace=False)
    u = np.random.choice(step, 1)[0]
    x[idx[0]] -= u
    x[idx[1]] += u
    x_less_a = sum([x[i] < a[i] for i in range(len(pVec))])
    x_more_a = sum([x[i] > b[i] for i in range(len(pVec))])
    while x_less_a or x_more_a or sum(x) != k:
        x = copy.deepcopy(original)  
        idx = np.random.choice(len(x), 2, replace=False)
        u = np.random.choice(step, 1)[0]
        x[idx[0]] -= u
        x[idx[1]] += u
        x_less_a = sum([x[i] < a[i] for i in range(len(pVec))])
        x_more_a = sum([x[i] > b[i] for i in range(len(pVec))])
    return x 
def sample_truncated_multinomial_metropolis_hasting(k, pVec, a, b, iters, step=1):
    tmp=sample_truncated_multinomial_accept_reject(k, pVec, a, b)[0]
    step = max(2, step)
    for i in range(iters):
        proposal = sampling_distribution(tmp, pVec, a, b, step)
        if compute_log_function(proposal, pVec, a, b) == float("-inf"):
            continue             
        prob = np.exp(np.array(compute_log_function(proposal, pVec, a, b)) -\
                      np.array(compute_log_function(tmp, pVec, a, b)))
        if np.random.uniform() < prob:
            tmp = proposal 
        step -= 1 
    return tmp

এই কোডটির সম্পূর্ণ প্রয়োগের জন্য দয়া করে আমার গিথুব সংগ্রহস্থলটি দেখুন

https://github.com/mohsenkarimzadeh/sampling

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