からっぽのしょこ

読んだら書く!書いたら読む!同じ事は二度調べ(たく)ない

6.3.3:行列のスカラー倍の性質の導出【『スタンフォード線形代数入門』のノート】

はじめに

 『スタンフォード ベクトル・行列からはじめる最適化数学』の学習ノートです。
 「数式の行間埋め」や「Pythonを使っての再現」によって理解を目指します。本と一緒に読んでください。

 この記事は6.3.3節「行列スカラー積」の内容です。
 行列のスカラー倍の定義を確認して、性質を導出します。また、NumPyライブラリでの扱い方を確認します。

【前の内容】

www.anarchive-beta.com

【他の内容】

www.anarchive-beta.com

【今回の内容】

6.3.3 行列のスカラー倍の性質の導出

 行列のスカラー倍(行列とスカラーの積)の計算を数式とプログラム(NumPyライブラリ)で確認します。
 行列については「【Python】6.1-3:行列の定義と性質【『スタンフォード線形代数入門』のノート】 - からっぽのしょこ」を参照してください。

 利用するライブラリを読み込みます。

# 利用ライブラリ
import numpy as np


行列のスカラー倍の定義

 まずは、行列のスカラー倍の定義式を確認します。

 スカラー  \gamma m \times n 行列  \mathbf{A} の積を考えます。

 行列のスカラー倍は、「各要素とスカラーの積」で定義されます。

 \displaystyle
\begin{aligned}
\mathbf{B}
   &= \gamma \mathbf{A}
\\
   &= \gamma
      \begin{bmatrix}
          a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
          a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
          \vdots  & \vdots  & \ddots & \vdots \\
          a_{m,1} & a_{m,2} & \cdots & a_{m,n}
      \end{bmatrix}
\\
   &= \begin{bmatrix}
          \gamma a_{1,1} & \gamma a_{1,2} & \cdots & \gamma a_{1,n} \\
          \gamma a_{2,1} & \gamma a_{2,2} & \cdots & \gamma a_{2,n} \\
          \vdots & \vdots & \ddots & \vdots \\
          \gamma a_{m,1} & \gamma a_{m,2} & \cdots & \gamma a_{m,n}
      \end{bmatrix}
\\
   &= \begin{bmatrix}
          b_{1,1} & b_{2,1} & \cdots & b_{m,1} \\
          b_{1,2} & b_{2,2} & \cdots & b_{m,2} \\
          \vdots  & \vdots  & \ddots & \vdots \\
          b_{1,n} & b_{2,n} & \cdots & b_{m,n}
      \end{bmatrix}
\end{aligned}

 各要素は、各要素のスカラー倍  b_{i,j} = \gamma a_{i,j} になります。
 そのため、元の行列と計算結果の行列が同じ形状になります。

 スカラと行列を指定して、行列のスカラ倍を計算します。

# スカラを指定
gamma = -2.0

# 行列を作成
A = np.array(
    [[1.0, 6.0], 
     [9.0, 3.0], 
     [6.0, 0.0]]
)
print(A)
print(A.shape)

# 行列のスカラ倍を計算
B = gamma * A
print(B)
print(B.shape)
[[1. 6.]
 [9. 3.]
 [6. 0.]]
(3, 2)
[[ -2. -12.]
 [-18.  -6.]
 [-12.  -0.]]
(3, 2)

 計算前後で配列の形状は変わりません。

行列のスカラー倍の性質

 次は、行列のスカラー倍の性質を導出します。

交換法則

 積の順番を入れ替えた行列を考えます。

 \displaystyle
\begin{aligned}
\mathbf{A} \gamma
   &= \begin{bmatrix}
          a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
          a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
          \vdots  & \vdots  & \ddots & \vdots \\
          a_{m,1} & a_{m,2} & \cdots & a_{m,n}
      \end{bmatrix}
      \gamma
\\
   &= \begin{bmatrix}
          a_{1,1} \gamma & a_{1,2} \gamma & \cdots & a_{1,n} \gamma \\
          a_{2,1} \gamma & a_{2,2} \gamma & \cdots & a_{2,n} \gamma \\
          \vdots & \vdots & \ddots & \vdots \\
          a_{m,1} \gamma & a_{m,2} \gamma & \cdots & a_{m,n} \gamma
      \end{bmatrix}
\end{aligned}

 スカラーの積は交換法則  \gamma a_{i,j} = a_{i,j} \gamma が成り立つので、各項の積の順番を入れ替えて、スカラーと行列の積に分割します。

 \displaystyle
\begin{aligned}
\mathbf{A}
   &= \begin{bmatrix}
          \gamma a_{1,1} & \gamma a_{1,2} & \cdots & \gamma a_{1,n} \\
          \gamma a_{2,1} & \gamma a_{2,2} & \cdots & \gamma a_{2,n} \\
          \vdots & \vdots & \ddots & \vdots \\
          \gamma a_{m,1} & \gamma a_{m,2} & \cdots & \gamma a_{m,n}
      \end{bmatrix}
