python之独热编码的实现



        独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
python之独热编码的实现        上图表示的是独热编码(“one hot” encoding)的转换过程,在转换后的表示中,每列的一个元素是“hot”(意思是设置为1)。

        独热编码的实现可以在numpy中编写代码进行转换,也可以在tensorflow中实现。

numpy实现

def convert_to_one_hot(Y, C):
    Y = np.eye(C)[Y.reshape(-1)].T    return Y

        np.eye( C) 是构造一个对角线为1的对角矩阵, Y.reshape(-1) 把Y压缩成向量,numpy中向量shape是(n,),矩阵shape是(1, n)],np.eye( C)[Y.reshape(-1)] 就是取对角矩阵的相应行将其转成one-hot的形式,最后 .T 做转置。

  • examples:
import numpy as npdef convert_to_one_hot(Y, C):

    Y = np.eye(C)[Y.reshape(-1)].T    return Y

y = np.array([[3,2,1,3,0]])print(y.shape)print(y.reshape(-1).shape)C = 4print(convert_to_one_hot(y, C))

结果:

(1, 5)(5,)[[0. 0. 0. 0. 1.]
 [0. 0. 1. 0. 0.]
 [0. 1. 0. 0. 0.]
 [1. 0. 0. 1. 0.]]

tensorflow实现

one_hot_matrix = tf.one_hot(indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None)

        indices: 代表了on_value所在的索引,其他位置值为off_value。类型为tensor,其尺寸与depth共同决定输出tensor的尺寸。
        depth: 编码深度。
        on_value & off_value为编码开闭值,缺省分别为1和0,indices指定的索引处为on_value值。
        axis: 编码的轴,分情况可取-1、0或-1、0、1,默认为-1
        dtype: 默认为 on_value 或 off_value的类型,若未提供on_value或off_value,则默认为tf.float32类型。
        返回一个 one-hot tensor。

        如果indices是一个长度为features的向量,当axis == 0时输出尺寸为depth * features;当axis==-1时输出尺寸为features * depth;当axis = 1时,同axis = -1。
        如果indices是一个尺寸为[batch,features]的矩阵,当axis == 0时输出尺寸为depth * batch * features;当axis==-1时输出尺寸为batch * features * depth;当axis==1时输出尺寸为batch * depth * features。

1、indices是一个长度为features的向量

  • examples1: indices是一个长度为5的向量,depth为4,axis = 0时输出尺寸为4*5(depth * features)。
import tensorflow as tf

indices = [5,2,1,3,0]depth = 4one_hot_matrix = tf.one_hot(indices,depth,axis=0)sess = tf.compat.v1.Session()one_hot = sess.run(one_hot_matrix)sess.close()print(one_hot)

结果:

[[0. 0. 0. 0. 1.]
 [0. 0. 1. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 0. 1. 0.]]

  • examples2: indices是一个长度为5的向量,depth为4,axis = -1时输出尺寸为5*4(features * depth)。
import tensorflow as tf

indices = [5,2,1,3,0]depth = 4one_hot_matrix = tf.one_hot(indices,depth,axis=-1)sess = tf.compat.v1.Session()one_hot = sess.run(one_hot_matrix)sess.close()print(one_hot)

结果:

[[0. 0. 0. 0.]
 [0. 0. 1. 0.]
 [0. 1. 0. 0.]
 [0. 0. 0. 1.]
 [1. 0. 0. 0.]]

  • examples3: indices是一个长度为5的向量,depth为4,axis = 1时输出尺寸为5*4(features * depth),同examples2 的结果。

2、indices是一个尺寸为[batch, features]的矩阵

  • examples1: indices是一个尺寸为[2, 3]的矩阵,depth为4,axis = 0时输出尺寸为4* 2* 3( depth* batch* features)。
import tensorflow as tf

indices = [[5,2,1],[2,3,0]]depth = 4one_hot_matrix = tf.one_hot(indices,depth,axis=0)sess = tf.compat.v1.Session()one_hot = sess.run(one_hot_matrix)sess.close()print(one_hot)

结果:

[[[0. 0. 0.]
  [0. 0. 1.]]

 [[0. 0. 1.]
  [0. 0. 0.]]

 [[0. 1. 0.]
  [1. 0. 0.]]

 [[0. 0. 0.]
  [0. 1. 0.]]]

  • examples2: indices是一个尺寸为[2, 3]的矩阵,depth为4,axis = -1时输出尺寸为2* 3* 4(batch* features*depth)。
import tensorflow as tf

indices = [[5,2,1],[2,3,0]]depth = 4one_hot_matrix = tf.one_hot(indices,depth,axis=-1)sess = tf.compat.v1.Session()one_hot = sess.run(one_hot_matrix)sess.close()print(one_hot)

结果:

[[[0. 0. 0. 0.]
  [0. 0. 1. 0.]
  [0. 1. 0. 0.]]

 [[0. 0. 1. 0.]
  [0. 0. 0. 1.]
  [1. 0. 0. 0.]]]

  • examples3: indices是一个尺寸为[2, 3]的矩阵,depth为4,axis = 1时输出尺寸为2* 4* 3(batch* depth* features)。
import tensorflow as tf

indices = [[5,2,1],[2,3,0]]depth = 4one_hot_matrix = tf.one_hot(indices,depth,axis=1)sess = tf.compat.v1.Session()one_hot = sess.run(one_hot_matrix)sess.close()print(one_hot)

结果:

[[[0. 0. 0.]
  [0. 0. 1.]
  [0. 1. 0.]
  [0. 0. 0.]]

 [[0. 0. 1.]
  [0. 0. 0.]
  [1. 0. 0.]
  [0. 1. 0.]]]

               

上一篇:「Elasticsearch」- "Hot-Warm" Architecture @20210411


下一篇:文本匹配-dssm