Numpy的(eye,identity)One-hot形式的转换
One-hot形式?
只有1个1(High),其他全部为0(Low)的形式称为one-hot。
相对,只有1个0(Low),其他全部为1(High)的形式称为one-cold(好像是)。
在机器学习中,使用Tensorflow等框架进行分类问题预测的时候,经常使用one-hot形式来表达输出预测的结果。比如:MNIST的手写数字数据集(0~9,10个分类),当预测的结果为2时,One-hot的表现形式为[0,0,1,0,0,0,0,0,0,0]。
使用Numpy的eye和identity函数可以很简单的转换成one-hot形式。
Numpy.eye()
Numpy.eye()返回1个斜面全部为1,其他全部为0的2维的ndarray。
e = np.eye(4)
print(type(e))
print(e)
print(e.dtype)
# <class 'numpy.ndarray'>
# [[ 1. 0. 0. 0.]
# [ 0. 1. 0. 0.]
# [ 0. 0. 1. 0.]
# [ 0. 0. 0. 1.]]
# float64
默认的数据类型为float64,参数dtype可以指定数据的类型。
参数M可以指定列数,参数k可以指定1开始的位置。
e = np.eye(4, M=3, k=1, dtype=np.int8)
print(e)
print(e.dtype)
# [[0 1 0]
# [0 0 1]
# [0 0 0]
# [0 0 0]]
# int8
Numpy.identity()
numpy.identity()是一个可以返回单位矩阵(identity matrix)的函数。
i = np.identity(4)
print(i)
print(i.dtype)
# [[ 1. 0. 0. 0.]
# [ 0. 1. 0. 0.]
# [ 0. 0. 1. 0.]
# [ 0. 0. 0. 1.]]
# float64
默认的数据类型为float64,参数dtype可以指定数据的类型。
无其他参数。
i = np.identity(4, dtype=np.uint8)
print(i)
print(i.dtype)
# [[1 0 0 0]
# [0 1 0 0]
# [0 0 1 0]
# [0 0 0 1]]
# uint8
那么为什么要准备2个相同功能的函数呢?查看源代码可以发现,numpy.identity()内部调用的也是numpy.eye()函数。
from numpy import eye
return eye(n, dtype=dtype)
所以,numpy.eye()函数也可以生成一个单位矩阵。只不过函数numpy.identity()的名字更加通俗易懂。
One-hot的转换
当我们已经可以得到单位矩阵时,One-hot的转换将变的十分简单。
比如:有10个类别标签时,生成一个10x10的单位矩阵后,再将要转换的数据放入生成的10x10的单位矩阵之中即可。
a = [3, 0, 8, 1, 9]
a_one_hot = np.identity(10)[a]
print(a)
print(a_one_hot)
# [3, 0, 8, 1, 9]
# [[ 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
# [ 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
# [ 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
# [ 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
# [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]
0~9的数组a转换成One-hot形式。
当使用iris数据集时,转换的方法相同。
a = [2, 2, 0, 1, 0]
a_one_hot = np.identity(3)[a]
print(a)
print(a_one_hot)
# [2, 2, 0, 1, 0]
# [[ 0. 0. 1.]
# [ 0. 0. 1.]
# [ 1. 0. 0.]
# [ 0. 1. 0.]
# [ 1. 0. 0.]]
数据类型依旧可以使用参数dtype进行指定。