Порог нескольких переменных в двоичный категориальный код в Python - PullRequest
0 голосов
/ 02 октября 2018

У меня есть 3 переменные в python (возраст, пол, раса), и я хочу создать из них уникальный категориальный двоичный код.Во-первых, возраст - это целое число, и я хочу установить его для каждого десятилетия 10–20, 20–30, 30–40 и т. Д., Значения пола 2 и раса содержит 4 значения.Как я могу вернуть полный категориальный код из трех начальных переменных?

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Вот метод, возвращающий 7-битный код с первыми 4 битами для возрастной категории, следующими 2 для расы и 1 для пола.

4 бита для возраста накладывает ограничение на общее количествоТолько 16 возрастных скобок, что разумно, поскольку охватывает возрастной диапазон 0-159.

4-битный возрастной код представляет собой просто 4-битное представление целого числа age//10, которое эффективно дискретизирует значение возраста в диапазонах: 0-9, 10-19, ..., 150-159

Коды для расы и пола просто жестко закодированы с использованием race_dict и gender_dict

def get_code(age, race, gender): #returns fixed size 7 bit code
    race_dict = {'African':'00','Hispanic':'01','European':'10','Cantonese':'11'} 
    gender_dict = {'Male':'0','Female':'1'}

    age_code = '{0:b}'.format(age//10).zfill(4)
    race_code = race_dict[race]
    gender_code = gender_dict[gender]

    return  age_code + race_code + gender_code

Ввод: возраст: 25, раса: «латиноамериканец», пол: «женский»

7-битный код: 0010011

Если вы хотите, чтобы этот код былцелочисленное значение в диапазоне 0-127 для числовых целей. Для этого можно использовать int(code_str, 2).

РЕДАКТИРОВАТЬ:

, чтобы получить массив из массива кода, используйтеnp_code_arr = np.fromstring(' '.join(list(code_str)), dtype = int, sep = ' ')

0 голосов
/ 02 октября 2018

Мой ответ здесь:

Бытие возраст a , пол g и раса r ,

code = np.array([int(i) for i in "{0:04b}{1:01b}{2:02b}".format(a//10,g,r)])

для возраста = 58, пола = 1 и расы = 3, результат будет:

array([0, 1, 0, 1, 1, 1, 1])
0 голосов
/ 02 октября 2018

Вы можете иметь n+1+4 размерную векторную кодировку.Если вам необходим двоичный код, это может быть одним из способов сделать это.

Первые n записи будут кодировать десятилетие.1 если оно принадлежит тому десятилетию, 0 иначе.Следующая запись (n+1)th может быть 1, если мужчина, и 0, если женщина.Аналогично для расы: 1, если она относится к этой категории, 0, остальное.

Допустим, у вас есть до десятилетий до 100. Для 98 лет, мужчина, белый, вы могли бы сделать что-то вроде [0 0 0 0 0 0 0 0 1 1 0 1 0 0 0] при условии, что вы начинаете с 10 года до 100.

import numpy as np

def encodeAge(i, n):
    ageCode=np.zeros(n)
    ageCode[i]=1
    return ageCode

n=10 # number of decades
dict_race={'w':[1,0,0,0],'b':[0,1,0,0],'a':[0,0,1,0],'l':[0,0,0,1]} # white, black, asian, latino
dict_age={i:encodeAge(i, n) for i in range(n)}
dict_gender={'m':[1],'f':[0]}

def encodeAll(age, gender, race):
    # encode age
    code=[]
    code=np.concatenate([code, dict_age[age//10]])
    # encode gender
    code=np.concatenate([code, dict_gender[gender]])
    # encode race
    code=np.concatenate([code, dict_race[race]])
    return code

например, encodeAll(12,'m','w') вернет array([0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0.])

Это немного более длинная кодировка, чем предложенные другие кодировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...