線形変換の定義みても重要性がいまいちわからん。線形変換と行列ってどんな関係なの?

何で線形変換を特別扱いしなきゃいけないんだろう・・・
と考えたことないだろうか?

線形変換とは、次のような性質を満たす変換のことだ。 線形変換(※) $$ f(a \mathbf{x} + \mathbf{y}) = a f(\mathbf{x}) + f(\mathbf{y}) $$ 日本語で言うと、線形変換  f は、 「入力値を線形重ね合わせした後に  f を作用させた結果は、各々の入力に fを作用させた出力値を線形重ね合わせたものと同じになるような変換」である。
・・・で、こんな特殊な変換が一体何の役に立つのか? と疑問に思っている人も多いと思う。 それは、初めて線形代数を学ぶときに持つ疑問の一つだ。 逆に言うと、線形変換の重要性を「大事だよなあ」としみじみ思えるような人は、この投稿を読んでいないだろう。
さて、前口上はこの辺にして、一体、この性質のどこが大事だというのであろうか。 また、この性質が、行列やベクトルとどのような関係があるというのだろうか。

多変数の線形変換:入出力の関係を記述せよ

突然だが、次のような(アホらしい)例を考えてみよう。
あなたの目の前には、3つのつまみがついたAVアンプがある。 そのAVアンプには、テレビとスピーカーが接続されており、 これらのつまみを回すと、音のボリュームと画面の明るさが変化するようにできている。 普通の人間なら、どれかのつまみが音のボリュームに対応し、もう片方が画面の明るさに対応していると考えるはずだ。 しかし、このアンプはそうでなかった。 どこか頭のイカれた開発者は、その操作を混ぜあわせてしまったのだ。 3つのつまみを、それぞれ、つまみA,つまみB,つまみCと呼ぶことにすると、 つまみAだけを回してもボリュームと画面の明るさの両方が変化してしまうのだ。 つまみB、つまみCを回しても、ボリュームと画面の明るさの両方が変化してしまうが、その変化の仕方はそれぞれ違うようだ。 ただし、入出力が線形関係であることは間違いない(つまり、つまみの回転量と変化の程度とが比例しており、つまみA、つまみB、つまみCによる変化を足し合わせたものが、全体の変化となる)。

さて、この厄介な入出力関係の数学的な記述を考えてみよう。

変換を数式で記述

まずはこの状況を数学的に記述したい。 そのための道具は 基底 である。 つまみAを時計回りに1度回転させることを基底1として  \mathbf{e}_1 と書き、 同様に、 つまみBを時計回りに1度回転させることを基底2:  \mathbf{e}_2、つまみCを時計回りに1度回転させることを基底3:  \mathbf{e}_3 と書こう。 そして、基底のスカラー倍でツマミの角度を何倍かにすることとすると、つまみの取りうるすべての状態は、  a^{1} \mathbf{e}_1 + a^{2} \mathbf{e}_2 + a^{3} \mathbf{e}_3 の形に書くことができる。

さらに、この入力に対してボリュームと明るさという出力が決まるのだから、出力側の状態にも基底を導入しよう。今回は、音量が1で明るさが0 である状態を基底  \mathbf{E}_1、音量が0で明るさが1である状態を基底  \mathbf{E}_2とする。これらの基底のスカラー倍は、ボリュームと明るさの程度の倍率を表すことにすると、出力側の任意の状態は  b^{1} \mathbf{E}_1 + b^{2} \mathbf{E}_2 の形で書ける。

入出力関係は、線形変換( Tと呼ぼう)で結ばれているのだから、これを式で書くと、  b^{1} \mathbf{E}_1 + b^{2} \mathbf{E}_2 = T(a^{1} \mathbf{e}_1 + a^{2} \mathbf{e}_2 + a^{3} \mathbf{e}_3)
となる。

線形変換とは、どのような変換であったかというと、線型結合した入力を変換して出力したものは、それぞれの入力を変換した結果を線型結合したもので表せるという関係式(※)を満たすことであった。つまり、
 T(a^{1} \mathbf{e}_1 + a^{2} \mathbf{e}_2 + a^{3} \mathbf{e}_3) = a^{1} T(\mathbf{e}_1) + a^{2} T(\mathbf{e}_2) + a^{3} T(\mathbf{e}_3)
