Matlab - 计算向量中每个元素的概率

时间:2011-08-03 21:40:39

标签: matlab

我有一个向量y,可能有以下形式:

y = [1 1 1 1 2 2 2 2 1 1 3 3 4 5]

我想为y中的每个元素附加一个概率,因为它将由随机变量生成。在这种情况下,元素1的概率为6/14,元素2的概率为4/14,元素3的值为2/14,元素4和5的值为1/14。

基本上,结果应如下所示:

prob_y = 1/14 * [6 6 6 6 4 4 4 4 6 6 2 2 1 1]

有没有办法在没有任何forwhile循环的情况下执行此操作?

3 个答案:

答案 0 :(得分:5)

可以使用UNIQUE函数确定输入向量中的唯一元素。然后,您可以使用ARRAYFUNanonymous function获取所需的输出,该{{3}}检查输入向量中每个唯一元素的数量:

>> y = [1 1 1 1 2 2 2 2 1 1 3 3 4 5];
>> prob_y = arrayfun(@(x)length(find(y==x)), unique(y)) / length(y)

prob_y =

    0.4286    0.2857    0.1429    0.0714    0.0714

答案 1 :(得分:2)

创建一个直方图,其中包含最小和最小值之间的差异。最大元素(加1得到总范围),然后除以原始向量中的元素数进行标准化。

这样的事情:

y = [1 1 1 1 2 2 2 2 1 1 3 3 4 5]
p = hist(y, max(y) - min(y) + 1) / length(y)

[编辑] 要回答您更新的问题:使用yp中选择索引,如下所示:

prob_y = p(y)

答案 2 :(得分:2)

以下是使用ACCUMARRAY的示例:

y = [1.3 1 1 1 2 2 2 2 1 1 3 3 4 5];

[g,~,gl] = grp2idx(y);
count = accumarray(g,1);
p = count(g) ./ numel(g)

概率:

>> [y(:) p]
ans =
          1.3     0.071429
            1      0.35714
            1      0.35714
            1      0.35714
            2      0.28571
            2      0.28571
            2      0.28571
            2      0.28571
            1      0.35714
            1      0.35714
            3      0.14286
            3      0.14286
            4     0.071429
            5     0.071429

您可以看到事件摘要为:

>> [gl count]
ans =
            1            5
          1.3            1
            2            4
            3            2
            4            1
            5            1

请注意,我使用GRP2IDX来处理1.3等案例或不以1开头的整数。