时间序列的抽样和数字化

时间:2012-07-11 19:10:40

标签: matlab

有一个100个数据点的时间序列(比方说)。我希望为每个唯一数据点分配0 1 2的符号。问题是我已经尝试了但是因为无论我指定符号而被卡住了,程序刚刚超过1和0的概率。以下是问题

  1. 声明
  2.   

    s = x(:,1)> 0.5;

    输出二进制结果0,1。那么,我如何创建多个分区/离散化,以便除了0之外,还可以分配其他数字。

      

    还有其他方法可以进行符号化和分区吗?

2 个答案:

答案 0 :(得分:2)

这样做的显而易见的方法是:

s=zeroes(size(x,1), 1);
s(x>=BP(1) & x<BP(2)) = 1;
s(x>=BP(2)) = 2;
etc.

其中BP是断点列表(即分区的边缘)。这将使得BP(1)= 0之下的所有东西,BP(1)和BP(2)之间的东西= 1,BP(2)之上的条目= 2;

我想这样的事也应该有效:

s = zeroes(size(x,1), 1];
for ii=1:length(BP)
   idx = x > BP(ii);
   s(idx) = s(idx) + 1;
end

如果您的数据和/或容器大小存在一些限制,那么您有更多选择。您可能会考虑乘法,除法和舍入/截断的巧妙组合。例如,假设您的数据全部在[0,1]范围内,并且您希望将其分成20个均匀分布的区间。然后,您可以执行以下操作:

s = floor(x(:,1) .* 20);

这将使得取值介于0和19之间。如果您的数据尚未在该间隔中,您可以显然首先重新缩放它:

data = x(:,1);
data = data - min(data);
data = data ./ (max(data) + eps(max(data))); 
s = floor(data .* 20);

请注意,此处第3行中的归一化因子不是max(数据),而是matlab可以表示的下一个最大数。我们这样做是为了有20个团体而不是21个。

答案 1 :(得分:1)

语句x(:,1) > 0.5;正在创建一个逻辑索引:true (1)满足条件,false (0)不满足条件。您可以使用此逻辑索引从满足条件的原始向量中获取值。

logical_index = x(:,1) > 0.5;
s = x(logical_index,1); %# select the subset of the matrix given by x > 0.5

s现在包含x中大于0.5的值。

除此之外,我无法理解你想要做什么。一个小的示例数据集会有所帮助(如果您仍需要帮助,那就是)。

修改:要查找适合以此方式划分设置的值,请​​查看prctile。然后,您可以应用答案中的任何方法来确定哪些元素属于哪个类别。