【问题标题】:Python one hot vector encodingPython一热向量编码
【发布时间】:2015-12-26 18:26:53
【问题描述】:

我正在尝试使用 python 将我的分类数据转换为一个热向量,最好使用 numpy 或 theano。我不想使用 sklearn(我无法安装它)。

我的数据是这样的:

data=[
[ 0., 2., 2., 0., 2., 0., 1.],
[ 2., 1., 2., 2., 2., 0., 2.],
[ 0., 0., 2., 0., 2., 2., 2.],
[ 0., 2., 1., 0., 1., 2., 2.],
[ 0., 2., 2., 0., 0., 0., 2.],
[ 0., 2., 0., 0., 2., 0., 2.],
[ 0., 2., 2., 0., 2., 0., 1.],
[ 1., 2., 2., 1., 2., 1., 0.],
]

我的数据有 7 列,每列的值可以是 0、1 或 2。在操作结束时,我想要一个热向量,它有 3^7-1 个零和一个 1 值。

我尝试使用

theano.tensor.extra_ops.to_one_hot(y, nb_class, dtype=None)

但没用,我不确定它是否适合这项任务。

我在互联网上看到的大多数示例仅适用于单列。

【问题讨论】:

  • 这是一种奇怪的单热编码方式。通常每一列代表一个分类特征。在这种情况下,您将拥有 7 * 3 个单热编码值。您要为每个列组合创建一个值?
  • @DavidMaust,是的,我试图用一个热向量表示每一行,每一行可以采用 3^7 个不同的值。

标签: python numpy machine-learning theano


【解决方案1】:

我认为这没有内置函数,因为您必须告诉 numpy/theano 您的值只能来自 {0,1,2}。 这是一个简单的 numpy 实现,其中
0000000 映射到 10...0,
1000000 映射到 01...0,
2222222 映射到 00...1。

data=[
[ 0., 2., 2., 0., 2., 0., 2.],
[ 0., 2., 2., 0., 2., 0., 2.],
[ 0., 2., 2., 0., 2., 0., 2.],
[ 0., 2., 2., 0., 2., 0., 2.],
[ 0., 2., 2., 0., 2., 0., 2.],
[ 0., 2., 2., 0., 2., 0., 2.],
[ 0., 2., 2., 0., 2., 0., 2.],
]
data_num = 7

one_hot_dat = np.zeros((data_num, 3**7))
# vector for making indices
vec = np.asarray([3**i for i in range(7)])
# compute the corresponding index for each data point
hot_idx = np.sum(np.asarray(data)*vec, axis=1).astype(int)
one_hot_dat[range(data_num), hot_idx] = 1
# one_hot_dat[0] should give the first data point in one-hot

【讨论】:

    猜你喜欢
    • 2020-03-14
    • 2023-03-04
    • 2016-07-04
    • 1970-01-01
    • 2018-12-17
    • 2019-11-03
    • 2019-02-07
    • 1970-01-01
    • 2020-03-31
    相关资源
    最近更新 更多