分子構造の重ねあわせについての質問

このQ&Aのポイント
  • 分子構造の重ね合わせについてアルゴリズムを知りたい
  • 重ね合わせる2つの分子構造の誤差を最小化する方法を教えてほしい
  • 重ね合わせのアルゴリズムには行列計算や最小二乗法を使用するのか気になる
回答を見る
  • ベストアンサー

分子構造の重ねあわせ (行列、最小二乗法など?)

すいません、化学っぽい内容の質問なのですが、 アルゴリズムは数学になると思うのでこちらで質問させていただきます。 また、説明不足を補うために一部プログラムっぽい表記をさせていただきますのでご了承ください。 現在、分子構造を比較するためのプログラムを作成しています。 そのプログラムに構造の「重ね合わせ」機能を追加したいのですが そのアルゴリズムに最小二乗法などが必要らしく、悩んでいます。 (詳細は長くなるので下に書きます) 分かる方がいましたらご教示お願いします。 よろしくお願いします。 ■重ね合わせについて 分子構造のデータは、各原子がそれぞれX, Y, Z座標の3つの値を持っています。 例えば、200原子からなる分子のデータ構造は以下のようになります。 Atom { double x; double y; double z; } Atom atom = new Atom[200]; 重ね合わせる2つの構造は原子数は同じとします。なので、分子構造2つをa1, a2とし、 対応する点の誤差をとっていくと、誤差の平均を求める計算は以下のようになります。 Atom a1 = new Atom[200]; Atom a2 = new Atom[200]; double d = 0; for (i = 0; i < a1.length; i++) d += sqrt(pow((a1[i].x-a2[i].x),2) + pow((a1[i].y-a2[i].y),2) + pow((a1[i].z-a2[i].z),2)); d = d / a1.length; このdの値が最小値をとるようにa2の原子の座標を変更することを「重ね合わせ」と定義します。 ■重ね合わせのアルゴリズムについて 基準となる構造に対し、もう一つの構造を並進や回転によって合わせる感じになると思います。 今回質問する箇所はこのアルゴリズムになります。 この際に行列計算や最小二乗法を使うことになるかと思われます。 ■質問者の考え 途中まで、しかも間違っている可能性がありますが私の考えたアルゴリズムを追記しておきます。 (i) a1, a2の重心を求める double x1 = y1 = z1 = x2 = y2 = z2 = 0; for (i = 0; i < a1.length; i++) { x1 += a1[i].x; y1 += a1[i].y; z1 += a1[i].z; x2 += a2[i].x; y2 += a2[i].y; z2 += a2[i].z; } x1 = x1 / a1.length; y1 = y1 / a1.length; z1 = z1 / a1.length; x2 = x2 / a1.length; y2 = y2 / a1.length; z2 = z2 / a1.length; a1の重心(x1, y1, z1)とa2の重心(x2, y2, z2)が求まります。 (ii) 重心の誤差を求め、誤差をa2の各原子の座標に反映させる xd = (x2 - x1); yd = (y2 - y1); zd = (z2 - z1); for (i = 0; i < a1.length; i++) { a2[i].x -= xd; a2[i].y -= yd; a2[i].z -= zd; } この方法で誤差はかなり小さくなります。しかし、最小値にはなってないと思われます。 なので、この方法が正しいのかよく分かりません。

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

  • ベストアンサー
回答No.1

こんにちは. ソースコードは良く見てませんが… 要するに合同であることが期待されるn点のデータ集合XとX'に関して, Σ ||Xi' - (R*Xi+T) ||^2 -> min なる回転と並進ベクタを計算したいと考えます. ここで,XiとXi'はi番目の座標を意味する3次元ベクタであり, 総和演算は範囲(i=1,...,n)とします. 質問者様の方法では上記の変換(R,T)に関して, 並進量Tまでしか解決できません. ここからさらに回転量Rを解決する必要があります. 基本的な戦略は相関行列を特異値分解してRを決定します. Rの推定には質問者様の方法で重心を合わせたXとX'に関して M = Σ Xi'*Xi^T なる3*3相関行列を計算し,M -> U*D*V^T と特異値分解します(^Tは転置記号). 最小二乗の意味で最適なRは R = U*V^T で計算できます. ただし,回転の向きは適宜調整してください. データ集合XとX'が相似の意味で同じである場合は 重心を会わせた後にスケール調整を行ってください.

