سؤال

أنا أعمل على نظام المحاكاة.وسوف يكون قريبا البيانات التجريبية (رسوم بيانية) عن العالم الحقيقي توزيع القيم لعدة محاكاة المدخلات.

عندما محاكاة يعمل ، أود أن تكون قادرة على إنتاج القيم العشوائية التي تتناسب مع قياس التوزيع.أنا أفضل أن تفعل هذا دون تخزين الأصلي رسوم بيانية.ما هي بعض الطرق الجيدة

  1. رسم بياني إلى مجموعة من المعايير التي تمثل التوزيع ؟
  2. توليد القيم التي تستند إلى تلك المعايير في وقت التشغيل?

تحرير:إدخال البيانات هي الحدث فترات لعدة أنواع مختلفة من الأحداث.أتوقع أن أنواع مختلفة مختلفة توزيع المهام.

هل كانت مفيدة؟

المحلول

على الأقل اثنين من الخيارات:

  1. دمج البياني عكس عدديا.
  2. رفض

الرقمية التكامل

من حساب في الفيزياء الحديثة وليام ر.جيبس:

يمكن للمرء دائما عدديا دمج [وظيفة] وعكس [cdf] ولكن هذا غالبا ما تكون غير مرضية جدا خاصة إذا كان pdf يتغير بسرعة.

كنت حرفيا بناء الجدول الذي يترجم مجموعة [0-1) في مناسبة يتراوح في الهدف التوزيع.ثم رمي المعتادة الخاصة بك (جودة عالية) PRNG وترجمة مع الجدول.فمن مرهقة ، ولكن واضحة ، قابلة للتطبيق ، تماما العامة.

الرفض:

تطبيع الهدف الرسم البياني ، ثم

  1. رمي النرد على اختيار موقف (x) على مجموعة عشوائيا.
  2. رمي مرة أخرى ، حدد هذه النقطة إذا الجديدة رقم عشوائي أقل من تطبيع الرسم البياني في بن.وإلا غوتو (1).

مرة أخرى البسيط ولكن من الواضح والعمل.يمكن أن تكون بطيئة للتوزيع مع الكثير من احتمال ضعيف جدا (قمم مع ذيول طويلة).


مع كل من هذه الأساليب ، يمكن تقريب البيانات مع piecewise متعدد الحدود يناسب أو المفاتيح لتوليد منحنى سلس إذا كان الخطوة-وظيفة الرسم البياني هو المطلوب---ولكن ترك ذلك في وقت لاحق كما أنه قد يكون من السابق لأوانه الأمثل.


أفضل الأساليب قد توجد حالات خاصة.

كل هذا هو المعيار جدا و يجب أن تظهر في أي تحليل رقمي كتاب لو كنت أكثر التفاصيل اللازمة.

نصائح أخرى

مزيد من المعلومات حول المشكلة قد تكون مفيدة.على سبيل المثال, أي نوع من القيم هي رسوم بيانية ؟ هم القاطع (مثل الألوان والحروف) أو المستمر (على سبيل المثال ، heights, الوقت) ؟

إذا كانت رسوم بيانية أكثر من البيانات الفئوية أعتقد أنه قد يكون من الصعب parameterise التوزيعات إلا إذا كان هناك العديد من الارتباطات بين الفئات.

إذا كانت رسوم بيانية أكثر المستمر البيانات قد حاول أن تناسب التوزيع باستخدام خليط من Gaussians.هذا هو, في محاولة لاحتواء الرسم البياني باستخدام $\sum_{i=1}^n w_i N(m_i,v_i)$ حيث m_i و v_i هي يعني الفرق.ثم عندما تريد توليد بيانات العينة الأولى أنا من 1..n مع احتمال يتناسب مع الأوزان w_i ثم عينة x ~ n(m_i,v_i) كما كنت من أي جاوس.

وفي كلتا الحالتين, قد ترغب في قراءة المزيد عن خليط نماذج.

لذلك يبدو أن ما أريد من أجل توليد معين probablity والتوزيع Quantile وظيفة, الذي هو معكوس دالة التوزيع التراكمي, كما @dmckee يقول.

