这种 one-hot 矢量转换是如何工作的?
Posted
技术标签:
【中文标题】这种 one-hot 矢量转换是如何工作的?【英文标题】:How does this one-hot vector conversion work? 【发布时间】:2017-12-17 12:59:18 【问题描述】:当我从事机器学习项目时,我一直在寻找一行代码来将我的标签变成单热向量。我在 Reddit 上从 u/benanne 看到了这行漂亮的代码。
np.eye(n_labels)[target_vector]
例如,对于 target_vector = np.array([1, 4, 2, 1, 0, 1, 3, 2])
,它返回 one-hot 编码值:
np.eye(5)[target_vector]
Out:
array([[ 0., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 1.],
[ 0., 0., 1., 0., 0.],
...,
[ 0., 1., 0., 0., 0.],
[ 0., 0., 0., 1., 0.],
[ 0., 0., 1., 0., 0.]])
虽然它确实有效,但我不确定它如何或为什么有效。
【问题讨论】:
我从未见过如此优雅的生成 OHV 的方法。 这是top voted SO question. 的第二个答案。可能应该是公认的答案,因为它可以很好地处理 n-d 1HA 【参考方案1】:ndarray[[0]]
是选择ndarray中的第一行
t = np.arange(9).reshape(3,3)
print t
print t[[1]]
输出是
[[0 1 2]
[3 4 5]
[6 7 8]]
[[3 4 5]]
【讨论】:
【参考方案2】:这很简单。 np.eye(n_labels)
创建一个大小为 n_labels
的单位矩阵,然后使用 target_vector
从该矩阵中选择与当前目标的值相对应的行。由于单位矩阵中的每一行都包含一个 1
元素和其余的 0
,因此每一行都是有效的“一个热编码”。
【讨论】:
这是使用另一个数组索引 NumPy 数组,如下所述:docs.scipy.org/doc/numpy/user/basics.indexing.html#index-arrays。第一个数组是大小为 n_labels 的单位矩阵。第二个数组选择每个目标对应的 one-hot 行。以上是关于这种 one-hot 矢量转换是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章
独热编码(one-hot)是什么?什么数据类型需要进行独热编码?pandas如何进行独热编码(one-hot)?
你如何在 Tensorflow 中解码 one-hot 标签?