嗨,我现在正在学习tensorflow,我有一个稀疏的数据集,它由日期,债券,价差三列组成。我认为将这些数据存储在稀疏张量中,将bond作为一个维度,将日期作为另一个维度,将使对该张量进行运算变得自然,请告诉我您是否认为有更好的方法。

我试图在张量的两个切片上执行算术运算,仅当给定张量值不为空时才在一个日期上添加/减去值,而我发现一些函数可以帮助完成该任务,但我无法摆脱这种感觉我错过了一个非常简单的解决方案。

使用以下数据:

import tensorflow as tf
tf.enable_eager_execution()

indicies = [[0, 0], [0, 1], [1, 0], [1, 2], [2, 2]]
values   = [10    , 10    ,  10   , 11    ,  11   ]

spreads = tf.sparse.SparseTensor(indicies, values, [3, 3])


在上面的示例中,我打算将第一维用于日期,将第二维用于债券,以便

tf.sparse.slice(spreads,[0,2],[3,1])


给我date 2的所有点差,但是SparseTensor显然不支持减法,也不能使用tf.math.subtract。所以我不再确定支持什么。

具体而言,我想在上述示例中完成的操作是,仅当债券在两个日期之间均展开时,才对所有其他日期减去日期0。例如,债券0出现在日期01中,但没有出现在日期2中,因此我想从日期00中减去日期1中的价差。
最终张量看起来像这样:

indicies2 = [[0, 0], [0, 1], [1, 0], [1, 2]]
output    = [ 0    , 0     , 0,    ,  1    ]
tf.sparse.to_dense(tf.sparse(tf.sparse.SparseTensor(indicies2, output, [3, 3])))



  tf.Tensor:id = 128,shape =(3,3),dtype = int32,numpy =
  数组([[0,0,0],
        [0,0,1],
        [0,0,0]])


我想简单的解决方案是使用tf.sparse.to_dense,但这种方法使使用SparseTensor的要点大打折扣,因此我不确定是否错过了API文档中的某些使我的解决方案成为可能的东西,或者我完全错了通过尝试使用SparseTensor
归根结底,我只是想对张量的每个值执行一些数学运算,如果该值在另一个张量中具有匹配项。

更新:
我意识到我可以对切片之一应用tf.math/negative减去两个切片的问题是,输出假定如果缺少一个切片中的值,则可以认为它是某个默认值(零)。

最佳答案

我不确定是否有任何简单的技巧可以使这项工作如此轻松。我要么做密集计算,要么自己写稀疏计算。这有点棘手,所以只有在数据确实非常稀疏并且可以节省大量内存和计算量的情况下,才值得这样做。这是一种方法:

import tensorflow as tf
tf.enable_eager_execution()

bonds = [0, 0, 1, 1, 2]
dates = [0, 1, 0, 2, 2]
values = [10, 10, 10, 11, 11]
# Find date 0 data
m0 = tf.equal(dates, 0)
bonds0 = tf.boolean_mask(bonds, m0)
values0 = tf.boolean_mask(values, m0)
# Find where date 0 bonds are
match = tf.equal(tf.expand_dims(bonds, 1), bonds0)
# Compute the amount to subtract from each data point
values_sub = tf.reduce_sum(values0 * tf.dtypes.cast(match, values0.dtype), 1)
# Compute new spread values
values_new = values - values_sub
# Mask null values
m_valid = tf.not_equal(values_new, 0)
bonds_new = tf.boolean_mask(bonds, m_valid)
dates_new = tf.boolean_mask(dates, m_valid)
values_new = tf.boolean_mask(values_new, m_valid)
# Make sparse tensor
indices_new = tf.dtypes.cast(tf.stack([bonds_new, dates_new], 1), tf.int64)
spreads_new = tf.sparse.SparseTensor(indices_new, values_new, [3, 3])
tf.print(spreads_new)
# 'SparseTensor(indices=[[1 2]
#  [2 2]], values=[1 11], shape=[3 3])'


对于您给出的示例,我得到输出(1, 2) => 1(2, 2) => 11-(2, 2)不受影响,因为在日期2中没有0的价差。那和你写的不同,所以如果这不是你的意思,请告诉我。

关于python - Tensorflow稀疏算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58918770/

10-13 02:44