TensorFlow中的矩阵求逆

时间:2017-07-05 13:03:56

标签: python python-2.7 tensorflow matrix-inverse

我在Linux上的TensorFlow python接口版本1.1.0中有计算矩阵逆的问题。我现在要做的是,我有一个输入向量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 ) ] ) )

1 个答案:

答案 0 :(得分:1)

您正在尝试反转不可逆的矩阵。因此,即使复制粘贴结果产生看起来不错的东西也是令人惊讶的,但我不会得出结论为什么方法在做一些无法完成的事情时比另一方法更好。

我会尝试重新制定您的问题,以确保在其域名中应用数学运算。