衡量数组在数据中的分布情况

时间:2014-10-10 06:39:12

标签: matlab statistics

我有一个0和1的数组,我需要知道数据是在列中展开还是集中在块中。

例如:

如果我有数组x并且它具有以下值:

第1列值:1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1

第2列值:1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1

如果我们计算出的数量,我们可以知道它的数量是相同的,但与第1列相比,第2列的分布更均匀,分布在第2列。

如果传播是好的,那我的分数会给我一个很高的价值,如果传播很差,我会给它一个很低的价值...任何想法?

数据样本:

1 0 0 0 5 0 -2 -3  0 0 1
1 0 0 0 0 0  0  0  0 0 1
2 0 0 0 0 0  0  3 -3 1 0
1 2 3 0 5 0  2 13  4 5 1
1 0 0 0 0 0 -4 34  0 0 1

2 个答案:

答案 0 :(得分:2)

我认为您需要一段时间才能找到"传播"在本地,否则sample 1(在问题中命名为Column 1)在第2和第3个之间也会显示为差异。

因此,遵循该理论并假设input_array为输入数组,您可以尝试这种方法 -

intv = 10; %// Interval
diff_loc = diff(find(input_array))
spread_factor = sum(diff_loc(diff_loc<=intv)) %// desired output/score

对于sample 1spread_factor提供4,而sample 2则为23


您可以采用的另一种理论是,如果您假设一个间隔使得连续的间距必须大于或等于该间隔。这个理论会引导我们这样的代码 -

intv = 3; %// Interval
diff_loc = diff(find(input_array))
spread_factor = sum(diff_loc>=intv)

采用这种新方法 - 对于sample 1spread_factor1sample 25

答案 1 :(得分:2)

我认为你要测量的是0之间1 s的数量分布的变化,即:

f = @(x)std(diff(find(x)))

所以对你来说数据:

a = [1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1]
b = [1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1]

f(a)
    = 8.0498

f(b)
    = 2.0736

但我仍然认为你基本上是在尝试衡量系统的混乱,这是我想象的熵措施,但我不知道如何

请注意,如果&#34;传播&#34;这会给出值。如果它是坏的(即与你的要求相反)是好的和高价值。

此外,如果你想要每列,那么它会变得有点复杂:

f = @(x)arrayfun(@(y)std(diff(find(x(:,y)))), 1:size(x,2))
data = [a', b'];
f(data)

警告:此方法几乎不考虑尾随和引导0。我不知道这是不是问题。但基本上f([0; 0; 0; 1; 1; 1; 0; 0; 0])返回0,其中f([1; 0; 0; 1; 0; 1; 0; 0; 0])返回一个正数,表明(错误地)第一个案例更为分散。一种可能的解决方法可能是在矩阵中添加一行并附加一行......