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

发布于 2024-11-27 16:25:04 字数 376 浏览 0 评论 0原文

我有一个向量 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 循环?

I am having a vector y which may have the following form:

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

And I want to attach a probability to each element within y as it would've been generated by a random variable. In this case, the element 1 would have the probability 6/14, the element 2 would have the probability 4/14, the element 3 the value 2/14 and the elements 4 and 5 the value 1/14.

And basically, the result should look like:

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

Is there a way of doing this without any for or while loops?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

蝶舞 2024-12-04 16:25:04

输入向量中的唯一元素可以使用 UNIQUE 函数确定。然后,您可以使用 ARRAYFUN匿名函数,用于检查输入向量中每个唯一元素的数量:

>> 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

The unique elements in your input vector can be determined using the UNIQUE function. You can then get the desired output using ARRAYFUN and an anonymous function that checks the number of each unique element in your input vector:

>> 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
蓝海似她心 2024-12-04 16:25:04

创建一个直方图,其中包含与最小值和最小值之间的差异一样多的箱。最大元素(加一以获得总范围),然后通过除以原始向量中的元素数量来标准化。

像这样的东西:

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)

Create a histogram with as many bins as the difference between your min & max element (plus one to get total range), then normalize by dividing by the number of elements in you original vector.

Something like this:

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)

[Edit] To answer your updated question: use y to select the indices from p, like this:

prob_y = p(y)
走过海棠暮 2024-12-04 16:25:04

这是使用 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 开始的整数的情况。

Here is an example using 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)

The probabilities:

>> [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

You can see a summary of occurrences as:

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

Note that I am using GRP2IDX to handle cases like 1.3 or integers not starting at 1.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文