TensorFlow向量乘以向量乘法

bogh5gae  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(116)

我有一个波动率向量和一个相关系数矩阵

volatilities = tf.constant([0.2, 0.4, 0.6], dtype=tf.float32)
correlations = tf.constant([[1, 0.25, 0.5], [0.25, 1, 0.3], [0.5, 0.3, 1]], dtype=tf.float32)

我想用这些值创建一个协方差矩阵

covariance = tf.tensordot(volatilities, volatilities, axes=0) * correlations

到目前为止,一切顺利。现在我在一个批量训练过程中使用它,我的波动率和相关系数的形状分别是(batch_size, 3)(batch_size, 3, 3)。我花了很多时间试图弄清楚如何得到协方差矩阵。我首先试图得到一个形状为(batch_size, 3, 3)的波动率矩阵,然后与相关系数进行标量相乘。但我没有成功得到波动率矩阵,最接近的是(3, 3)Tensor。

volatility_matrix = tf.tensordot(volatilities, volatilities, axes=[[0], [0]])

如何高效地计算得到维度为batch_size的相关矩阵?

pvcm50d1

pvcm50d11#

正如@Lescurel引用的帖子提到的,这个问题可以通过使用tf.einsum来解决:

volatility_matrix = tf.einsum("ij,ik->ijk", volas, volas)

解决了获得波动率矩阵的问题。从那里,它只是沿着第二个轴的标量乘法。具体来说,然后获得协方差矩阵,我做了

covariance_matrix = tf.linalg.matmul(volatility_matrix, correlation_matrix)
sigwle7e

sigwle7e2#

这些是当某些信息未被表示时,共价矩阵和波动性的应用矩阵乘积,有助于在从成批信息中阅读时确定目标关系。

[样品]:

import tensorflow as tf

Cell_A = 0.20
Cell_B = 0.20
Cell_C = 0.20

volatilities = tf.constant([[ Cell_A, Cell_B, Cell_C ]], dtype=tf.float32)
correlations = tf.constant([[ 33405, 33405, 33405 ], [ 33405, 40050, 33405 ], [ 33405, 33405, 37025 ]], dtype=tf.float32)

volatility_matrix = tf.einsum('ij,jk->ik', volatilities, correlations)
correlation_matrix = correlations

print( ' volatilities : ' )
print( volatilities )
print( ' correlations : ' )
print( correlations )
print( ' volatility_matrix : ' )
print( volatility_matrix )

print( ' Shortest: ' + str( tf.math.argmin( volatility_matrix[0] ).numpy() ) )
print( ' Hghest: ' + str( tf.math.argmax( volatility_matrix[0] ).numpy() ) )

[输出]:

volatilities :
tf.Tensor([[0.2 0.2 0.2]], shape=(1, 3), dtype=float32)
 correlations :
tf.Tensor(
[[33405. 33405. 33405.]
 [33405. 40050. 33405.]
 [33405. 33405. 37025.]], shape=(3, 3), dtype=float32)
 volatility_matrix :
tf.Tensor([[20043. 21372. 20767.]], shape=(1, 3), dtype=float32)
 Shortest: 0
 Hghest: 1

相关问题