疑似逆行列についての質問

このQ&Aのポイント
  • 疑似逆行列に関する質問です。疑似逆行列を使用して、最小のノルムの2乗和を持つ条件を満たすτを求める方法について教えてください。
  • 疑似逆行列を使用して、最もノルムの2乗和が小さくなるパラメータτを求める方法について質問があります。
  • 質問です。疑似逆行列を利用して、ノルムの2乗和が最小となる条件を満たすτを求める方法について教えてください。
回答を見る
  • ベストアンサー

疑似逆行列について質問があります.

疑似逆行列について質問があります. (もしかしたら疑似逆行列の問題で無いかもしれませんが...) 例えばF = Aτという関係が成り立っているとします. ただし τ= [t1,t2,t3,t4,t5,t6,t7,t8] F = [f1,f2,f3] A は3行8列の行列式. ここで0<t1,t2,t3,...,t8 となるような条件のもと tn(n=1,2,3...8)のノルムの2乗和が最小となるようなτを求めたいとき どのようにすればよいのでしょうか. 個人的に考えたのは 疑似逆行列を使うと τ =A^†F + (I - A^†A)k のkの部分をいじること何とかなると思ったのですが どうにも解くことができません. もしよい方法を知っている方がいましたら教えてください. また,解法までは分からなくても参考になりそうな考え等が ありましたらそちらも教えていただけると 大変ありがたいです. よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • ur2c
  • ベストアンサー率63% (264/416)
回答No.7

A x = y, 0 =< x の解は存在する。[... 1 ...] x を最小化する。A は (3,8)。R でやります。 各列の Euclidean norm が 1 である行列 A を作る。 > set.seed(123) > A0 <- matrix(runif(3*8,-1,1),nrow=3,ncol=8) > A <- A0 %*% diag((diag((t(A0) %*% A0)))^(-1/2)) A = -0.575 0.518 0.071 -0.094 0.403 0.607 -0.276 0.351 0.780 0.595 0.989 0.990 0.165 -0.385 0.730 0.256 -0.246 -0.614 0.130 -0.101 -0.900 -0.695 0.625 0.901 0 =< y として良い。 > (y <- c(round(abs(runif(3,0,9))))) [1] 6 6 5 解く。 > library(boot) > x <- simplex(rep(1,8),A3=A,b3=y) > x$solved [1] 1 なので解けてる。0 以外の解は > x$soln[x$soln != 0] x2 x3 x8 5.3335022 0.4952125 9.1188452 目的関数の値は > x$value b 14.94756 A x = y を確認する。 > as.vector(A %*% x$soln) [1] 6 6 5 高水準言語なら簡単にできるので、1 つは使えるようにしておくべきです。数式を扱うなら Sage とか Maxima とか。数値だけなら R とか Scilab とか。 > C言語を使って計算結果の描画を行うプログラムを作成したためそちらを利用しようと考えている 描画も高水準言語で作り直した方が、あとあとメンテが楽です。 > 私がC言語とHTMLしか使えないというのもありますが C で書く正当な理由は「計算はマイコン」とか「一瞬を争う実行」しか思いつきません。

usagisagi
質問者

お礼

丁寧な回答ありがとうございます. これを参考に実際にプログラムを書いていこうと思います. また,アドバイスを参考に高水準の言語も勉強していきたいと思います. 本当にありがとうございました.

その他の回答 (7)

  • ur2c
  • ベストアンサー率63% (264/416)
回答No.8

訂正です。機能は同じですけど。 誤: (y <- c(round(abs(runif(3,0,9))))) 正: (y <- c(round(runif(3,0,9))))

  • ur2c
  • ベストアンサー率63% (264/416)
回答No.6

訂正です。 誤: Σ max_i t_i 正: max_i t_i

  • ur2c
  • ベストアンサー率63% (264/416)
回答No.5

