我有一个序列数据集,值在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个不同的班级呢?
有什么简单的方法可以根据数据的最大点对数据进行分类?
答案 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]