我有一个我自己无法解决的问题,搜索结果也不是我想要的(除非我错过了解释一切的问题,在这种情况下我道歉!)
我的系统可以处于三种状态S = S1, S2 and S3
。它可以在一定概率下在这三种状态之间切换:从S1
到S2
P1
,S2
到S1
P2
,{ {1}} S2
S3
和P3
S3
S2
P4
。但是,为了简单起见,我将从P1 = P2 = P3 = P4 = P
开始。
现在我有一个数据集,一个1000000值的数组,对应于这些特定的状态。因此S1
表示数组中的1
,S2
表示0.5
,S3
表示0
。
所以现在我想知道我的数组中连续1,或0.5或0的平均'字符串'有多长。因为它只是一个二项式过程,(改变p = P的状态),我原则上应该能够从这个信息中提取P.虽然我不知道怎么回事,因为我不能简单地将“字符串长度”分布到二项分布中,我可以吗?
在任何情况下,一个好的起点是能够提取连续相等值的“字符串”的长度。有人能指出我从哪里开始的方向吗?
编辑:
我看到fitdist
可以使'字符串长度'符合二项分布。所以现在我只想找到如何创建一个包含连续1,0.5和0的'字符串长度'的数组。
编辑2:似乎Series of consecutive numbers (different lengths)可能正在做我想要的。我会快速浏览一下,如果有的话我会删除帖子。我道歉!
答案 0 :(得分:3)
你可以做一些像使用衍生物一样简单的事情。这将确定何时序列发生变化。衍生工具返回0以外的其他任何地方,这表示有变化。找出这些变化发生的索引,然后您可以找到这些索引之间的差异以获得长度。这是一些示例代码
% all just setup
a = 0*ones(1,randi([1,10]));
b = 1*ones(1,randi([1,10]));
c = 0.5*ones(1,randi([1,10]));
vals = {a,b,c};
len = 1e6;
temp = cell(1,len);
for i = 1:len
index = randi([1,3]);
temp{i} = vals{index};
end
mat = cell2mat(temp);
% code that actually does what you need
mat = [mat,nan];
seqLengths = diff([0,find(diff(mat) ~= 0)]);
请注意,nan
会添加到矢量的末尾,以便您在结尾处获得相同长度的矢量。使用nan
是因为假设您的向量将包含所有有效数字,否则,nan
可以替换为与矩阵中的最后一个值不匹配的任何值。
答案 1 :(得分:0)
如果它确实是二项式过程,则无需计算平均长度。计算每个州的转变:
y=sparse(x(1:end-1),x(2:end),ones(numel(x)-1,1))
并将其除以转换总数:
z=y./sum(sum(y))