\\
   &= \gamma 
      \begin{bmatrix}
          a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
          a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
          \vdots  & \vdots  & \ddots & \vdots \\
          a_{m,1} & a_{m,2} & \cdots & a_{m,n}
      \end{bmatrix}
\\
   &= \gamma \mathbf{A}
\end{aligned}

 行列のスカラー倍は、交換法則が成り立ちます。

 行列とスカラーの積の順番を入れ替えて計算します。

# スカラと行列の積を計算
gamA = gamma * A
print(gamA)
print(gamA.shape)

# 行列とスカラの積を計算
Agam = A * gamma
print(Agam)
print(Agam.shape)

# 値を比較
print(gamA == Agam)
[[ -2. -12.]
 [-18.  -6.]
 [-12.  -0.]]
(3, 2)
[[ -2. -12.]
 [-18.  -6.]
 [-12.  -0.]]
(3, 2)
[[ True  True]
 [ True  True]
 [ True  True]]

 積の順番を入れ替えても計算結果が一致するのを確認できます。

結合法則

 スカラーの積と行列との積を考えます。

 \displaystyle
\begin{aligned}
(\beta \gamma) \mathbf{A}
   &= (\beta \gamma)
      \begin{bmatrix}
          a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
          a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
          \vdots  & \vdots  & \ddots & \vdots \\
          a_{m,1} & a_{m,2} & \cdots & a_{m,n}
      \end{bmatrix}
\\
   &= \begin{bmatrix}
          (\beta \gamma) a_{1,1} & (\beta \gamma) a_{1,2} & \cdots & (\beta \gamma) a_{1,n} \\
          (\beta \gamma) a_{2,1} & (\beta \gamma) a_{2,2} & \cdots & (\beta \gamma) a_{2,n} \\
          \vdots & \vdots & \ddots & \vdots \\
          (\beta \gamma) a_{m,1} & (\beta \gamma) a_{m,2} & \cdots & (\beta \gamma) a_{m,n}
      \end{bmatrix}
\end{aligned}

 スカラーの積は結合法則  (\beta \gamma) a_{i,j} = \beta (\gamma a_{i,j}) が成り立つので、括弧について置き換えて、スカラーと行列の積に分割します。

 \displaystyle
\begin{aligned}
(\beta \gamma) \mathbf{A}
   &= \begin{bmatrix}
          \beta (\gamma a_{1,1}) & \beta (\gamma a_{1,2}) & \cdots & \beta (\gamma a_{1,n}) \\
          \beta (\gamma a_{2,1}) & \beta (\gamma a_{2,2}) & \cdots & \beta (\gamma a_{2,n}) \\
          \vdots & \vdots & \ddots & \vdots \\
          \beta (\gamma a_{m,1}) & \beta (\gamma a_{m,2}) & \cdots & \beta (\gamma a_{m,n})
      \end{bmatrix}
\\
   &= \beta
      \begin{bmatrix}
          \gamma a_{1,1} & \gamma a_{1,2} & \cdots & \gamma a_{1,n} \\
          \gamma a_{2,1} & \gamma a_{2,2} & \cdots & \gamma a_{2,n} \\
          \vdots & \vdots & \ddots & \vdots \\
          \gamma a_{m,1} & \gamma a_{m,2} & \cdots & \gamma a_{m,n}
      \end{bmatrix}
\\
   &= \beta \left(
          \gamma
          \begin{bmatrix}
              a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
              a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
              \vdots  & \vdots  & \ddots & \vdots \\
              a_{m,1} & a_{m,2} & \cdots & a_{m,n}
          \end{bmatrix}
      \right)
\\
   &= \beta (\gamma \mathbf{A})
\end{aligned}

 行列のスカラー倍は、結合法則が成り立ちます。

 スカラーと行列の積を計算します。

# スカラを指定
beta = 1.5

# スカラと行列の積を計算
B = (beta * gamma) * A
print(B)
print(B.shape)

# スカラと行列の積を計算
C = beta * (gamma * A)
print(C)
print(C.shape)

# 値を比較
print(B == C)
[[ 2.25 13.5 ]
 [20.25  6.75]
 [13.5   0.  ]]
(3, 2)
[[ 2.25 13.5 ]
 [20.25  6.75]
 [13.5   0.  ]]
(3, 2)
[[ True  True]
 [ True  True]
 [ True  True]]

 積の順番を入れ替えても計算結果が一致するのを確認できます。

分配法則

 スカラーの和と行列との積を考えます。

 \displaystyle
