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