يصبح السؤال:ما هي أفضل طريقة لتوليد وتخزين quantile وظيفة وصف معين المستمر الرسم البياني?لدي شعور الجواب سوف تعتمد إلى حد كبير على شكل مدخلات - إذا كان يتبع أي نوع من نمط ينبغي أن يكون هناك التبسيط على الحالة العامة.أنا تحديث هنا كما ذهبت.


تحرير:

لقد تحدثت هذا الأسبوع التي ذكرتني هذه المشكلة.إذا كنت التخلي عن وصف الرسم البياني كمعادلة فقط مخزن الطاولة ، يمكنني أن أفعل في تشكيلة O(1) الوقت ؟ اتضح يمكنك دون أي خسارة في الدقة ، على حساب O(N lgN) وقت البناء.

إنشاء مجموعة من العناصر N.موحد اختيار عشوائي في مجموعة سوف تجد عنصر مع probablilty 1/N.لكل عنصر, تخزين جزء من يضرب على هذا البند يجب أن يكون في الواقع تحديد مؤشر آخر البند الذي سيتم تحديد إذا كان هذا هو واحد لا.

مرجحة أخذ عينات عشوائية ، ج التنفيذ:

//data structure
typedef struct wrs_data {
  double share; 
  int pair;
  int idx;
} wrs_t;


//sort helper
int wrs_sharecmp(const void* a, const void* b) {
  double delta = ((wrs_t*)a)->share - ((wrs_t*)b)->share;
  return (delta<0) ? -1 : (delta>0);
}


//Initialize the data structure
wrs_t* wrs_create(int* weights, size_t N) {
  wrs_t* data = malloc(sizeof(wrs_t));
  double sum = 0;
  int i;
  for (i=0;i<N;i++) { sum+=weights[i]; }
  for (i=0;i<N;i++) {
    //what percent of the ideal distribution is in this bucket?
    data[i].share = weights[i]/(sum/N); 
    data[i].pair = N;
    data[i].idx = i;
  }
  //sort ascending by size
  qsort(data,N, sizeof(wrs_t),wrs_sharecmp);

  int j=N-1; //the biggest bucket
  for (i=0;i<j;i++) {
    int check = i;
    double excess = 1.0 - data[check].share;
    while (excess>0 && i<j) {
      //If this bucket has less samples than a flat distribution,
      //it will be hit more frequently than it should be.  
      //So send excess hits to a bucket which has too many samples.
      data[check].pair=j; 
      // Account for the fact that the paired bucket will be hit more often,
      data[j].share -= excess;  
      excess = 1.0 - data[j].share;
      // If paired bucket now has excess hits, send to new largest bucket at j-1
      if (excess >= 0) { check=j--;} 
    }
  }
  return data;
}


int wrs_pick(wrs_t* collection, size_t N)
//O(1) weighted random sampling (after preparing the collection).
//Randomly select a bucket, and a percentage.
//If the percentage is greater than that bucket's share of hits, 
// use it's paired bucket.
{
  int idx = rand_in_range(0,N);
  double pct = rand_percent();
  if (pct > collection[idx].share) { idx = collection[idx].pair; }
  return collection[idx].idx;
} 

تحرير 2:بعد قليل من البحث وجدت حتى أنه من الممكن القيام البناء في O(N) مرة.مع الحرص على تتبع أنت لا تحتاج إلى فرز مجموعة من إيجاد الكبيرة والصغيرة صناديق. تحديث التنفيذ هنا

إذا كنت بحاجة إلى سحب عدد كبير من العينات مع مرجح توزيع نقاط منفصلة ، ثم ننظر في جوابا على سؤال مشابه.

ومع ذلك, إذا كنت بحاجة إلى التقريبية بعض عشوائي مستمر وظيفة باستخدام الرسم البياني ، ثم أفضل رهان هو على الارجح dmckee رقمية التكامل الإجابة.بدلا من ذلك, يمكنك استخدام اسم مستعار ، وتخزين نقطة إلى اليسار ، واختيار عدد موحد بين نقطتين.

للاختيار من بينها الرسم البياني (الأصلي أو خفض) ، ووكر مستعار أسلوب هو سريعة وبسيطة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top