将几个变量阈值化为 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_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
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])
我在 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_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
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])