では、F = A t, 0 =< t の解は存在する、とします。 > 目標関数をΣ t_j の最小化問題に置き換えることができるとありますが, いえ、置き換えることができるわけではありません。言いたいのは「目的関数を Σ t_i^2 に固定する理由はまだない」ということです。 各支線を同じ太さでなるべく細くしたいなら、各支線にかかる力の最大値を最小化すれば良いので、目的関数は Σ max_i t_i みたいなものでしょう。作用点にかかる力の和をなるべく小さくしたいなら Σ t_i になります。目的関数 Σ t_i^2 はどういう(設計上の?)要請から出て来るのでしょうか? > C言語によるプログラミングによって実現しようと考えています. >(数学的に特殊な関数の入ったヘッダーファイルを読み込む予定もありません.) いきなり C で書くのは労力が無駄です。普通は、まずはもっと高級な言語で楽に prototype を作り、満足なものができた後に必要なら、しかたなく C に書き換えます。

usagisagi
質問者

お礼

回答ありがとうございます. >各支線を同じ太さでなるべく細くしたいなら、各支線にかかる力の最大値を最小化すれば良いので、 >目的関数は Σ max_i t_i みたいなものでしょう。作用点にかかる力の和をなるべく小さくしたいなら >Σ t_i になります。目的関数 Σ t_i^2 はどういう(設計上の?)要請から出て来るのでしょうか? なるほど,全くその通りだと思います. 私は目的関数 Σ t_i^2を最小化することはエネルギー的に小さくなることと同義と思っていたので 最もスマートな力の再分配方法だと勘違いしていました. 言われてみればΣ t_i^2では作用点に加わる力の方向と反対方向を向く支線にも力が分配されるためあまりよい方法ではありません. 今回は作用点にかかる力の和をなるべく小さくしたいのでΣ t_i にしようと思います. なお,C言語で書くのは同じくC言語を使って計算結果の描画を行うプログラムを作成したためそちらを利用しようと考えているからです.(私がC言語とHTMLしか使えないというのもありますが...)

  • ur2c
  • ベストアンサー率63% (264/416)
回答No.4

> 目的関数 z = [F-At]^T[F-At] を最小にするtを求めよ. F = A t なので z = 0 です。 > 力の再分配 だとすると、定式化の第 1 の要点は、0 = t_j を許すか許さないかだと思います。つまり a_j 方向に張った支線が、たるんでも良いかどうか。 たるんで良いなら簡単で、Σ t_j を最小化、つまり a_j 方向の力の和を最小にすることにすれば、問題は線形計画法に落ちます。そして解は、どれか 3 本が張って残りはたるんでいるというものになるか、あるいは存在しません。t' t を最小化でも、大差ないです。 Q1. たるんで良いですか、だめですか? たるんではいけないなら、話はちょい難しくなります。 > このような問題は解けるものなのでしょうか. 解があれば、解けます。第 2 の要点はそこ、つまり、解が存在しない場合にどうするか、ということです。「ないよ」で済むのか。済まなくて、なくても、できるだけ F に近いものを A t で実現しなければならないのか。 Q2. なければないですみますか、だめですか? > どのようにすればよいか 一番簡単な場合、つまり「0 = t_j を許し、解がなければないで済む」なら、すぐです。 Q3. 数値計算 software は何を使ってますか?

usagisagi
質問者

お礼

回答ありがとうございます. ur2cさんの質問に対する返答ですが まず >Q1. たるんで良いですか、だめですか? については”たるんでもよい”つまり条件式はti>=0の方が適切でした. ありがとうございます. >Q2. なければないですみますか、だめですか? ”できるだけ F に近いものを A t で実現しなければなりません” ただ,今回の場合,幾何学的に必ず解が存在するように力を分配するので 原則的には解が存在するのではないかと考えています. >Q3. 数値計算 software は何を使ってますか? C言語によるプログラミングによって実現しようと考えています. (数学的に特殊な関数の入ったヘッダーファイルを読み込む予定もありません.) なので基本的に自ら立式し,解の形まで計算する必要があります. 最後に質問ですが, 目標関数をΣ t_j の最小化問題に置き換えることができるとありますが, (Σti)^2<Σ(t_i)^2 となりΣ t_j解が常にΣ(t_i)^2の最小であることを示すことは難しいように感じました. (自分も計算してみましたが,できませんでした.) これは証明できうるものなのでしょうか. もし証明できるのならそちらについても教えていただけると嬉しいです.

  • ur2c
  • ベストアンサー率63% (264/416)
