将几个变量阈值化为 python 中的二进制分类代码

Threshold several variables into a binary categorical code in python

我在 python 中有 3 个变量(年龄、性别、种族),我想从中创建一个唯一的分类二进制代码。首先,年龄是一个整数,我想为每个十年 10-20、20-30、30-40 等设定一个阈值,性别 2 个值,种族包含 4 个值。我怎样才能 return 三个初始变量的完整分类代码?

你可以有一个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') 会 return array([0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0.])

此编码比建议的其他编码稍长。

这是一个返回 7 位代码的方法,其中前 4 位用于年龄段,接下来的 2 位用于种族,1 位用于性别。

年龄的4位限制了总共只能有16个年龄段,这是合理的,因为它涵盖了0-159的年龄段。

4 位年龄代码只是整数 age//10 的 4 位表示,它有效地将年龄值离散化为范围:0-9、10-19、...、150-159

种族和性别的代码只是使用 race_dictgender_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

Input: age:25, race: 'Hispanic', gender: 'Female'

7-bit code: 0010011

如果出于数字目的,您希望此代码是 0-127 之间的整数值,您可以使用 int(code_str, 2) 来实现。

编辑:

要从代码字符串中获取一个 numpy 数组,请使用 np_code_arr = np.fromstring(' '.join(list(code_str)), dtype = int, sep = ' ')

我的回答是:

年龄 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])