1

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

  1. 该声明

s=x(:,1) > 0.5;

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

有没有其他方式来象征和划分?

4

2 回答 2

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

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

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

这将使 s 取 0 到 19 之间的值。如果您的数据尚未在该区间内,您显然可以先重新调整它:

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

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

于 2012-07-11T19:49:05.013 回答
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。然后,您可以应用答案中的任何方法来确定哪些元素属于哪个类别。

于 2012-07-11T19:39:02.477 回答