سؤال

إذا كان لدينا متغير عشوائي منفصل x والبيانات المتعلقة به في x (n) ، كيف في MATLAB يمكننا تحديد وظيفة كتلة الاحتمال PMF (x)؟

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

المحلول

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

قل أن لدينا عينة من متغير عشوائي منفصل:

X = randi([-9 9], [100 1]);

النظر في هذه الحلول المكافئة (لاحظ أنني لا أفترض أي شيء عن نطاق القيم المحتملة ، فقط أنها أعداد صحيحة):

[V,~,labels] = grp2idx(X);
mx = max(V);

%# TABULATE (internally uses HIST)
t = tabulate(V);
pmf1 = t(:, 3) ./ 100;

%# HIST (internally uses HISTC)
pmf2 = hist(V, mx)' ./ numel(V);                      %#'

%# HISTC
pmf3 = histc(V, 1:mx) ./ numel(V);

%# ACCUMARRAY
pmf4 = accumarray(V, 1) ./ numel(V);

%# SORT/FIND/DIFF
pmf5 = diff( find( [diff([0;sort(V)]) ; 1] ) ) ./ numel(V);

%# SORT/UNIQUE/DIFF
[~,idx] = unique( sort(V) );
pmf6 = diff([0;idx]) ./ numel(V);

%# ARRAYFUN
pmf7 = arrayfun(@(x) sum(V==x), 1:mx)' ./ numel(V);   %#'

%# BSXFUN
pmf8 = sum( bsxfun(@eq, V, 1:mx) )' ./ numel(V);      %#'

لاحظ أنه تم استخدام GRP2IDX للحصول على مؤشرات تبدأ من 1 pmf (يتم إعطاء التعيين بواسطة labels). نتيجة ما سبق هو:

>> [labels pmf]
ans =
           -9         0.03
           -8         0.07
           -7         0.04
           -6         0.07
           -5         0.03
           -4         0.06
           -3         0.05
           -2         0.05
           -1         0.06
            0         0.05
            1         0.04
            2         0.07
            3         0.03
            4         0.09
            5         0.08
            6         0.02
            7         0.03
            8         0.08
            9         0.05

نصائح أخرى

المقتطف التالي من Matlab توثيق يوضح كيفية رسم رسم بياني. للحصول على وظيفة احتمالية منفصلة ، التوزيع بتكرار قد تكون متطابقة مع الرسم البياني.

x = -4:0.1:4;
y = randn(10000,1);
n = hist(y,x);
pmf = n/sum(n);
plot(pmf,'o');

حساب مجموع جميع العناصر في كل صندوق. قسّم جميع الصناديق على المبلغ للحصول على PDF الخاص بك. اختبر ملف PDF الخاص بك عن طريق إضافة جميع العناصر. يجب أن تكون النتيجة واحدة.

آمل أن أكون على صواب مع تصريحاتي. حان وقت طويل منذ ...

ماذا عن هذه الوظيفة؟

function Y = pmf(X)
A=tabulate(X)
A(:,3)=A(:,3)/100
Y=A(:,3)'

هل هذا صحيح في رأيك؟

ربما حاول صنع مقبض وظيفة فقط حتى لا تحتاج إلى تخزين مجموعة أخرى:

pmf = @(x) arrayfun(@(y) nnz(DATA==y)/length(DATA),x);

لإضافة خيار آخر (نظرًا لوجود عدد من الوظائف المتاحة للقيام بما تريد) ، يمكنك بسهولة حساب PMF باستخدام الوظيفة Accumarray إذا كانت قيمك المنفصلة أكثر من 0:

pmf = accumarray(X(:),1)./numel(X);

هذا مثال:

>> X = [1 1 1 1 2 2 2 3 3 4];          %# A sample distribution of values
>> pmf = accumarray(X(:),1)./numel(X)  %# Compute the probability mass function

pmf =

    0.4000      %# 1 occurs 40% of the time
    0.3000      %# 2 occurs 30% of the time
    0.2000      %# 3 occurs 20% of the time
    0.1000      %# 4 occurs 10% of the time

إذا فهمت بشكل صحيح ما عليك فعله هو تقدير PDF ، إلا أنه ليس قيمًا مستمرة ولكن منفصلة.

احسب حوادث القيم المختلفة في x (n) وتقسيم على n. لتوضيح ما أقوله ، واسمحوا لي أن أقدم مثالاً. افترض أن لديك 10 ملاحظات:

X = [1 1 2 3 1 9 12 3 1 2]

ثم يبدو PMF الخاص بك هكذا:

pmf(X) = [0.4 0.2 0.2 0 0 0 0 0 0.1 0 0 0.1]

تعديل: هذا من حيث المبدأ رسم بياني للتردد ، كما أشار Zellus أيضًا

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