\begin{aligned}
(\beta + \gamma) \mathbf{A}
   &= (\beta + \gamma)
      \begin{bmatrix}
          a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
          a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
          \vdots  & \vdots  & \ddots & \vdots \\
          a_{m,1} & a_{m,2} & \cdots & a_{m,n}
      \end{bmatrix}
\\
   &= \begin{bmatrix}
          (\beta + \gamma) a_{1,1} & (\beta + \gamma) a_{1,2} & \cdots & (\beta + \gamma) a_{1,n} \\
          (\beta + \gamma) a_{2,1} & (\beta + \gamma) a_{2,2} & \cdots & (\beta + \gamma) a_{2,n} \\
          \vdots & \vdots & \ddots & \vdots \\
          (\beta + \gamma) a_{m,1} & (\beta + \gamma) a_{m,2} & \cdots & (\beta + \gamma) a_{m,n}
      \end{bmatrix}
\end{aligned}

 スカラーの積は分配法則  (\beta + \gamma) a_{i,j} = \beta a_{i,j} + \gamma a_{i,j} が成り立つので、括弧を展開します。

 \displaystyle
(\beta + \gamma) \mathbf{A}
    = \begin{bmatrix}
          \beta a_{1,1} + \gamma a_{1,1} & \beta a_{1,2} + \gamma a_{1,2} & \cdots & \beta a_{1,n} + \gamma a_{1,n} \\
          \beta a_{2,1} + \gamma a_{2,1} & \beta a_{2,2} + \gamma a_{2,2} & \cdots & \beta a_{2,n} + \gamma a_{2,n} \\
          \vdots & \vdots & \ddots & \vdots \\
          \beta a_{m,1} + \gamma a_{m,1} & \beta a_{m,2} + \gamma a_{m,2} & \cdots & \beta a_{m,n} + \gamma a_{m,n}
      \end{bmatrix}

 行列の和に分割して、更にスカラーと行列の積に分割します。

 \displaystyle
\begin{aligned}
(\beta + \gamma) \mathbf{A}
   &= \begin{bmatrix}
          \beta a_{1,1} & \beta a_{1,2} & \cdots & \beta a_{1,n} \\
          \beta a_{2,1} & \beta a_{2,2} & \cdots & \beta a_{2,n} \\
          \vdots & \vdots & \ddots & \vdots \\
          \beta a_{m,1} & \beta a_{m,2} & \cdots & \beta a_{m,n}
      \end{bmatrix}
      + \begin{bmatrix}
          \gamma a_{1,1} & \gamma a_{1,2} & \cdots & \gamma a_{1,n} \\
          \gamma a_{2,1} & \gamma a_{2,2} & \cdots & \gamma a_{2,n} \\
          \vdots & \vdots & \ddots & \vdots \\
          \gamma a_{m,1} & \gamma a_{m,2} & \cdots & \gamma a_{m,n}
        \end{bmatrix}
\\
   &= \beta
      \begin{bmatrix}
          a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
          a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
          \vdots  & \vdots  & \ddots & \vdots \\
          a_{m,1} & a_{m,2} & \cdots & a_{m,n}
      \end{bmatrix}
      + \gamma
        \begin{bmatrix}
          a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
          a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
          \vdots  & \vdots  & \ddots & \vdots \\
          a_{m,1} & a_{m,2} & \cdots & a_{m,n}
        \end{bmatrix}
\\
   &= \beta \mathbf{A}
      + \gamma \mathbf{A}
\end{aligned}

 行列のスカラー倍は、分配法則が成り立ちます。

 スカラーの和と行列の積を計算します。

# スカラの和と行列の積を計算
B = (beta + gamma) * A
print(B)
print(B.shape)

# スカラと行列の積の和を計算
C = beta * A + gamma * A
print(C)
print(C.shape)

# 値を比較
print(B == C)
[[ 3. 18.]
 [27.  9.]
 [18.  0.]]
(3, 2)
[[ 3. 18.]
 [27.  9.]
 [18.  0.]]
(3, 2)
[[ True  True]
 [ True  True]
 [ True  True]]

 「スカラの和と行列の積」と「スカラと行列の積の和」が一致するのを確認できます。

ゼロとの積

 0と行列の積を考えます。

 \displaystyle
\begin{aligned}
0 \mathbf{A}
   &= 0
      \begin{bmatrix}
          a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
          a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
          \vdots  & \vdots  & \ddots & \vdots \\
          a_{m,1} & a_{m,2} & \cdots & a_{m,n}
      \end{bmatrix}
\\
   &= \begin{bmatrix}
          0 a_{1,1} & 0 a_{1,2} & \cdots & 0 a_{1,n} \\
          0 a_{2,1} & 0 a_{2,2} & \cdots & 0 a_{2,n} \\
          \vdots & \vdots & \ddots & \vdots \\
          0 a_{m,1} & 0 a_{m,2} & \cdots & 0 a_{m,n}
      \end{bmatrix}
