这种 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 标签?

为啥要用one-hot编码

PyTorch——Tensor_把索引标签转换成one-hot标签表示

one-hot code 独热编码

Numpy与PandasSklearn中one-hot快速编码方法