SO(3)への射影関数
任意の三次元回転SO(3)と回転ベクトルとの対応を考えると
つまり、は3次元ベクトルをSO(3)の3×3行列に変換する関数である。
回転行列の性質
以下のような2つの座標があるとする。をそれぞれ座標系Aにおいて座標Bのx軸、y軸、z軸を表すベクトルであるとする。 このとき
となる。これは
が成立することから理解できる。
射影関数に関する定理
参考: https://arxiv.org/pdf/1512.02363.pdf
skew symmetric matrixに関する定理
- 任意のベクトル、に対して
証明
成分を書き下すことで容易に示せる。
- 任意のベクトル、に対して
証明
- SO(3)の行列とベクトルに対して
証明
任意のベクトルとを導入し、
式を見比べると
特にがSO(3)回転群であれば
逆変換に関する定理
任意の座標系、について
証明
SE(3)の4×4行列を考えると、逆変換は
となるべきなので
left null space
ある行列に対するleft null spaceとは
を満たすベクトルの集合のことである。left null spaceの次元は行列の列数から行列の次元(rank)を引いたものである。
行列の性質
逆行列と転置の可換性
正方行列に対して逆行列が存在するとき、転置と逆行列は可換である。すなわち
証明
となることが示せるので、逆行列の定義よりはの逆行列であること、すなわち
が示された。
Gram行列に関する性質
行列に対してをGram行列と呼ぶ。
- 定理:Graph行列のrankは元の行列のrankに等しい
となるのでとなることが示された。
- であるとき
となるのでとなることが示された。
以上よりとのカーネル空間が一致するのでrankも一致する。
Gram-Schmidtの直交化法
一時独立なベクトルの組から、正規直交規定を作成する手順である。
1. によりを求める。
2. としてを求め、によりを求める。
3. としてを求め、によりを求める。
以下同様である。イメージ的には、既に基底が張られた平面にを射影し、その射影ベクトルとの差分ベクトルを求めることで基底平面に垂直なベクトルを求めることに相当する。
参考
グラム・シュミットの直交化法とQR分解 - 初級Mathマニアの寝言
グラムシュミットの直交化法の意味と具体例 | 高校数学の美しい物語
QR分解
任意の行列に対するQR分解とは、あるの直行行列との上三角行列を使って
と分解することである。任意の行列に対してこのように分解できることが保証されている。行列との次元によって「full QR分解」と「reduced QR分解」の2通りがある。
QR分解に関する定理
であり、行列がフルランクである()とき、reduced QR分解による行列は正則行列となる。またこのとき対角成分が全て正となるようなが一意に存在する。
QR分解ができることの証明
行列のをと表すとする。なので、上の列ベクトルは互いに一時独立である。したがってGram-Schmidtの直交化法を行うことで
が求まる。は正規直交基底である。これをについての形に直すと
となる。行列の形で書くと
となりQR分解できることが示せた。変形のイメージとしては である。これはreduced QR分解の形であるが、適当に基底を足しつつR側にも0成分の行を足すことで
となり、full QR分解の形に持っていくこともできる。
Eigenを使ったQR分解
EigenのcolPivHoseholderQrを使うと、Rの対角要素が絶対値の降順にソートされたQR分解が実施できる。具体的には交換行列を使って
と分解できる。この動作を確かめてみる。
#include <Eigen/Dense> #include <iostream> int main() { Eigen::Matrix3f A; A << 1,2,3,4,5,6,7,8,10; auto qr = A.colPivHouseholderQr(); const Eigen::Matrix3f Q(qr.householderQ()); Eigen::Matrix3f R; R.triangularView<Eigen::Upper>() = qr.matrixR().triangularView<Eigen::Upper>(); const auto p = qr.colsPermutation().indices(); Eigen::Matrix3f P; for (int i=0; i<3; i++) { for (int j=0; j<3; j++) { P(i, j) = (p[j]==i)?1:0; } } std::cout << "p=\n" << p << std::endl; std::cout << "P=\n" << P << std::endl; std::cout << "AP=\n" << A * P << std::endl; std::cout << "QR=\n" << Q * R << std::endl; };
g++ -I/usr/local/var/homebrew/linked/eigen test.cpp
出力結果
p= 2 0 1 P= 0 1 0 0 0 1 1 0 0 AP= 3 1 2 6 4 5 10 7 8 QR= 3 0.999999 2 6 4 5 10 7 8
となり、とが一致することが確認できた。
参考
グラム・シュミットの直交化法とQR分解 - 初級Mathマニアの寝言
QR分解ができると何が嬉しいか
QR分解をすることで、
の方程式をの逆行列を計算せずに求めることができる。
をのフルランク行列、をn行ベクトル、をm行ベクトルとする行列をのようにreduced QR分解(は、は)したとすると、
ここでは正則な上三角行列になるから、対角成分は左上から右下まで0でない値が詰まっている。したがって、各行この方程式を下の行から解いていくことで、の逆行列を計算しなくてもを求めることができる。
LU分解
LU分解とは
の正方行列に対して、の下三角行列と上三角行列を使って
と分解することである。
LU分解できる必要十分条件
LU分解できる必要十分条件は、「の全ての主座小行列の行列式が0にならないこと」である。
ここで、の主座小行列とは、各に対して
の行列である。
特異値分解(SVD)
特異値分解(Singular Value Decomposition)とは、正方行列に限らない任意のの行列(rankをとする)をとの直行行列およびの対角行列を使って
と分解する操作である。の対角成分は値が大きい順にソートすることができる。任意の行列に対してこの分解ができることが保証されている。これは正方行列に対する固有値分解を非正方行列に拡張したようなものである。固有値分解に必要な直行行列は1種類であったが特異値分解に必要な直行行列は2種類である。特異値分解は次元削減によく使われて、これはのうち値が大きいもののいくつかのみを使うというイメージである。もう少しわかりやすい形で示すと
となるので、が行列の係数としてかかっている。なのでが大きいものをいくつか取れば行列におおよそ近いものを得ることができる。行列の自由度はであるのに対して行列はの自由度なので、小さい自由度の行列で大きい自由度の行列を表現しようとしている操作に対応することがわかる。
特異値分解の主成分分析への応用
ある次元の観測が個あったとき、観測行列は
という行列で表される。
主成分分析はの固有値問題として表される。これは特異値分解を使って解くことができる。
の特異値分解をとすると
となる。は対角行列なのでので、これはで対角化できていることになる。すなわち共分散行列の固有ベクトルがで表されることを意味するので、主成分がで表されることを意味する。
数学的にはの固有ベクトルを求めることとの特異値分解をすることで同等の結果が得られることが示されたが、数値計算を行う上ではここにあるように特異値分解の方が数値計算誤差を小さくできるらしい。
ベクトルでの微分
をベクトル、を行列とする。
参考
Frobenius norm
行列に対するFrobenius normの二乗 は
と定義される。また
となる。
証明
となるので
となり題意は示された。
参考
https://lcvmwww.epfl.ch/teaching/modelling_dna/index.php?dir=exercises&file=corr02.pdf