である。

この意味するところは、「基底  \mathbf{e}_1、基底  \mathbf{e}_2、基底  \mathbf{e}_3 のそれぞれの変換先、  T(\mathbf{e}_1),  T(\mathbf{e}_2), T(\mathbf{e}_3) を知っていれば、任意の入力についての変換先(左辺)は、右辺のように T(\mathbf{e}_1) T(\mathbf{e}_2) T(\mathbf{e}_3) の線型結合で計算できてしまいますよ」ということだ。

これはすごい!
これが研究者やエンジニアが 線形性 を重宝する理由のひとつだ。 今回の例の場合は、3つの基底に対応するつまみの状態に対して、その出力を調べてメモっておけば(たった3回の実験でよい)、あとはどんなツマミの状態であったとしても、メモにある基底の変換先をブレンド(線型結合)するだけで、答えが求まってしまうということである。 式で書くならば、  \mathbf{e}_i  \ (i=1,2,3) の変換先  T(\mathbf{e}_i) が、実験によって
$$ \begin{align} T(\mathbf{e}_1) &= t^{1}_1 \mathbf{E}_1 + t^{2}_1 \mathbf{E}_2, \\ T(\mathbf{e}_2) &= t^{1}_2 \mathbf{E}_1 + t^{2}_2 \mathbf{E}_2, \\ T(\mathbf{e}_3) &= t^{1}_3 \mathbf{E}_1 + t^{2}_3 \mathbf{E}_2 \end{align} $$ であると分かってしまえば、 入力  a^{1} \mathbf{e}_1 + a^{2} \mathbf{e}_2 + a^{3} \mathbf{e}_3 に対する変換先は、

$$ \begin{align} & T(a^{1} \mathbf{e}_1 + a^{2} \mathbf{e}_2 + a^{3} \mathbf{e}_3) \\ &= a^{1} T(\mathbf{e}_1) + a^{2} T(\mathbf{e}_2) + a^{3} T(\mathbf{e}_3) \\ &= a^{1} (t^{1}_1 \mathbf{E}_1 + t^{2}_1 \mathbf{E}_2) + a^{2} (t^{1}_2 \mathbf{E}_1 + t^{2}_2 \mathbf{E}_2) + a^{3} (t^{1}_3 \mathbf{E}_1 + t^{2}_3 \mathbf{E}_2) \\ &= (a^{1} t^{1}_1 + a^{2} t^{1}_2 + a^{3} t^{1}_3) \mathbf{E}_1 + (a^{1} t^{2}_1 + a^{2} t^{2}_2 + a^{3} t^{2}_3) \mathbf{E}_2 \end{align} $$
と計算できてしまう。

さらに行列で記述

上の計算を見通しよく記述する方法、それが行列記法である。 まず、それぞれの基底を数ベクトルと対応づけしよう。 入力側の \mathbf{e}_1(つまみAを時計回りに1度回転)を、数ベクトル:  (1,0,0)^{T} に対応付けし、 \mathbf{e}_2(つまみBを時計回りに1度回転)を数ベクトル: (0,1,0)^{T} \mathbf{e}_3(つまみCを時計回りに1度回転)を数ベクトル: (0,0,1)^{T}と対応付けする。 出力側も同様に、 \mathbf{E}_1 (音量が1で明るさ0)を  (1,0)^{T} \mathbf{E}_2 (音量が0で明るさ1)を  (0,1)^{T} に対応付けすると、 まえの小節で計算した結果から、このAVアンプの入出力関係は $$ \left( \begin{matrix} b^1 \\ b^2 \end{matrix} \right) = \left( \begin{matrix} t^1_1 & t^1_2 & t^1_3 \\ t^2_1 & t^2_2 & t^2_3 \end{matrix} \right) \left( \begin{matrix} a^1 \\ a^2 \\ a^3 \end{matrix} \right) $$ と書ける。 これは、3つのつまみの回転という入力を、音量と明るさという出力へ変換する関係を行列で表したものである。

