独热编码(One-Hot Eocode)

一.概述

  • One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
  • One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。
  • 独热编码(哑变量 dummy variable)是因为大部分算法是基于向量空间中的度量来进行计算的,为了使非偏序关系的变量取值不具有偏序性,并且到圆点是等距的。使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。就可以跟对连续型特征的归一化方法一样,对每一维特征进行归一化。比如归一化到[-1,1]或归一化到均值为0,方差为1。 
     

二.tensorflow实现

#假设现在我们要对5张手写数字进行分类,这些数字的标签labels的范围是0~9,形成(5, )的行向量,为####
#[5,4,3,8,7]。

labels = [5,4,3,8,7]
 
NUM_CLASSES = 10
 
batch_size = tf.size(labels)
 
#labels表示图片的标签,5张图片有5个标签。Batch_size=5
 
labels = tf.expand_dims(labels, 1)
 
#扩充维数,将(5,)扩充为(5,1),里面的内容不变:[[5],[4],[3],[8],[7]]
 
indices = tf.expand_dims(tf.range(0, batch_size, 1), 1)
 
#扩充维数。由于batch_size=(5, ),循环之后生成5*1的矩阵:[[0],[1],[2],[3],[4]]
 
concated = tf.concat(1, [indices, labels])
 
#将indices和labels在第二维连接,形成5*2的矩阵:[[0,5],[1,4],[2,3],[3,8],[4,7]]
 
onehot_labels = tf.sparse_to_dense(
concated, tf.stack([batch_size, NUM_CLASSES]), 1.0, 0.0)
 
#转化为独热编码。
 
#tf.pack()将两个向量打包成一个。由于batch_size=5和NUM_CLASSES=10都是数,合并为行向量:[5,10]
 
#tf.sparse_to_dense()将稀疏矩阵转密集矩阵。stack()函数指定生成的矩阵的shape为5*10,concated指定更换值的坐标,1.0表示将concated指定坐标的值更换为1,0.0表示其余坐标值置0.

三.python+pandas实现 

import pandas as pd

print("---初始数据集---\n")
data=pd.DataFrame([
    ['red','class1','yi',0.233333],
    ['green','class2','er',0.654321],
    ['blue','class1','san',0.123456]])
data.columns=['color','class','id','value']
print(data)

print("---映射后数据集---\n")
mapp1={
    'yi':11,
    'er':22,
    'san':33}
data['id']=data['id'].map(mapp1)
mapp2={label:idx for idx,label in enumerate(set(data['class']))}
data['class']=data['class'].map(mapp2)
print(data)

print("---「one-hot」后数据集---\n")
data=pd.get_dummies(data)

print(data)

 

你可能感兴趣的:(deep,learning)