回答No.3

> τ>0を常に満たすという条件も含まれているのでしょうか. はい。ANo.1 にある「それらの制約条件」は「F = Aτ, 0<τ」を指しますから。実際に計算するには、それらの制約を満たす、いわゆる実行可能解を 1 つ、初期値にとれることが必要です。 Moore-Penrose 一般化逆行列は 0<τ を考慮しませんので、この問題には不向きです。 質問は数学の問題と言うより、現象のモデル化の問題のように見えます。今の定式化では実行可能解の存在が保証されないので、不自然な感じを受けます。現象自体の説明があれば、もう少し適切な助言ができるかもしれません。

usagisagi
質問者

お礼

丁寧な回答ありがとうございます. 非常に助かります. 現象については説明が難しいのですが,力の再分配を考えています. 力FをA=[a1,a2,a3...a8]の方向の力の合力で表わすために必要な各方向anに加える力tnで表わそうというものです. 回答を観ているうちになんとなく今更ながら論点がつかめてきました. 私が考えていた問題とはつまり 目的関数 z = [F-Aτ]^T[F-Aτ] を最小にするtを求めよ. ただし τ>0 f1=a11*t1+a21*t2+a31*t3...+a81*t8 f2=a12*t1+a22*t2+a32*t3...+a82*t8 f3=a13*t1+a23*t2+a33*t3...+a83*t8 (この3行はF=Aτを表わす) ※このときaijは既知の値 という非線形計画問題ということです. ただ,私は実は計画問題というものには触れたこともなくどのようにすればよいか全くわかりません. このような問題は解けるものなのでしょうか.

  • alice_44
  • ベストアンサー率44% (2109/4759)
回答No.2

一般逆行列にまつわる用語は、揺らぎが大きくて、 単語を聞いただけでは意味が掴みにくいのですが… A^+ という記号を使っているところからすると、 貴方の言う「疑似逆行列」とは、私方の方言では 「ムーア・ペンローズ型一般逆行列」のことでしょうか。 最小二乗型 かつ ノルム最小型 かつ 反射型の 一般逆行列のことを、ムーア・ペンローズ型と言います。 任意の行列に対して唯一つ存在するので、よく使われます。 ムーア・ペンローズ型一般逆行列も、ノルム最小型 一般逆行列の一種なので、一次方程式に解が在る場合には、 その中でノルム最小のものを与えます。 k をいじらなくても、τ = (A^+)F だけで ok です。 ただし、F = Aτ が常に解を持つとは限らないので、 注意が必要です。解が存在するための必要十分条件は、 A と F の列を並べた3行9列の行列の rank が rank A と一致していることです。

usagisagi
質問者

お礼

回答ありがとうございます. ただτ = (A^+)F のみだと τの要素[t1,t2,t3,t4...t8]が正の値だけでなく負の値をとる可能性が 残ってしまいます. そのような場合は各要素を正の値あるいは0にするにはどのようにすればよいのでしょうか?

  • ur2c
  • ベストアンサー率63% (264/416)
回答No.1

F = Aτ 0 <τ の両者を満たす解の存在を確かめます。解はないかもしれません。もしあれば、それらの制約条件のもとで 、「 '」を転置として τ' τ を最小化します。計算はたとえば R でできます。

usagisagi
質問者

お礼

回答ありがとうございます. τ' τ を最小にするということはつまり τの各要素の2乗和を最小にするということであると思うのですが, τ>0を常に満たすという条件も含まれているのでしょうか.