さて、ここで少し豆知識というか、当たり前かもしれないことを書いておこう。 上の行列表現、特に、変換行列 $$ \left( \begin{matrix} t^1_1 & t^1_2 & t^1_3 \\ t^2_1 & t^2_2 & t^2_3 \end{matrix} \right) $$ を見た時、複雑に見えるというか、あまりピンと来なかった人もいるかもしれない。 「確かにこう書けることは検算できるけど、この形に書けることをよく思いついたよね」とか、思っている人がいると思う。私もそう思った時があった。 しかし、この数値の並び方、導出過程に立ち返ると、ほとんど自明なのである。 もともとは、変換式を基底を明示して下のように書いた。 $$ b^1 \mathbf{E}_1 + b^2 \mathbf{E}_2 = a^1 T(\mathbf{e}_1) + a^2 T(\mathbf{e}_2) + a^3 T(\mathbf{e}_3) $$ これを、成分で書いてみよう。 $$ \left( \begin{matrix} b^1 \\ b^2 \end{matrix} \right) = a^1 \left( \begin{matrix} t^1_1 \\ t^2_1 \end{matrix} \right) + a^2 \left( \begin{matrix} t^1_2 \\ t^2_2 \end{matrix} \right) + a^3 \left( \begin{matrix} t^1_3 \\ t^2_3 \end{matrix} \right) $$ 上の表記はかなり分かりやすいと思う。 これをもう一回コンパクトに書きなおしたものが、 $$ \left( \begin{matrix} b^1 \\ b^2 \end{matrix} \right) = \left( \begin{matrix} t^1_1 & t^1_2 & t^1_3 \\ t^2_1 & t^2_2 & t^2_3 \end{matrix} \right) \left( \begin{matrix} a^1 \\ a^2 \\ a^3 \end{matrix} \right) $$ という表記である。
変換行列の第1列目  (t^1_1, t^2_1)^T は、入力側の基底  \mathbf{e}_1 の変換先を、出力先の基底で成分表記したものである。 第2列目、第3列目も同様に、入力側の第2基底、第3基底の変換先を成分表示で縦に並べたものにすぎない。行列・ベクトル積の解釈のひとつは、このように、それぞれの基底の変換先を縦ベクトルで並べてあって、それを入力側の成分の重みで足し合わせている、と見ることである。

基底と成分はいつでもセットで考えて!

行列表現には、ひとつ重要な注意点がある。 行列にすると、単に成分という数値を並べ立てたものであるため、基底がなんであったかの情報が完全に見えなくなってしまう。だから、結果を解釈する際には、入力側と出力側の基底がどのようにとられているのかを思い出す必要がある。また、同様の注意であるが、基底を定めているから成分が決まっているのであり、成分の数字だけでは何の意味もないのである。基底の決め方を変えてしまえば、その成分の値も対応して変わってしまうのだ。 例えば、今回の例で言えば、基底1を、「つまみAを時計回りに1度回すこと」から、「つまみAを時計回りに2度回すこと」と変えてしまえば、基底1に対する変換行列の成分( t^1_1, t^2_1)は半分に変えなければならない。 しかし、基底の取り換えに伴って成分の値は変化するかもしれないが、もともとあるAVアンプの入出力の関係自体が変わるわけではない。基底を取り替えたために、表現行列の数値(成分)が変わっただけなのだ。 大切なことなのでしつこく繰り返すが、成分の値だけでは何の意味もないのだ。常に基底とセットにして、初めて意味がある値だということを心に留めておいてほしい。

基底と成分


意味がわからないながらも、とにかく行列の計算だけはできるようにトレーニングを積んできた人も多いと思う。 さあ、ここからが本番だ。 計算のやり方はわかっても、それがどんな意味を持っているのかを理解しないままでは応用が全く効かない。 これから、線形代数では一体何を操作しているのかを説明していこうと思う。 最終目的は、計算練習の最後でやった「対角化」の意味を理解することだ。 意味を理解したら、様々な教科書で現れる対角化のシーンで、「そりゃあ、ここでは対角化して議論するよな」と思えるようになるし、線形代数を実務でも役に立てることができるようになるだろう。

基底の導入:電話で幾何を伝える

いきなりだけど、こんな場面を想像してみよう。 自分の手元にある図形を、電話(つまり音声のみ。絵を見せることはできない。)で相手に正確に伝えようとするシーンだ。伝えたいのは、図.1 の赤い矢印である。

