Я хочу создать несколько матриц, обладающих свойством, что их диагональ равна нулю и которые симметричны.Матрицы размерности n этой формы нуждаются в n * (n-1) / 2 параметрах, чтобы быть полностью определенными.Эти параметры будут позже изучены ...
В numpy я могу вычислить их, используя numpy.triu_indices, чтобы получить индексы верхней треугольной матрицы, начиная с первой диагонали над главной диагональю, а затем заполнитьэто по предоставленным параметрам, как в следующем фрагменте кода:
import numpy as np
R = np.array([[1,2,1,1,2,1], [1,1,1,1,1,1]])
s = R.shape[1]
M = R.shape[0]
iu_r, iu_c = np.triu_indices(s,1)
Q = np.zeros((M,s,s),dtype=float)
Q[:,iu_r,iu_c] = R
Q = Q + np.transpose(Q,(0,2,1))
Вывод:
[[[0. 1. 2. 1.]
[1. 0. 1. 2.]
[2. 1. 0. 1.]
[1. 2. 1. 0.]]
[[0. 1. 1. 1.]
[1. 0. 1. 1.]
[1. 1. 0. 1.]
[1. 1. 1. 0.]]]
Но, очевидно, нельзя напрямую перевести это в tenorflow, как
import tensorflow as tf
import numpy as np
M = 2
s = 4
iu_r, iu_c = np.triu_indices(s,1)
rates = tf.get_variable(shape=(M,s*(s-1)/2), name="R", dtype=float)
Q = tf.get_variable(shape=(M,s,s), dtype=float, initializer=tf.initializers.zeros, name="Q")
Q = Q[:,iu_r,iu_c].assign(rates)
не удается с
TypeError: Tensors in list passed to 'values' of 'Pack' Op have types [int32, int64, int64] that don't all match.
Как правильно определить этот тензор матриц из тензора векторов в тензорном потоке?
РЕДАКТИРОВАТЬ:
Мое текущее решение состоит в том, чтобы встраивать, используя функцию scatter_nd, предоставляемую tenorflow, так как она соответствует потребности в том, что нет необходимости выделять избыточные переменные, как в случае fill_triangular.Хотя индексация несовместима с индексами, сгенерированными с помощью numpy.В настоящее время жестко запрограммирован следующий пример:
import tensorflow as tf
import numpy as np
M = 2
s = 4
iu_r, iu_c = np.triu_indices(s,1)
rates = tf.get_variable(shape=(M,s*(s-1)/2), name="R", dtype=float)
iupper = [[[0,0,1],[0,0,2],[0,0,3],[0,1,2],[0,1,3],[0,2,3]],[[1,0,1],[1,0,2],[1,0,3],[1,1,2],[1,1,3],[1,2,3]]]
Q = tf.scatter_nd(iupper,rates,shape=(M,s,s), name="rate_matrix")
Не должно быть проблем с переводом индексов, полученных с помощью
iu_r, iu_c = np.triu_indices(s,1)
Но, может быть, у кого-то есть более элегантное решение для этого?