5

離散確率変数 x とそれに関連するデータが X(n) にある場合、matlab で確率質量関数 pmf(X) を決定するにはどうすればよいでしょうか?

4

6 に答える 6

5

これは、少なくとも 8 つの異なる方法で行うことができます (そのうちのいくつかは、他のソリューションで既に言及されています)。

離散確率変数からのサンプルがあるとします。

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);      %#'

のエントリに対応する 1 から始まるインデックスを取得するために GRP2IDX が使用されたことに注意してください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
于 2010-11-04T01:46:53.983 に答える
1

さらに別のオプションを追加するには(必要なことを実行するために使用できる関数が多数あるため)、離散値が0より大きい整数の場合、関数ACCUMARRAYを使用してpmfを簡単に計算できます。

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
于 2010-11-01T16:12:06.857 に答える
1

次の MATLABドキュメンテーションからの抜粋は、ヒストグラムをプロットする方法を示しています。離散確率関数の場合、度数分布はヒストグラムと同じになる場合があります。

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

すべてのビンのすべての要素の合計を計算します。すべてのビンを合計で割って、pdf を取得します。すべての要素を追加して、pdf をテストします。結果は 1 でなければなりません。

私の発言が正しいことを願っています。お久しぶりです...

于 2010-11-01T12:30:54.570 に答える
1

別の配列を格納する必要がないように、関数ハンドルだけを作成してみてください。

pmf = @(x) arrayfun(@(y) nnz(DATA==y)/length(DATA),x);
于 2010-11-01T15:59:22.740 に答える
1

この機能はどうですか?

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

これはあなたの意見で正しいですか?

于 2010-11-01T13:07:12.130 に答える
0

あなたがする必要があることを正しく理解していれば、連続値ではなく離散値であることを除いて、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も指摘しているように、これは原則として頻度ヒストグラムです

于 2010-11-01T12:33:46.363 に答える