Классификация данных последовательности с правильными диапазонами - PullRequest
0 голосов
/ 30 июня 2019

У меня есть набор данных последовательности, и значения меняются от 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 ]

2 голосов
/ 30 июня 2019

Может быть, попытаться использовать более математически ориентированный метод: 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]
0 голосов
/ 30 июня 2019

Вы действительно говорите о данных биннинга в бинах равной ширины.Если вы хотите разбить данные на k бинов одинаковой ширины, ширина бинов должна быть w = (max - min)/k.Номер ячейки для точки данных x должен быть числом 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...