LinuxのTensorFlow pythonインターフェイスバージョン1.1.0で逆行列を計算することに関連する問題があります。私が現在しようとしているのは、入力ベクトルがtensorflow.float64
、つまりS
であり、値がV
であるということです。私はベクトルS
を多項式ファッションの形で、という形で補完し、V
で回帰をしたいと思います。回帰がとして実行されるテンソルフローのインフラストラクチャを使用する代わりに、線形回帰を自分で計算することを選択します。問題はのステップで発生します。このステップでは、元の行列に逆行列を乗算しても同一性が得られません。しかし、前処理された入力と同じ値を含む定数行列としてをフィードした場合、結果は実際にはその逆です。TensorFlowの行列逆数
以下のコードは、パラメータがcontrol=True
の実行可能なバージョンで、逆行列が正しく動作する定数入力行列バージョンをオンにします。プログラムを実行し、元の行列、逆行列をtf.matrix_inverse
で実行し、逆行列と元の行列を乗算して識別を復元することによって、3つの行列が出力されます。 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) ]))
私は私の答えを削除しました。私は昨日得たものを再現できませんでした。しかし、A * ATの行列式はゼロに非常に近いので、逆は存在しません。不一致はこのためです。 –
@vijaymコメントをいただきありがとうございます。そうですね、私はついにあなたの答えに同じ結果を見つけました。根本的な原因は元の行列の可逆でなければなりません。 –