TensorFlow 中的矩阵求逆
Matrix Inverse in TensorFlow
我在 Linux 上的 TensorFlow python 接口版本 1.1.0 中有一个关于计算矩阵求逆的问题。我现在要做的是,我有一个输入向量 tensorflow.float64
,比如说 S
和一个值 V
。我将向量 S
扩充为 形式的多项式形式,并希望对 V
进行回归。我选择自己计算线性回归,而不是使用 tensorflow 的基础设施,其中回归的执行方式为 。问题出现在 步骤,其中原始矩阵的逆乘没有给出恒等式。但是,如果我将 作为包含与预处理输入相同值的常量矩阵提供,则结果实际上是其自身的倒数。
下面的代码是一个 运行 可用版本,参数 control=True
打开常量输入矩阵版本,其中逆运算正确。 运行程序输出三个矩阵,原矩阵,"inverse"乘tf.matrix_inverse
,"inverse"与原矩阵相乘,目的是恢复身份. control=False
给出与 control=True
运行 相同的原始矩阵,但是,恢复的 "identity" 与 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 ) ] ) )
您正在尝试反转一个不可逆的矩阵。因此,尽管复制粘贴结果会产生看起来不错的结果令人惊讶,但我不会就为什么一种方法在做一些无法完成的事情时比另一种方法更好得出结论。
我会尝试重新表述您的问题,以确保在他们的域上应用数学运算。
我在 Linux 上的 TensorFlow python 接口版本 1.1.0 中有一个关于计算矩阵求逆的问题。我现在要做的是,我有一个输入向量 tensorflow.float64
,比如说 S
和一个值 V
。我将向量 S
扩充为 V
进行回归。我选择自己计算线性回归,而不是使用 tensorflow 的基础设施,其中回归的执行方式为
下面的代码是一个 运行 可用版本,参数 control=True
打开常量输入矩阵版本,其中逆运算正确。 运行程序输出三个矩阵,原矩阵,"inverse"乘tf.matrix_inverse
,"inverse"与原矩阵相乘,目的是恢复身份. control=False
给出与 control=True
运行 相同的原始矩阵,但是,恢复的 "identity" 与 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 ) ] ) )
您正在尝试反转一个不可逆的矩阵。因此,尽管复制粘贴结果会产生看起来不错的结果令人惊讶,但我不会就为什么一种方法在做一些无法完成的事情时比另一种方法更好得出结论。
我会尝试重新表述您的问题,以确保在他们的域上应用数学运算。