用适当的范围对序列数据进行分类

时间:2019-06-29 22:25:58

标签: python sequence

我有一个序列数据集,值在0-200(最小-最大值)之间变化。我正在尝试使用适当的范围和整数值(例如0-1-2)对它们进行分类。例如:

y_test = [0 if (i <= (max(y_test)/5)) \
          else 1 if (i > (max(y_test)/5)) & (i <= (2*max(y_test)/5)) \
          else 2 if (i > (2*max(y_test)/5)) & (i <= (3*max(y_test)/5)) \
          else 3 if (i > (3*max(y_test)/5)) & (i <= (4*max(y_test)/5)) \
          else 4 if (i > (4*max(y_test)/5)) & (i <= (5*max(y_test)/5)) \
          else 5 for i in y_test]

很快,我想做的是:

class_number = 6

if y_test(i) is between 0 - (max(y_test)/class_number) --> 0
                between (max(y_test)/class_number   - (2*max(y_test)/class_number) --> 1
                between (2*max(y_test)/class_number - (3*max(y_test)/class_number) --> 2
.
.
.

我可以将上面的代码用于6个不同的类。但是对于20或100个不同的班级呢?

有什么简单的方法可以根据数据的最大点对数据进行分类?

2 个答案:

答案 0 :(得分:2)

也许尝试使用面向数学的方法: y_test = [int(i * 6 / (max(y_test)+1)) for i in y_test]

想法是将输入比例缩放为0-5,然后向下舍入。

编辑:为了提高速度,您可以预先计算max(y_test)(感谢@JohnColeman)

max_val = max(y_test) + 1
y_test = [int(i * 6 / max_val) for i in y_test]

答案 1 :(得分:0)

您实际上是在将binning data分成等宽的条带。如果要将数据分成宽度相等的k个bin,则bin的宽度应为w = (max - min)/k。数据点x的bin编号应为满足以下条件的数字i

min + i*w <= x < min + (i+1)*w

因此i = floor((x-min)/w。关于此方法的一个复杂事实是,最大值本身的数据点将是k而不是k-1。可以针对以下情况进行明确纠正:

import math

def bin_nums(data,k):
    a = min(data)
    b = max(data)
    if a == b:
        return [0]*len(data)
    else:
        m = k/(b-a) #reciprocal of (b-a)/k
        return [math.floor(m*(x-a)) if x < b else k-1 for x in data]