f:id:FakeOwl:20180908153655p:plain
図1

数学の知識を使ってはいけない、という縛りがあったら、こんな感じだろうか。

自分:「右に向かって、矢印があるんだ。 長さはね、2 cm。」
自分:「それとは別にもう一本矢印があって、それは、さっきの矢印の左手に90度の方向に3cmのやつね。」
自分:「それで、最初の矢印の先に、2番目の矢印を継ぎ足してみて。」
相手:「オッケー」
自分:「最初の矢印のスタート地点から、継ぎ足した後の矢印のゴール地点を結んだ矢印を描いてほしい。」

まあ、標準的な伝え方だと思う。

次に、線形代数的に伝えてみたい。まず事前準備を書いておこう。

幾何ベクトルの基底、足し算、スカラー倍の定義

  • 矢印(幾何ベクトル)を太字で  {\mathbf{x, y}} 書く。
  •  {\mathbf{x}} の先頭に  {\mathbf{y}} を継ぎ足す操作を  {\mathbf x} + {\mathbf y} と書く。
  •  {\mathbf{x}} の長さを  a 倍に伸ばす操作を  a {\mathbf x} と書く。

成分表示

基底と呼ぶある幾何ベクトル  {\mathbf{E_1, E_2}} があるとき、  a {\mathbf E_1} + b {\mathbf E_2} を、成分表示として  (a, b) と書く。

上の定義を事前に了承している人同士なら、先ほどと同じ状況を次のように伝えることができる。

自分:「1つめの基底として、原点から水平に長さ1cmの矢印を書いて、これを {\mathbf{E_1}}と呼ぶことにする。」

自分:「2つ目の基底には、原点から垂直方向、つまり、 {\mathbf{E_1}}の左手90度方向に長さ1cmの矢印を書いてほしい。これを  {\mathbf{E_2}} と呼ぶことにするよ。」

自分:「僕が書いてほしい矢印は、  2 {\mathbf E_1} + 3 {\mathbf E_2} ,つまり 起点が  (0, 0)で、終点が  (2 \times 1 + 0, 0 + 3 \times 1)=(2, 3) の矢印だよ。」

f:id:FakeOwl:20180908154101p:plain
図.2

ふりかえり:代数との遭遇

さてここで、小さな、しかし重要なふりかえりをしておこう。

まず、定義としての「矢印ベクトル」の「足し算」とは、矢印ベクトルをしりとりのように継ぎ足していくことであった。これは、小学校以来使っている、いわゆる「足し算」とは違う。小学校で習った足し算は、数どうしの足し算だ。だから本当は、矢印ベクトル同士の足し算の記号には、数字の足し算を表す記号 " +" とは別の記号(例えば、 \oplus とか)を割り当てるべきだったのかもしれない。 でも、ほとんどの人は、いまここで言われるまで、矢印の継ぎ足しを表すのに" +"という記号を使ってきたことに対して特に違和感を感じてなかったと思う。 それはおそらく、数同士の足し算の持っているイメージと、矢印ベクトル同士の足し算(継ぎ足し)とに共通する概念を無意識に見いだしていたからだと思う。 同じことは、スカラー倍にも言える。ある矢印ベクトルの横につける数字はその矢印を伸ばす意味であり、ある数字の横に書いた数字(と、時には省略されてしまう  \times 記号)はその数字を何倍かにするという意味であって、本来全く別の操作である。

さて、なぜこんな細かい点をふりかえっているのか。じつは、この記号の違いに隠されていることこそが、非常に重要なのである。矢印の継ぎ足しと、数を加えるという操作とは、異なる操作である。なのにだ、ベクトル同士の足し算(継ぎ足し)を成分表示で見た時、そこに現れている操作は、「数の計算」なのである。成分表示のカッコの中に入っている足し算の記号: +、これは、正真正銘、小学校以来慣れ親しんだ数同士の足し算を表す記号だ。もちろん、途中の掛け算の操作も数同士の掛け算の操作だ。 つまりこれは何が起きているのかというと、矢印を引き伸ばしたり継ぎ足したりといった純粋に幾何学的な操作を、算術に翻訳してしまえているということだ。

