2017-07-05 28 views
0

LinuxのTensorFlow pythonインターフェイスバージョン1.1.0で逆行列を計算することに関連する問題があります。私が現在しようとしているのは、入力ベクトルがtensorflow.float64、つまりSであり、値がVであるということです。私はベクトルSを多項式ファッションの形で、A=[ 1, S, S^2, S^3 ]という形で補完し、Vで回帰をしたいと思います。回帰が\beta=(A^TA)^{-1}A^T\times Vとして実行されるテンソルフローのインフラストラクチャを使用する代わりに、線形回帰を自分で計算することを選択します。問題は(A^TA)^{-1}のステップで発生します。このステップでは、元の行列に逆行列を乗算しても同一性が得られません。しかし、前処理された入力と同じ値を含む定数行列としてA^TAをフィードした場合、結果は実際にはその逆です。TensorFlowの行列逆数

以下のコードは、パラメータがcontrol=Trueの実行可能なバージョンで、逆行列が正しく動作する定数入力行列バージョンをオンにします。プログラムを実行し、元の行列、逆行列をtf.matrix_inverseで実行し、逆行列と元の行列を乗算して識別を復元することによって、3つの行列が出力されます。 control=Falsecontrol=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) ])) 
+0

私は私の答えを削除しました。私は昨日得たものを再現できませんでした。しかし、A * ATの行列式はゼロに非常に近いので、逆は存在しません。不一致はこのためです。 –

+0

@vijaymコメントをいただきありがとうございます。そうですね、私はついにあなたの答えに同じ結果を見つけました。根本的な原因は元の行列の可逆でなければなりません。 –

答えて

1

反転できない行列を反転しようとしています。結果をコピーして貼り付けても問題ないように見えるのは驚くべきことですが、できないことをするときにメソッドが他のものより優れている理由については結論を出しません。

私は自分のドメインで数学的操作を確実に適用するために問題を再定式化しようとします。

+0

コメントをお寄せいただきありがとうございました。実際には、 'matrix_inverse'と同じ入力で、出力が異なる理由を知りたいのですが?この流れには後方トレーニングステップがないので、計算は可逆性を無視して決定論的でなければなりません。あなたはこの問題を提案していますか? –

+0

あなたは特異点にありますので、入力の差が小さいと結果が大きく異なる場合があります。それは決定論的ですが、病気になってしまいます。私はあなたの周りに道があるとは思わないのです。一見正しい出力を生成するコピー貼り付けがかなり興味深いという事実にとどまります。 – user1735003

+0

Btwが不明な場合:2つの 'ATA'行列*が(わずかに)異なります。彼らの違いを計算して自分自身を説得してください。 – user1735003