\\
   &= \begin{bmatrix}
          0 & 0 & \cdots & 0 \\
          0 & 0 & \cdots & 0 \\
          \vdots & \vdots & \ddots & \vdots \\
          0 & 0 & \cdots & 0
      \end{bmatrix}
\\
   &= \mathbf{O}
\end{aligned}

 各要素に0を掛けるので全ての要素が  O_{i,j} = 0 になり、ゼロ行列になります。
 ゼロ行列については「6.1-3:行列の定義と例【『スタンフォード線形代数入門』のノート】 - からっぽのしょこ」を参照してください。

 0との積を計算します。

# 行列の0倍を計算
O = 0.0 * A
print(O)
print(O.shape)
[[0. 0.]
 [0. 0.]
 [0. 0.]]
(3, 2)

 0 を掛けるとゼロ行列になるのを確認できます。

転置行列のスカラー倍

 スカラーと行列の積の転置行列を考えます。

 \displaystyle
\begin{aligned}
(\gamma \mathbf{A})^{\top}
   &= \left(
          \gamma
          \begin{bmatrix}
              a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
              a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
              \vdots  & \vdots  & \ddots & \vdots \\
              a_{m,1} & a_{m,2} & \cdots & a_{m,n}
          \end{bmatrix}
      \right)^{\top}
\\
   &= \begin{bmatrix}
          \gamma a_{1,1} & \gamma a_{1,2} & \cdots & \gamma a_{1,n} \\
          \gamma a_{2,1} & \gamma a_{2,2} & \cdots & \gamma a_{2,n} \\
          \vdots & \vdots & \ddots & \vdots \\
          \gamma a_{m,1} & \gamma a_{m,2} & \cdots & \gamma a_{m,n}
      \end{bmatrix}^{\top}
\\
   &= \begin{bmatrix}
          \gamma a_{1,1} & \gamma a_{2,1} & \cdots & \gamma a_{m,1} \\
          \gamma a_{1,2} & \gamma a_{2,2} & \cdots & \gamma a_{m,2} \\
          \vdots & \vdots & \ddots & \vdots \\
          \gamma a_{1,n} & \gamma a_{2,n} & \cdots & \gamma a_{m,n}
      \end{bmatrix}
\end{aligned}

 スカラーと行列の積に分割します。

 \displaystyle
\begin{aligned}
(\gamma \mathbf{A})^{\top}
   &= \gamma
      \begin{bmatrix}
          a_{1,1} & a_{2,1} & \cdots & a_{m,1} \\
          a_{1,2} & a_{2,2} & \cdots & a_{m,2} \\
          \vdots  & \vdots  & \ddots & \vdots \\
          a_{1,n} & a_{2,n} & \cdots & a_{m,n}
      \end{bmatrix}
\\
   &= \gamma
      \begin{bmatrix}
          a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
          a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
          \vdots  & \vdots  & \ddots & \vdots \\
          a_{m,1} & a_{m,2} & \cdots & a_{m,n}
      \end{bmatrix}^{\top}
\\
   &= \gamma \mathbf{A}^{\top}
\end{aligned}

 行列のスカラー倍の転置行列は、転置行列のスカラー倍と一致します。

 転置行列のスカラ倍を計算します。

# 行列のスカラ倍を計算
C = gamma * A
print(C)
print(C.shape)

# 転置行列のsukara倍を計算
Ct = gamma * A.T
print(Ct)
print(Ct.shape)

# 値を比較
print(C.T == Ct)
[[ 1.5  9. ]
 [13.5  4.5]
 [ 9.   0. ]]
(3, 2)
[[ 1.5 13.5  9. ]
 [ 9.   4.5  0. ]]
(2, 3)
[[ True  True  True]
 [ True  True  True]]

 「行列のスカラ倍の転置行列」と「転置行列のスカラ倍」が一致するのを確認できます。

 この記事では、行列とスカラーの積を確認しました。次の記事では、行列とスカラーの和を確認します。

参考書籍

  • Stephen Boyd・Lieven Vandenberghe(著),玉木 徹(訳)『スタンフォード ベクトル・行列からはじめる最適化数学』講談社サイエンティク,2021年.

おわりに

 一応書きました、その2です。あくまで行列とスカラーの積です。行列同士の積とは別ものです。行列の積はその内登場するのだと思います。
 スカラーとスカラで表記が揺れていますが一応意図的です。数式部分ではスカラーで、プログラム部分ではスカラとしています。そこまで強い拘りはありません。というか本当は揺れが気持ち悪いのでスカラに統一したいのですがいかがでしょうか。

 2023年7月17日は、Juice=Juiceの井上玲音さんの22歳のお誕生日です。

 この歌唱動画から想像されるであろうキャラと実際とのギャップがたまらないので、ぜひパフォーマンス以外の動画も観てほしいです。

【次の内容】

www.anarchive-beta.com