関連するQ&A

  • 最小二乗法 擬似逆行列

    下のサイトの説明を読んで最小二乗法の勉強をしています。 未知パラメータxが1個(N=1)、出力yが10個(M=10)のとき、 擬似逆行列を求めようとすると、(A#A)^-1 が1×1行列になってしまいます。 このとき逆行列はどのように求めたら良いのでしょうか??勉強不足ですみませんが、よろしくお願いします。 http://www.star.t.u-tokyo.ac.jp/~kaji/leastsquare/leastsquare_main.htm

  • ある行列とその転置行列の積の逆行列は?

    今エクセルで行列を使って問題を解いています。 問題は 行列X、A、Yがあり、Xは1行4列、Aは1行2列、Yは1行4列です。 X・A=Y という式があり、Aの行列は未知数a,bの要素からなっています。 X,Yはそれぞれ数値として要素が決まっています。 ここからはヒントとして表示されていました。 そこでXの逆行列を両辺の左からかけるとAは求まるはずですが、 Xは正方行列ではないので、Xの転置行列を左からかけます。 X(T)・Xは正方行列になるのでこれを行列Pとおくと Pの逆行列を求められ、右辺にP^-1をかけるとAが求まる。 というものです。 エクセルで書かれている通りにやってみて、エラーになるので調べてみると、XとXの転置行列の積の行列式は要素にかかわらず0になるようです。 実際に数値ではなく、abcdでやってみたところ0のようです。 この場合、逆行列は存在しないのではないかと思いますが、このヒントが間違っているとはあまり思えず、困っています。 補足ですが、この問題は最小二乗法をエクセルで行列を用いて行うという趣旨です。 もとのデータとして(x、y)の座標が4点与えられており、行列Xはxの要素を縦にならべたもの、Aは最小二乗法で求める一次関数式のパラメーターa,bで、YはXと同様座標のy要素です。 私の理解が間違っていて、何行何列という部分に誤りがあるなどの指摘があれば、ぜひお願いいたします。 そもそもある行列とその転置行列の積の逆行列は存在するのかどうかもお願いします。 締め切りが近く、ちょっとあせっています。 よろしくお願いします!!

  • 逆行列の求め方

      1 ,3 ,5 ,7 1行目 1^2,3^2,5^2,7^2  2行目  1^3,3^3,5^3,7^3  3行目 1^4,3^4,5^4,7^4  4行目 4×4の行列の逆行列を求めよ。 ただ単に逆行列を求めるのであれば、計算は大変になるが、この行列を単位行列に変形することで求められるが、累乗をいかした解法を問題作成者は期待しているとおもうので、それに添った解答はどうなるのか。 よい解答を教えてください。

  • 行列の和の逆行列について

    情報処理系の数学(カルマンフィルタとか)では(A+B+C)^(-1)とか(A+BCF)^(-1)のように行列の和(あるいは行列と行列の積の和)の逆行列の表式があり、公式のようなものが与えられていたりします。その中で例えば(A+B+C)^(-1)でA,B,Cとは何かと言うと行列(普通は正方行列?)なわけですが、例えば単に1つの値(スカラー)であった場合は逆数というのは自然な拡張としてあり得ると思います。1行1列の行列の対角成分だけの行列と見なすわけです。これはいいだろうと思います。問題はAなどがベクトルだったときです。これは計算できないということでいいでしょうか。ベクトルだったら1行N列の行列(N行1列でも)ということであり、逆行列が定義できないということになるでしょうか。カルマンフィルタなどではベクトルではないかと思うものが式の中に入っているのですが。Rで実験してみるとAの逆行列はsolve(A)だけで求まります。Aがスカラーだったら予想どおり逆数なります。ベクトルだったらエラーです。やはりベクトルだと当然ダメということでしょうか。

  • 逆行列 求め方

    逆行列の求め方について。 以下の内容はすべてdet(A)≠0:逆行列が存在することを前提にします。 2行2列の場合は、添付画像のように逆行列を求めていました。 これは、通常3行3列などで逆行列を求める場合に使う A^-1=A^~/|A|を簡単にしたものだと考えておりました。 式が見づらくてすいません。A^-1:逆行列、A^~:余因子行列です。 ここで質問なのですが、 2行2列の余因子行列は添付画像にある行列になるのでしょうか? 3行3列の場合はテキストなどに記載されている方法でわかるのですが 同様の方法では2行2列の余因子行列は作れません・・・ また、余因子行列を作る際に小行列式なるものが出てきます。 この小行列式と呼ばれるものは見た目は行列なのになぜ行列式 と呼ばれるのでしょうか? URL:http://kagennotuki.sakura.ne.jp/la/node5.html 以上、ご回答よろしくお願い致します。

  • 行列の推定について

    Y=[x y]で、Yは20行2列の行列とします。 (xとyも行列で、各々20行1列の行列です) U=[Ux UY]で、Yと同様に20行2列の行列とします。 (UxとUyも行列で、各々20行1列の行列です) 今、YとUの行列のすべての値が分かっているとします。 この時、Y=A*Uという関係を満たす行列Aはどの様にして求めたらいいでしょうか? 私は、最小二乗法を試しました。 http://www.eli.hokkai-s-u.ac.jp/~kikuchi/ma2/chap08.htmlを参考にして、 A=inv(U'*U)*U'Y としました。 invは逆行列、U'はUの転置行列を表します。 上記の最小二乗法で、Aを求めることは正解なのでしょうか? また、最小二乗法を実行すると、Aに誤差が生じますよね。 その誤差はどのようにして計算したら、よろしいのでしょうか? y=ax+bの様なものに対する誤差伝播法はわかるのですが、Y=A*Uのような行列に対する誤差伝播法はわかりません。

  • 逆行列(数学C)

    A=1 2  とし、AインバースをAの逆行列とする   2 3  とき、A+kAインバースが逆行列をもたないようなkの値をもとめなさい。これは、どうやって求めたらいいのですか?教えてください☆ちなみに、Aは2行2列の行列で答えは、-9±4√5です! 

  • 2x3行列の逆行列の公式

    数学にあまり詳しくないものです。 ある問題の解法を解析し、3x3逆行列で解いているのまで分かりました。 その問題から1行少ない、2x3逆行列を解きたいと思っています。 ネットで調べても、3x3は容易に出てくるのですが2x3が出てきません。 2x3の公式をご教授いただけますでしょうか。

  • 配列を戻り値にして逆行列を求める関数

    #include(stdio.h) int main(){ double a[4][4]={{1,2,0,-1},{-1,1,2,0},{2,0,1,1},{1,-2,-1,1}}; //入力用の配列 double inv_a[4][4]; //ここに逆行列が入る double buf; //一時的なデータを蓄える int i,j,k; //カウンタ int n=4; //配列の次数 //単位行列を作る for(i=0;i<n;i++){ for(j=0;j<n;j++){ inv_a[i][j]=(i==j)?1.0:0.0; } } //掃き出し法 for(i=0;i<n;i++){ buf=1/a[i][i]; for(j=0;j<n;j++){ a[i][j]*=buf; inv_a[i][j]*=buf; } for(j=0;j<n;j++){ if(i!=j){ buf=a[j][i]; for(k=0;k<n;k++){ a[j][k]-=a[i][k]*buf; inv_a[j][k]-=inv_a[i][k]*buf; } } } } //逆行列を出力 for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf(" %f",inv_a[i][j]); } printf("\n"); } } という、4次元正方行列の逆行列を求めるプログラムがあるのですが これを複数の行列の逆行列が求められる関数にする場合を教えてください・・行列は配列で作ってるのでよくわかりません、お願いします

  • 対称行列のルート

    n次対称行列X,Yを考えます。ともに正定値であると仮定して、正の数αがあってX≧α,Y≧αとなっているします。(固有値が全部α以上という意味です)ここで行列のノルムを考えたいのですが、たぶん別にどんなノルムでもいいと思うので、とりあえずフロベニウスノルム(成分の2乗和のルート)を考えることにします。他のノルムで示されるのであればそれでも構いません。たとえばn次元ベクトル空間への正値対称作用素だと思って作用素ノルムをとるなど。 このとき ||√X-√Y||≦||X-Y||/2√α が成り立つことを示したいのですが、どうしたらよいでしょうか。正しい式かどうかもわからないのですが、たぶん示せることだとは思うのですが。あと最悪、右辺にX,Yに無関係な定数がつくのは構わないです。なお√は対称行列の正の平方根にとります。