有一个100个数据点的时间序列(比方说)。我希望为每个唯一数据点分配0 1 2的符号。问题是我已经尝试了但是因为无论我指定符号而被卡住了,程序刚刚超过1和0的概率。以下是问题
s = x(:,1)> 0.5;
输出二进制结果0,1。那么,我如何创建多个分区/离散化,以便除了0之外,还可以分配其他数字。
还有其他方法可以进行符号化和分区吗?
答案 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。然后,您可以应用答案中的任何方法来确定哪些元素属于哪个类别。