【问题标题】:How to calculate the transition probability to one bin in Matlab如何在Matlab中计算到一个bin的转移概率
【发布时间】:2014-03-18 04:49:07
【问题描述】:

我无法确定在 MatLab 中转换到 bin 的概率。

我有两个很长的 x,y 坐标序列:

-73.9613487200000   -46.5918895000000
-74.3247836300000   -46.3739157100000
-74.1687114000000   -45.9507475300000
-74.0608490800000   -45.7491954000000
-74.1341642000000   -45.0915414400000
-73.8393784300000   -44.6707425700000
-73.8145227800000   -44.4084257500000
-74.5435599500000   -43.7561156500000
-74.2601082600000   -43.3275746200000
-74.5393861400000   -42.6844697600000
-74.1746965800000   -42.4732404300000
-73.8951934100000   -42.1678074600000
-73.7448163600000   -41.7981857300000
-73.4435398100000   -41.8730435200000
....

目标是确定从任何先前的 bin 转换到 bin 的概率(例如,x>90 x90 y

定义 bin 大小并对数据进行排序很容易

xbins = -100:10:100;
ybins = -100:10:100;
xNumBins = numel(xbins); yNumBins = numel(ybins);

但大多数情况下我可能在索引方面遇到问题。

感谢您的任何帮助/建议。

【问题讨论】:

    标签: matlab probability


    【解决方案1】:

    因此,首先您需要将data 矩阵转换为分箱数据矩阵B(或者基本上只是分箱所有数据)。你可以这样做:

    bins = -100:10:100;
    B = arrayfun(@(x)find(x<=bins,1,'first')-1,data);
    

    现在您需要计算转换并创建一个网格。您可以通过 T = accumarray(B,1) 简单地做到这一点,但为了理解这里是一个 for 循环:

    n = numel(bins)-1;
    T = zeros(n);
    for k = 1:size(B,1)
        T(B(k,1),B(k,2)) = T(B(k,1),B(k,2)) + 1;
    end
    

    然后将这种联合直方图转换为概率矩阵

    T = T/sum(T(:))
    

    示例:

    a = rand(10,2)
    
    a =
    
        0.0534    0.1632
        0.8664    0.4751
        0.3270    0.6687
        0.2016    0.4313
        0.8158    0.6065
        0.8493    0.4217
        0.3997    0.3960
        0.5845    0.1684
        0.5499    0.3672
        0.5886    0.4045
    

    bins = 0:0.2:1;
    

    计算:

    B = arrayfun(@(x)find(x<=bins,1,'first')-1,data);
    T = accumarray(B,1,[numel(bins)-1, numel(bins)-1])/size(B,1);
    
    T =
    
        0.1000         0         0         0         0
             0    0.1000    0.1000    0.1000         0
        0.1000    0.1000    0.1000         0         0
             0         0         0         0         0
             0         0    0.2000    0.1000         0
    

    这是正确的。例如,您可以看到 20% 的数据从 bin 5 转换到 bin 3,这对应于上面我的 a 矩阵中的第 2 行和第 6 行。

    【讨论】:

    • 非常感谢,丹。我只能用 Excel 以一种冗长而复杂的方式做到这一点。这快了 1000 倍。我认为 ACCUMARRAY 是最好的路线,但一直失败。甚至没有想过要尝试循环。
    • @sndsnd 原来使用accumarray 再简单不过了!请参阅我的编辑。然而,for 循环可能非常好,甚至可能更好,对于新版本的 Matlab,如果不进行基准测试很难判断,但只要您预先分配,这些天循环通常非常快。
    • 显然我不知道如何使用accumarray。这很简单。使用我的 100000 行数据集尝试这两种方法,速度似乎没有明显差异。也许循环对我的学习更好。谢谢你,丹。
    猜你喜欢
    • 2019-11-04
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多