Python Tenforflow稀疏算法

Python Tenforflow稀疏算法,python,tensorflow,sparse-matrix,Python,Tensorflow,Sparse Matrix,嗨,我现在正在学习tensorflow,我有一个稀疏的数据集,它由三列组成,日期,键,排列。我认为将这些数据存储在稀疏张量中,以bond作为一维,以date作为另一个维,将使对这个张量的操作感觉自然,如果您认为有更好的方法,请告诉我 我试图在张量的两个切片上进行算术运算,只有给定的张量值不是空的情况下,我才能在一个日期上加/减值。虽然我发现了一些函数可以帮助我完成这项任务,但我无法摆脱这样的感觉:我缺少了一个真正简单的问题解决方案 使用以下数据: import tensorflow as tf

嗨,我现在正在学习tensorflow,我有一个稀疏的数据集,它由三列组成,日期,键,排列。我认为将这些数据存储在稀疏张量中,以bond作为一维,以date作为另一个维,将使对这个张量的操作感觉自然,如果您认为有更好的方法,请告诉我

我试图在张量的两个切片上进行算术运算,只有给定的张量值不是空的情况下,我才能在一个日期上加/减值。虽然我发现了一些函数可以帮助我完成这项任务,但我无法摆脱这样的感觉:我缺少了一个真正简单的问题解决方案

使用以下数据:

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])
在上面的例子中,我打算用维度1表示日期,用维度2表示债券,这样

tf.sparse.slice(spreads,[0,2],[3,1])
为我提供日期
2
的所有排列,但显然
SparseTensor
不支持减法,我也不能使用
tf.math.subtract
。因此,我不再确定支持什么

具体来说,我想在上面的例子中完成的是,仅当债券在两个日期都有价差时,对所有其他日期减去日期
0
。例如,债券
0
出现在日期
0
1
中,但不是日期
2
中,因此我想从日期
0
1
中减去日期
0
中的价差。 最终张量如下所示:

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
中没有扩散。这与你所写的不同,所以如果这不是你的意思,请告诉我。

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

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
中没有扩散。这和你写的不一样,所以如果这不是你的意思,请告诉我