【问题标题】:Determining probability mass function of random variable确定随机变量的概率质量函数
【发布时间】:2011-05-03 09:01:03
【问题描述】:

如果我们有一个离散随机变量 x 和与它相关的数据在 X(n) 中,我们如何在 matlab 中确定概率质量函数 pmf(X)?

【问题讨论】:

标签: matlab probability discrete-space


【解决方案1】:

MATLAB documentation 的以下摘录显示了如何绘制直方图。对于离散概率函数,频率分布可能与直方图相同。

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

计算每个 bin 中所有元素的总和。将所有垃圾箱除以总和以获得您的 pdf。通过添加所有元素来测试您的 pdf。结果必须是一。

希望我的陈述是正确的。好久不见……

【讨论】:

    【解决方案2】:

    如果我理解正确,您需要做的是估计 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 也指出的那样

    【讨论】:

      【解决方案3】:

      这个功能怎么样?

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

      您认为这是正确的吗?

      【讨论】:

      • 不知道那个功能。我认为它可以完成你的工作。在 MATLAB 中通常有几种方法可以完成工作。
      • 一个警告...您需要统计工具箱才能使用TABULATE
      【解决方案4】:

      也许可以尝试只制作一个函数句柄,这样您就不需要存储另一个数组:

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

      【讨论】:

        【解决方案5】:

        要添加另一个选项(因为有许多函数可用于执行您想要的操作),如果您的离散值是大于 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
        

        【讨论】:

        • 我会改用:pmf = accumarray(X(:),1); pmf = pmf./sum(pmf);(数值更稳定:一个除法而不是多个分数相加)
        • @Amro:非常正确。这将减少潜在浮点错误的累积。答案已更新。
        • 您还应该注意,如果可能值的范围不是从1 开始,您将在开始时得到很多额外的零。尝试使用X=X+100; 运行上述程序(调用 GRP2IDX 可以解决此问题)@SkypeMeSM 的 TABULATE 解决方案也是如此。
        【解决方案6】:

        您可以通过至少八种不同的方式来做到这一点(其中一些已经在其他解决方案中提到过)。

        假设我们有一个来自离散随机变量的样本:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-24
          • 2015-08-11
          • 1970-01-01
          • 1970-01-01
          • 2021-01-10
          • 1970-01-01
          • 2020-07-02
          • 1970-01-01
          相关资源
          最近更新 更多