02_Numpy的One-hot形式的转换(eye,identity)

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进行指定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值