我有一个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
答案 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 1
,spread_factor
提供4
,而sample 2
则为23
。
您可以采用的另一种理论是,如果您假设一个间隔使得连续的间距必须大于或等于该间隔。这个理论会引导我们这样的代码 -
intv = 3; %// Interval
diff_loc = diff(find(input_array))
spread_factor = sum(diff_loc>=intv)
采用这种新方法 - 对于sample 1
,spread_factor
为1
,sample 2
为5
。
答案 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])
返回一个正数,表明(错误地)第一个案例更为分散。一种可能的解决方法可能是在矩阵中添加一行并附加一行......