Обратная матрица в TensorFlow
У меня есть проблема, связанная с вычислением обратной матрицы в интерфейсе Python TensorFlow версии 1.1.0 в Linux. То, что я сейчас пытаюсь сделать, это то, что у меня есть входной вектор как tensorflow.float64
, сказать S
и значение V
, Я увеличиваю вектор S
быть полиномиальной модой в форме и хочу сделать регресс на V
, Я предпочитаю вычислять линейную регрессию самостоятельно, а не использовать инфраструктуру из тензорного потока, где регрессия проводится как , Проблема возникает на шаг, где обратное умножение исходной матрицы не дает идентичности. Однако, если я буду кормить как постоянная матрица, содержащая то же значение, что и предварительно обработанные входные данные, результат действительно является обратным к самому себе.
Код ниже является работоспособной версией с параметром control=True
включает версию матрицы с постоянным входом, где обратное ведет себя правильно. Три матрицы выводятся при запуске программы, исходная матрица, "обратная" по tf.matrix_inverse
и умножение "обратной" на исходную матрицу с целью восстановления идентификатора. control=False
дает ту же исходную матрицу, что и control=True
запустить, однако, восстановленная "идентичность" неверна с control=False
, Я подозреваю, что что-то не так с потоком данных во время предварительной обработки. Однако, из-за моего опыта работы с TensorFlow, я не могу это определить. Не могли бы вы помочь, почему tf.matrix_inverse
не работает как положено?
import tensorflow as tf
import pprint
def matrixInverse( control=False ):
'''Compute inverse of a matrix.
Parameters
----------
control : bool
whether to use control group or not.
'''
X = tf.constant( [ [100. , 100., 100., 100.],
[ 101.75497118 , 92.84824314 , 95.09528336 , 103.24955959],
[ 92.33287485 , 95.86868862 , 84.70664178 , 107.9505686 ],
[ 85.86109085 , 99.05621029 , 94.24396596 , 119.60257907] ], dtype=tf.float64 )
# extract input X
s = tf.slice( X, [ 2, 0 ], [ 1, 4 ])
s = tf.squeeze(s)
s1 = tf.multiply( tf.ones( 4, dtype=tf.float64 ), s )
s2 = tf.multiply( s, s )
s3 = tf.multiply( tf.multiply( s, s ), s )
A = tf.concat( [ tf.ones( 4, dtype=tf.float64 ), s1, s2, s3 ], 0 )
A = tf.reshape( A, [ 4, 4 ] )
# filter only the first element in the selected row
itm = tf.constant( [ True, False, False, False ], dtype=tf.bool )
A = tf.boolean_mask( tf.transpose(A), itm )
if control:
ATA = tf.constant([[ 1.00000000e+00, 9.23328748e+01, 8.52535978e+03, 7.87170977e+05],
[ 9.23328748e+01, 8.52535978e+03, 7.87170977e+05, 7.26817593e+07],
[ 8.52535978e+03, 7.87170977e+05, 7.26817593e+07, 6.71091579e+09],
[ 7.87170977e+05, 7.26817593e+07, 6.71091579e+09, 6.19638148e+11]], dtype = tf.float64)
else:
ATA = tf.matmul( tf.transpose( A ), A )
inverseATA = tf.matrix_inverse( ATA )
sess = tf.Session()
pprint.pprint( sess.run( [ ATA, inverseATA, tf.matmul( ATA, inverseATA ) ] ) )
1 ответ
Вы пытаетесь инвертировать матрицу, которая не является обратимой. Поэтому, даже если удивительно, что при копировании результата получается что-то, что выглядит нормально, я бы не стал делать вывод о том, почему метод лучше, чем другой, выполняет то, что не может быть сделано.
Я бы попытался переформулировать вашу проблему, чтобы обеспечить применение математических операций в своей области.