これは、すごい。地味だがすごい。地味すぎて、ほとんどの人がスルーしてしまう点である。これが「代数」である。本来、算術とは無関係であったものが、算術の世界に翻訳されて取り込まれてしまったのである。一旦、算術の正解に入ってしまえば、これまでに人類が溜め込んできた様々な計算テクニックが全て使い放題だ。 線を伸ばしたり、継ぎ足したりといった操作を定規と鉛筆でシコシコと作図していてはなかなか得られないような知識も、算術という世界に翻訳したら見やすいことだってあるだろう。

いったい、この魔法のような翻訳を起こした一番の立役者は誰だろうか。 「基底」である。
基底があればこそ、成分表現が生まれたのである。成分とは、それぞれの基底が何個あるかを書いてあるだけだ。表したい矢印を基底を使ってあらわすために必要な、基底を足し合わせるブレンド比率(重み)を並べたのが成分だ。
矢印に対する操作(例えば継ぎ足し、回転)を決めたら、その操作の結果として出来る矢印もまた成分で書けるはずである。操作前の成分と、操作後の成分は当然数字なのだから、この操作に対応する数字の対応関係は関数でかけるはずだ。矢印という幾何学的な対象に対する操作が、関数という数字の計算に置き換わるのだ。

いま考えた例では矢印ベクトルに対する操作であったが、基底さえ導入できれば、つまり、考えている対象を基底の重ね合わせで書けるのであれば、どんなものでも成分表示に持ち込める。そしてそれは、成分という数に翻訳されてしまうがゆえに、算術の対象とできるのである。

この話題に触れるのは、今はこの辺にまでにしておこう。線形代数が持つ「代数」という側面は、この投稿シリーズの重要なテーマであり、続きの投稿でも気にしていく行く予定だ。

線形代数は苦手ですか?

こんにちは。

某メーカーで物理シミュレーションやデータ解析をやっているエンジニアです。

仕事柄、計算手法に関する論文を読んで、その内容を実装して試すということをやるので、このブログでは、自分が「面白いな」と思ったものを紹介できたらなと思っています。

 

それと、もうひとつ。

サイエンス系のエンジニアという仕事をやっていると、当然、エンジニア間にある力量の差が目についてしまいます。(自分が優秀なエンジニアであるということを言う気はないですが)私の目から見て、優秀なエンジニアが共通して持っている資質の一つに、数学に対する理解の深さがあります。

新しい技術についていくことは、エンジニアに求められる重要な能力のひとつですが、これを行うには論文などの文献をすばやく読みこなせる能力が不可欠です。でも、教科書や論文を読んで素早く理解できる人と、できない人がいます。この差を生む要因の一つは、大学の初年度に学んだ数学(解析学線形代数)の理解の差にあるように思います。私の見るところ、微積分に対する理解の差から生まれるギャップよりも、線形代数に対する理解の差が生み出すギャップのほうが遥かに大きそうです。逆に言うと、線形代数を理解していれば大抵のことにキャッチアップできると、私のエンジニアとしての経験から、言えます。

ここで言う線形代数の理解とは、行列の計算ができる、ということではありません。理系の大学を卒業している多くの人は、行列ーベクトル積などの計算はできますし、行列の対角化計算もできます。一通りの計算はすべて出来るのです。でも、やっている計算の意味を理解している人は少ない、というのが私の印象です。

例えば、多くの人が、実対称行列  A の対角化は、 A固有ベクトルを並べて作った行列  U を用いて  U^T A U として計算できるという事実を知っていて、その計算もできます。しかし、なぜ、  U^T A U で対角化されるのかが腑に落ちてないというか、「言われたとおりに計算したら確かに対角行列になるよネ」、といった理解で留まっているいる人も多いと思うのです。

残念ですが、このような人と、  U^T A U の意味がすっかり分かっていて、「対角化されて当たり前」と思える人とには雲泥の差があります。「対角化されて当たり前」という理解に至っている人にとっては、自分の知らない分野であっても、その分野にキャッチアップしようとしている最中に現れる行列操作の意味するところが見えるので、理解が早いです。(線形変換は最も基本的かつ重要な変換であるため、ほとんど全てのサイエンスに現れます。というか、私は、現れないような分野を見たことがありません。)

 

このブログでは、そんな線形代数に関連することも書いていくつもりです。

誰かが面白がってくれますように!