theo4104
質問者

お礼

回答ありがとうございます。 やはり行列計算が必要になるのですね。 ちょっと難しいですが調べてみます。 大変参考になりました。

関連するQ&A

  • 最小二乗法?

    i 個の測定点 (x[i],y[i]) を,最小二乗法などを用いて下記の式にフィッティングさせようと考えています。Visual Basic で作成した測定プログラムの中で使用したいのですが,具体的にどのようなアルゴリズムでフィッティングを行えばいいのか分かりません。 Y = A * sin(X - C)^2 + B 実測する x[i] の範囲は狭く,例えば -15°~ +15°まで 0.2°毎の計 151 プロット,といった感じです。そして定数 A,B,C の内,最も高い精度で求めたい定数は C です。測定の段階で x の範囲を狭めているのは,正確な C (通常 1°未満)を求めるためです。 この測定は x[i] にはほとんど誤差が含まれませんが y[i] には誤差があります。y[i] の含まれている誤差は試料によってまちまちなので,一概には言えません。目視ではほとんど誤差が分からない綺麗なカーブの場合,逆に目視で辛うじて下に凸の曲線が分かる程度の場合,どちらもあり得ます。 考え方だけでも構いませんので,どうかご教授下さい。よろしくお願いいたします。

  • 3次元の最小二乗法

    A(x1,y1,z1)とB(x2,y2,z2)とC(x3,y3,z3)とD(x4,y4,z4)の点で 最小2乗法ほうを使い直線近似したいのですが、どのような式になりますかご存知の方教えていただけますか?

  • 最小二乗法 行列

    現在以下のページを参考に最小二乗法の勉強をしています。 誤差の二乗ノルムを求めるときに、  || e || ^2 = e*e = (y-Ax)*(y-Ax) = (y*-x*A*)(y-Ax) = y*y - y*Ax -x*A*y + x*A*Ax  (1) この次に        = y*y - 2y*Ax + x*A*Ax と変形できるのはなぜなんでしょうか? (1)の第3項目 x*A*y が第2項目と等しくなる過程が分かりません。 後、次の二乗ノルムを微分する過程も良くわかりません。 すみませんが、よろしくお願いします。 http://www.star.t.u-tokyo.ac.jp/~kaji/leastsquare/leastsquare_main.htm

  • 最小2乗法などによる推定について

    2次による推定(近似?)を行っているのですが、 (a1*x^2+a2*x+a3)(a4*y^2+a5*y+*a6)(a7*z^2+a8*z+a9) =c1*x^2*y^2*z^2+c2*x^2*y^2*z+・・・・・・+c27 上記の式の場合、最終的に係数cが1から27まででてくるとおもいます。この係数はどのようにして求めればよいのでしょうか? なお、x,y,zは既知の数です。 見にくく、わかりづらいかと思いますがよろしくお願いいたします。

  • 最小二乗法による残差の和について

    質問させていただきます。 最小二乗法による残差の和が0になることが保障されているのは以下のどれでしょうか? 1、Y=βX+ε 2、Y=α+βX+ε 3、Y=αX+βZ+γW+ε 4、Y=α+βX+γZ+δW+ε ただし、X,Y,Zは説明変数である。また、εは誤差項を表す よろしくお願い致します。

  • 重みつき最小二乗法の誤差

    まず、条件を書かせていただきます。 ln(DZ)=ax+B a=-1/T x:条件(x=1、x=5) Z:xを決めると決まる値。(例:x=1ならZ=20、x=5ならZ=68) B:定数 D:条件xの時に行なった測定の測定値 (x=1のときに行なった測定値をD1、x=5のときに行なった測定値をD5) ln(DZ)=yとすれば、y=ax+Bとなります。 一回の測定すると、x=1とx=5に対するD1とD5を測定できます。 一回の測定操作をηとします。 上記の条件で、下記に示す2種類の方法でTの平均値とTの誤差を求めます。 (1) ηを行なうことにより、aとTを求めることができます。 ηを10回行なうことにより、10個のTを求めるます。 10個のTからTの平均値とTの誤差を求めます。 (2) ηを10回行なうことにより、10個のD1と10個のD5を求めるます。 10個のD1と10個のD5を使い、重みつき最小二乗法によって Tの平均値とTの誤差を求めます。 どちらの方法でも平均値と誤差は出ますが、 どちらの方がより正確にTの平均値と誤差を求めることができるのでしょうか。 根拠を示した上で教えてください。 じっくり考えてみましたが、よくわかりません。 文章がおかしいために 、たぶん質問の内容自体が理解できない可能性が高いので分からないことがあれば教えてください。 もし、参考になるホームページや本などがあればご紹介ください。 よろしくお願いいたします。

  • 球の最小二乗法について

    はじめまして. 工学部の学生です. 球の中心座標と半径を求める最小二乗法について教えてください.お願いします. 私も,エクセルを使って式を立てて計算したのですが,中心がどうしてもずれてしまいます. |Σx^2 Σxy Σzx Σx | |a|  |-Σ(x^2+y^2+z^2)x| |Σxy Σy^2 Σzy Σy | |b| = |-Σ(x^2+y^2+z^2)y| |Σzx Σyz Σz^2 Σz | |c|  |-Σ(x^2+y^2+z^2)z| |Σx  Σy  Σz   n | |d|  |-Σ(x^2+y^2+z^2)| この式をクラーメルの公式を使って解いて x=-a/2 y=-b/2 z=-c/2 r=√{(a^2+b^2+c^2)/4-d} で,計算したのですが,答えがうまく求まりません. どなたか教えていただけないでしょうか.

  • gnuplotでの最小二乗法について。

    他のカテで質問したのですが、 こちらの方が関係性が深いと思い移動しました。 y,x1,x2 を測定データとして、線形関数 y=a*x1-b*x2 におけるパラメータ a,b をgnuplotを使って最小二乗法で求めたいのですが、参列のデータ(x1,x2,y)を用意して、 f(x)=a*x1-b*x2 fit f(x) "data.dat" via a,b とうった時点で、undefined variable: x1 とエラーが出てしまいます。 どうすればよいでしょうか。よろしくお願いします。

  • 最小二乗法の推定値の誤差

    変数xを変化させたときの測定値yを最小二乗法で二次式y=a*x^2 + b*x +c にフィッティングさせ推定値a, b, cを求めるとき、 測定値yの誤差がδyであるときの推定値a, b, cの誤差を求めたいのです。 具体的には、(x,y)=(-1,2), (0,0), (1,1.5), (2,5) の4つのデータを 二次式にフィッティングさせたときのa,b,cはa=1.375, b=-0.325, c=0.225ですが、 測定値yの測定誤差が0.1のときのa,b,cの誤差を求めたいのです。 よろしくお願いします。

  • モデルの違いによる最小2乗解

    ある観測値Yiをaix1+biz+eiというモデルを用いて連立方程式をたて、eの2乗を最小にする未知数 x1、zを特異値分解法を用いて(x1、z)=(0,10)と言う解を得たとします。 ここでiは観測数、ai,biは既知の係数、eiは正規分布に従う誤差とします。 つぎに、同じ観測値Yiをa1ix1_a2ix2+biz+eiというモデルを用いて同じように未知数x1、x2、zを求めたとき、つまりひとつ未知数を増やした場合、その解は(x1、x2、z)=(0,0,10)とはなりませんでした。ここで、a1i, a2i,biは既知の係数、iは3以上、biは前のモデルと同じ係数。 感覚的にそうならないだろうと思いますが、なぜそうならないのか、うまく説明できません。お力をお借りできれば幸いです。 よろしくお願いいたします。