Обратная матрица в TensorFlow

У меня проблема, связанная с вычислением обратной матрицы в интерфейсе Python TensorFlow версии 1.1.0 в Linux. Что я сейчас пытаюсь сделать, так это то, что у меня есть входной вектор как tensorflow.float64, скажем, S и значение V. Я увеличиваю вектор S, чтобы он был полиномиальным в форме A=[ 1, S, S^2, S^3 ] и хотите выполнить регрессию для V. Я предпочитаю вычислять линейную регрессию самостоятельно, а не использовать инфраструктуру из tensorflow, где регрессия выполняется как \beta=(A^TA)^{-1}A^T\times V. Проблема возникает на (A^TA)^{-  1} шаг, где обратное умножение исходной матрицы не дает тождества. Однако, если я подам A^TAкак постоянную матрицу, содержащую то же значение, что и предварительно обработанный ввод, результат на самом деле противоположен самому себе.

Приведенный ниже код представляет собой исполняемую версию с параметром 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 ) ] ) )

person Summer_More_More_Tea    schedule 05.07.2017    source источник
comment
Я удалил свой ответ, не смог воспроизвести то, что получил вчера. Но обнаружил, что определитель A*AT очень близок к нулю, поэтому обратного не существует. Несоответствия именно из-за этого.   -  person vijay m    schedule 06.07.2017
comment
@vijaym Спасибо за комментарий. Хорошо, я наконец нашел тот же результат после ваших ответов. Первопричиной должна быть обратимость исходной матрицы.   -  person Summer_More_More_Tea    schedule 07.07.2017


Ответы (1)


Вы пытаетесь инвертировать необратимую матрицу. Таким образом, несмотря на то, что удивительно, что копирование и вставка результата дает что-то, что выглядит нормально, я бы не стал делать вывод о том, почему один метод лучше другого при выполнении чего-то, что невозможно сделать.

Я бы попытался переформулировать вашу проблему, чтобы обеспечить применение математических операций в своей области.

person P-Gn    schedule 05.07.2017
comment
Спасибо за ваши комментарии и указание на необратимую матрицу. Собственно, я хочу знать, при одинаковом входе в matrix_inverse, почему выходы разные? В этом потоке нет шага обратного обучения, поэтому, на мой взгляд, вычисления должны быть детерминированными без учета обратимости. Есть ли у вас какие-либо предложения решить эту проблему? - person Summer_More_More_Tea; 05.07.2017
comment
Вы находитесь в сингулярности, поэтому небольшие различия на входе могут привести к большим различиям на выходе. Это детерминировано, но неверно сформулировано, и я не думаю, что у вас есть способ обойти это. Остается тот факт, что копирование и вставка, производящие, казалось бы, правильный вывод, довольно интригуют. - person P-Gn; 05.07.2017
comment
Кстати, на случай, если это неясно: вы две матрицы ATA являются (немного) разными. Вычислите их различия, чтобы убедиться в этом. - person P-Gn; 05.07.2017
comment
Дважды проверил ATA в двух случаях, вы правы в том, что матрица control=True усечена с большим определителем (10 ^ -4 против 10 ^ -25). Таким образом, вероятно, наблюдение. Мой обходной путь для этой проблемы — использовать py_func для передачи шага регрессии в модуль sklearn. Спасибо. - person Summer_More_More_Tea; 06.07.2017