機械学習基礎理論独習

誤りがあればご指摘いただけると幸いです。数式が整うまで少し時間かかります。リンクフリーです。

勉強ログです。リンクフリーです
目次へ戻る

球面線形補間

はじめに

球面線形補間は四元数でよく使われますが、四元数だけのものではありません。
ベクトルの球面線形補間も結構使われます。

ベクトルの線形補間

まずは、ベクトルの線形補間を復習しましょう。

上図に示したようにベクトル {\bf x},{\bf y} をとります。{\bf x},{\bf y} の先端を結ぶベクトル {\bf y}-{\bf x} 上にある1点 P(t) をとり、
この点 P(t) と原点 O とを結ぶベクトル {\bf z} を考えます。この {\bf z} は以下のように表すことができます。

\begin{eqnarray}
{\bf z}={\bf x}+t({\bf y}-{\bf x})\tag{1}
\end{eqnarray}
(1) は次のようにも表せます。
\begin{eqnarray}
{\bf z}=(1-t{)\bf x}+t{\bf y}\tag{2}
\end{eqnarray}
通常、線形補間と言えば、(1) または (2) の式で表されます。
なお、t\in[0,1] です。

ベクトルの球面線形補間

ベクトルを使って、球面線形補間を求めます。

線形補間同様、{\bf z}{\bf x},{\bf y}t\in[0,1] を使って表します。
球面線形補間なので、||{\bf x}||=||{\bf y}||=||{\bf z}||=r の条件が付きます。
{\bf x}{\bf y} が直交しているなら、{\bf x},{\bf y} のなす角を \theta とおくと、以下のように書けます。

\begin{eqnarray}
{\bf z}=\left(\cos t\theta\right){\bf x}+\left(\sin t\theta\right){\bf y}\tag{3}
\end{eqnarray}
{\bf x}{\bf y} が直交していない場合、Gram-Schmidtの直交化法でベクトル {\bf v} を求め、大きさを r した {\bf w} を得ればよいです。

ベクトル {\bf w} の導出

{\bf x} に直交するベクトルを {\bf v} とします。

\begin{eqnarray}
{\bf v}={\bf y}-a{\bf x}\tag{4}
\end{eqnarray}
ここで、a は未定の係数です。{\bf v}^\top{\bf a}=0 より、aを求めます。
\begin{eqnarray}
 &&{\bf v}^\top{\bf x}=0\\ 
 &\Rightarrow&({\bf y}-a{\bf x})^\top{\bf x}=0\\
 &\Rightarrow&{\bf y}^\top{\bf x}-a{\bf x}^\top{\bf x}=0\\
&\Rightarrow& a=\dfrac{{\bf y}^\top{\bf x}}{||{\bf x}||^2}=\cos\theta\tag{5}
\end{eqnarray}
ここで、||{\bf v}||^2 を求めておきます。
\begin{eqnarray}
&&||{\bf y}||^2=r^2\\
&\Rightarrow&{\bf y}^\top{\bf y}=r^2\\
&\Rightarrow&({\bf v}+(\cos\theta){\bf x})^\top({\bf v}+(\cos\theta){\bf x})=r^2\\
&\Rightarrow&{\bf v}^\top{\bf v}+2(\cos\theta){\bf v}^\top{\bf x}+{\bf x}^\top{\bf x}=r^2\\
&\Rightarrow&||{\bf v}||^2=(1-\cos^2\theta)r^2\\
&\Rightarrow&||{\bf v}||^2=\sin^2\theta\ r^2\tag{6}
\end{eqnarray}
{\bf v} の大きさを r にしたベクトルを {\bf w} とします。
\begin{eqnarray}
{\bf w}=N{\bf v}\tag{7}
\end{eqnarray}
N は定数です。||{\bf w}||=r より、N を求めます。
\begin{eqnarray}
&&||{\bf w}||=r\\
&\Rightarrow&||{\bf w}||^2=r^2\\
&\Rightarrow&N^2||{\bf v}||^2=r^2\\
&\Rightarrow&N^2=\dfrac{r^2}{||{\bf v}||^2}=\dfrac{1}{\sin^2\theta}\\
&\Rightarrow&N=\dfrac{r}{||{\bf v}||}=\dfrac{1}{\sin\theta}\ \ \ (\because N > 0)\tag{8}
\end{eqnarray}
(4),(7),(8) より、{\bf w} が求まります。
\begin{eqnarray}
{\bf w}=\frac{1}{\sin\theta}\left({\bf y}-(\cos\theta){\bf x}\right)\tag{9}
\end{eqnarray}

{\bf w} を代入し、式を整理

(9){\bf w}(3){\bf y} に代入します。

\begin{eqnarray}
{\bf z}&=&\left(\cos t\theta\right){\bf x}+\left(\sin t\theta\right)\frac{1}{\sin\theta}\left({\bf y}-(\cos\theta){\bf x}\right)\\
&=&\left(\cos t\theta-\frac{\sin t\theta\cos\theta}{\sin\theta}\right){\bf x}+\frac{\sin t\theta}{\sin\theta}{\bf y}\\
&=&\frac{\sin(1-t)\theta}{\sin\theta}{\bf x}+\frac{\sin t\theta}{\sin\theta}{\bf y}\tag{10}
\end{eqnarray}
(10) が球面線形補間の式です。

四元数の球面線形補間

2つの単位四元数 q_1=(s_1,{\bf v}_1),q_2=(s_2,{\bf v}_2)\in{\mathbb H},\ t\in[0,1] に対して、球面線形補間の式は以下のようになります。

\begin{eqnarray}
q(t)=\frac{\sin(1-t)\theta}{\sin\theta}{\bf p}_1+\frac{\sin t\theta}{\sin\theta}{\bf p}_2
\end{eqnarray}
このときの \theta\cos\theta=q_1\cdot q_2=s_1s_2+{\bf v}_1^\top{\bf v}_2 を満たす角です。
通常、記号 q(t) は使わず、{\rm Slerp}(q_1,q_2;t) のように書かれます。

続けて球面線形補間をする場合

例えば、3つの単位四元数 q_1,q_2,q_3 に対して、q_1 から q_2 の球面線形補間の後、続けて q_2 から q_3 の球面線形補間を行うと、q_2 でカクついて見えることがあります。(まあ個人的には別にええかなと思います。)
それについて以下のサイトでそれを避ける方法について記載があります。
回転の表現について - 球面線形補間
Quaternion Algebra and Calculus

目次へ戻る