[Programmers] 30. 人工知能数学の基礎(3):線形代数(3):行列演算と線形組合せ


誤りに対する批判、質問、討論を歓迎します.自由にコメントを残しておきましょう!!

線形代数(Linear Algebra)(3):行列演算と線形組合せ


マトリックス用語整理


  • マトリックス
    -通常はn×mn\times mn×mマトリクス

  • 要素/要素(Entry)
  • 行列の数値.

  • ラインベクトル
  • は、1行からなる行列である.

  • 列ベクトル
  • は、一列からなる行列である.
  • は、通常、線形代数における列ベクトルを表す.

  • プリマトリクス
  • 行列の1行で、列を列とする行列です.

  • ゼロマトリクス
  • 行列のすべての要素はゼロです.
  • 行列の和の恒等元.

  • せいほうけいマトリクス
  • n×nn\times nn×nは行列を表す.

  • メイン対角線/メイン対角要素
  • 正方行列の行と列の数が同じ位置にある要素.aiia_{ii}aii​

  • ていとうマトリクス
  • の主対角線は1であり、残りの要素は0のn次正方形行列である.
  • 行列の積に対して一定の要素の役割を果たす.

  • 内部(inner product)
  • ベクトル内のすべての要素の積を加算した結果.
  • 行列の積


  • A×B=CA\times B = CA×B=C,A=m×rA = m\times rA=m×rマトリクス、B=r×nB = r\times nB=r×nマトリクスの場合、

  • 行列C=m×nC = m\times nC=m×nはマトリクスとなり、

  • 行列CCCの各要素CijC{ij}CijはAAAのi−i−i−1行目ベクトルとBBBのj−j−j−j−1列目ベクトルの内積を計算する.

  • マトリクスを乗算すると、各要素は独立しているので、並列処理(並列処理)に加速できます.
  • スカラー/ベクトル/マトリクス/テンソル階層の理解

  • スカラ(Scalar)
  • は、1つの数字で構成されています.
  • ベクトル(ベクトル)
  • は、複数の数字からなる構造である.
  • マトリックス
  • 行と列を持つ構造.
  • Tensor
  • スカラー、集合ベクトル行列の概念.
  • 数字
  • の方向がkk個の場合、k-k-k-tenserと呼ばれます.
  • ex)0–0–0テンソル:スカラー、1–1–1テンソル:ベクトル、2–2–2テンソル:マトリクス
  • 分割マトリクス:非常に重要


  • マトリクス構造が複雑で理解し難い場合、
    マトリクスを抽象構造に分割し、マトリクスまたはマトリクス演算を理解しやすくします.

  • 行列を「セグメント」(Partition)に分割してみてください.

  • 行列を部分行列(Submatrix)からなる矩形構造に展開して考えることができる.


  • これらの行列を分割行列またはブロック行列と呼ぶ.

  • 行列は列ベクトルの集合であり、このように見ると行ベクトルになります.


  • 行列は行ベクトルの集合であり,行列は列ベクトルである.

  • 分割マトリクスでマトリクスの積を理解する

  • 両行列の積A=m×rA = m\times rA=m×r, B=r×nB = r\times nB=r×nの場合、AB=CAB=CAB=Cとなります.
  • では、BBB行列を列ベクトルの集合に分割し、以下の構造解析を行うことができる.
    (逆にA行列を行ベクトルの集合に分割する)
    AB=A[b1,  b2, ..., bn]=[Ab1,  Ab2, ..., Abn]=CAB = A\left[\begin{matrix}b_{1} ,\\b_{2},\...,\b_{n}\\\end{matrix}\right] =\left[\begin{matrix}Ab_{1} ,\\Ab_{2},\...,\Ab_{n}\\\end{matrix}\right] = CAB=A[b1​,  b2​, ..., bn​​]=[Ab1​,  Ab2​, ..., Abn​​]=C
  • 線形の組み合わせ:非常に重要


  • マトリックスA=m×nA= m\times nA=m×nの場合、

  • 構造的には行列は列ベクトルである.
    A=[a11,  a12, ..., a1na21,  a22, ..., a2n...     ...    ...    ...am1,  am2, ..., amn]=[a1,  a2, ..., an]A =\left[\begin{matrix}a_{11} ,\\a_{12},\...,\a_{1n}\\a_{21} ,\\a_{22},\...,\a_{2n}\\...\\\\\...\\\\...\\\\...\\a_{m1} ,\\a_{m2},\...,\a_{mn}\\\end{matrix}\right] =\left[\begin{matrix}a_{1} ,\\a_{2},\...,\a_{n}\\\end{matrix}\right]A=⎣⎢⎢⎢⎡​a11​,  a12​, ..., a1n​a21​,  a22​, ..., a2n​...     ...    ...    ...am1​,  am2​, ..., amn​​⎦⎥⎥⎥⎤​=[a1​,  a2​, ..., an​​]
    nnn個の
  • m−mベクトルがあると考えられる.
    言い換えればm×nm\times nm×n行列にはn個のm−mベクトルがある.

  • AxAxAxは、行列Aが有する列ベクトルの線形結合と見なすことができる.
    Ax=[a11,  a12, ..., a1na21,  a22, ..., a2n...     ...    ...    ...am1,  am2, ..., amn][x1x2...xn]=[a1,  a2, ..., an][x1x2...xn]=x1a1+x2a2+...+xnanAx =\left[\begin{matrix}a_{11} ,\\a_{12},\...,\a_{1n}\\a_{21} ,\\a_{22},\...,\a_{2n}\\...\\\\\...\\\\...\\\\...\\a_{m1} ,\\a_{m2},\...,\a_{mn}\\\end{matrix}\right]\left[\begin{matrix}x_{1}\\x_{2}\\...\\x_{n}\\\end{matrix}\right] =\left[\begin{matrix}a_{1} ,\\a_{2},\...,\a_{n}\\\end{matrix}\right]\left[\begin{matrix}x_{1}\\x_{2}\\...\\x_{n}\\\end{matrix}\right] = x_{1}a_{1} + x_{2}a_{2} + ... + x_{n}a_{n}Ax=⎣⎢⎢⎢⎡​a11​,  a12​, ..., a1n​a21​,  a22​, ..., a2n​...     ...    ...    ...am1​,  am2​, ..., amn​​⎦⎥⎥⎥⎤​⎣⎢⎢⎢⎡​x1​x2​...xn​​⎦⎥⎥⎥⎤​=[a1​,  a2​, ..., an​​]⎣⎢⎢⎢⎡​x1​x2​...xn​​⎦⎥⎥⎥⎤​=x1​a1​+x2​a2​+...+xn​an​
  • に示すように、ベクトルAとxの重み付けの和で表すことができる.
  • を線形組合せと呼ぶ.
  • 、すなわちベクトルの重み付け和であり、これを線形組合せと呼ぶ.
  • 整理する

  • 行列AAAの列ベクトルを重み付け線形結合する場合、
  • .
  • ベクトルbbbを作成できる重み付けの組合せがある場合、
  • 線形系Ax=bAx=bAx=bAx=bの解が存在する.
  • 年は重み付けxx{i}xiからなるxxxである.
  • n/a.結論


  • カラムスペース
    行列AAAの列ベクトルの可能なすべての線形結合の結果を一緒に集めることができる.
    このセットを「開いた空間」と呼び、「col(A)col(A)」とマークします.

  • 線形系Ax=bAx=bAx=bAx=bに解がある場合、b∈col(A)bin col(A)b∈col(A)
    Ex 1)
    A=[−1,  3, 21,  2, −32,  1, −2]A =\left[\begin{matrix}-1 ,\\3,\2\\1 ,\\2,\-3\\2 ,\\1,\-2\\\end{matrix}\right]A=⎣⎢⎡​−1,  3, 21,  2, −32,  1, −2​⎦⎥⎤​
  • 行列AAAの列ベクトルの組み合わせは、3933-3χベクトルbbbを生成することができれば、
  • 線形系Ax=bAx=bAx=bAx=bの解が存在する.

  • 線形系Ax=bAx=bAx=bAx=bに害がない場合、bcol(A)bnotincol(A)b∈/col(A)
    Ex 2)
    A=[−1,  3, 21,  2, −30,  0, 0]A =\left[\begin{matrix}-1 ,\\3,\2\\1 ,\\2,\-3\\0 ,\\0,\0\\\end{matrix}\right]A=⎣⎢⎡​−1,  3, 21,  2, −30,  0, 0​⎦⎥⎤​
  • 行列AAAの列ベクトルを組み合わせた空間はxy{x}xy{x}平面である.
  • ベクトルbbbがxy−xy平面上に存在するベクトルである場合、線形系Ax=bAx=bAx=bAx=bの解が存在する.
  • しかし、ベクトルbbbがxy−xy−xy平面のベクトルからずれると、線形系Ax=bAx=bAx=bAx=bの解は存在しない.
  • 実習


    スカラー、ベクトル、マトリクス、テンソル:階層の理解


    スカラ

    import numpy as np
    
    s = 3
    
    print("a:", s)
    print(np.shape(s))
    a: 3
    ()

    スカラー->ベクトル

    a = np.reshape(s, (1,))
    
    print("a:", a)
    print(np.shape(a))
    a: [3]
    (1,)

    スカラ

    a = np.reshape(s, (1,1))
    
    print("a:", a)
    print(np.shape(a))
    a: [[3]]
    (1, 1)

    スカラ

    a = np.reshape(s, (1,1,1))
    
    print("a:", a)
    print(np.shape(a))
    a: [[[3]]]
    (1, 1, 1)

    ベクトル


    ベクトル:24
    a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24])
    
    print("a:", a)
    print(np.shape(a))
    a: [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]
    (24,)

    ベクトル->行列


    24-ベクトル-->(1 x 24)行列
    A = a.reshape(1,24)
    
    print("A:", A)
    print("A:", np.shape(A))
    A: [[ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]]
    A: (1, 24)
    24-ベクトル-->(3 x 8)行列
    A = a.reshape(3,8)
    
    print("A:", A)
    print("A:", np.shape(A))
    A: [[ 1  2  3  4  5  6  7  8]
     [ 9 10 11 12 13 14 15 16]
     [17 18 19 20 21 22 23 24]]
    A: (3, 8)
    24-ベクトル-->(6 x 4)行列
    A = a.reshape(6,4)
    
    print("A:", A)
    print("A:", np.shape(A))
    A: [[ 1  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]
     [13 14 15 16]
     [17 18 19 20]
     [21 22 23 24]]
    A: (6, 4)
    24-ベクトル-->(24 x 1)行列
    A = a.reshape(24,1)
    
    print("A:", A)
    print("A:", np.shape(A))
    A: [[ 1]
     [ 2]
     [ 3]
     [ 4]
     [ 5]
     [ 6]
     [ 7]
     [ 8]
     [ 9]
     [10]
     [11]
     [12]
     [13]
     [14]
     [15]
     [16]
     [17]
     [18]
     [19]
     [20]
     [21]
     [22]
     [23]
     [24]]
    A: (24, 1)

    ベクトル->3-テンソル


    24ベクトル-->(2 x 3 x 4)テンソル(すなわち2個(3 x 4)マトリクス)
    A = a.reshape(2, 3, 4)
    
    print("A:", A)
    print("A:", np.shape(A))
    A: [[[ 1  2  3  4]
      [ 5  6  7  8]
      [ 9 10 11 12]]
    
     [[13 14 15 16]
      [17 18 19 20]
      [21 22 23 24]]]
    A: (2, 3, 4)

    ベクトル->スカラー

    ## error: 벡터 a가 하나의 entry로 되어 있지 않기 때문에 아래의 경우는 모두 에러
    # s = np.reshape(a, ())
    # s = a.item() 
    
    s = a[0]
    print(s)
    
    s = a.sum()
    print(s)
    1
    300

    A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9,], [10, 11, 12]])
    
    print(A)
    print(np.shape(A))
    [[ 1  2  3]
     [ 4  5  6]
     [ 7  8  9]
     [10 11 12]]
    (4, 3)
    マトリックス->3-Tenser
    T = A.reshape(1, 4, 3)
    
    print(T)
    print(np.shape(T))
    [[[ 1  2  3]
      [ 4  5  6]
      [ 7  8  9]
      [10 11 12]]]
    (1, 4, 3)
    T = A.reshape(2, 2, 3)
    
    print(T)
    print(np.shape(T))
    [[[ 1  2  3]
      [ 4  5  6]]
    
     [[ 7  8  9]
      [10 11 12]]]
    (2, 2, 3)
    T = A.reshape(2, 3, 2)
    
    print(T)
    print(np.shape(T))
    [[[ 1  2]
      [ 3  4]
      [ 5  6]]
    
     [[ 7  8]
      [ 9 10]
      [11 12]]]
    (2, 3, 2)
    マトリックス->ベクトル
    a = A.reshape(12,)
    
    print(a)
    print(np.shape(a))
    [ 1  2  3  4  5  6  7  8  9 10 11 12]
    (12,)
    マトリックス->スカラー
    s = A[0,0]
    
    print(s)
    print(np.shape(s))
    
    s = np.sum(A)
    
    print(s)
    print(np.shape(s))
    1
    ()
    78
    ()

    ドローイングマシン

    T = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9,], [10, 11, 12]]])
    
    print(T)
    print(np.shape(T))
    [[[ 1  2  3]
      [ 4  5  6]]
    
     [[ 7  8  9]
      [10 11 12]]]
    (2, 2, 3)
    3-tenser->マトリクス
    A = T.reshape(4, 3)
    
    print(A)
    print(np.shape(A))
    
    A = T.reshape(3, 4)
    
    print(A)
    print(np.shape(A))
    [[ 1  2  3]
     [ 4  5  6]
     [ 7  8  9]
     [10 11 12]]
    (4, 3)
    [[ 1  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    (3, 4)
    3-テンソル->ベクトル
    a = T.reshape(12,)
    
    print(a)
    print(np.shape(a))
    [ 1  2  3  4  5  6  7  8  9 10 11 12]
    (12,)
    3-Tenser->スカラ
    s = T.sum()
    
    print(s)
    print(np.shape(s))
    78
    ()

    この記事は、プログラマーアカデミー人工知能Defcosコースで学んだ内容をもとにまとめたものです.