Tweet Share Share

最終更新日:2019年8月9日

多くの複雑な行列演算は、コンピューターの限られた精度では効率的に、あるいは安定して解くことができません。”行列分解 “は行列を構成部分に還元して、より複雑な行列演算を簡単に計算するための方法です。 行列分解法は行列分解法とも呼ばれ、連立方程式の解法、逆行列の計算、行列式の計算などの基本的な演算においても、コンピュータにおける線形代数の基礎となっている。

このチュートリアルでは、行列分解を発見し、Python でそれらを計算する方法を学びます。

このチュートリアルを完了すると、次のことがわかるようになります:

  • 行列分解とは何か、なぜこれらの種類の操作が重要であるか。
  • Python で LU および QR 行列分解を計算する方法。
  • Python でコレスキー行列分解を計算する方法。

ステップバイステップのチュートリアルとすべての例のPythonソースコードファイルを含む私の新しい本Linear Algebra for Machine Learningであなたのプロジェクトを始めましょう

始めましょう

  • 2018年3月の更新。 QR分解の説明の小さなtypoを修正しました。
  • Update Jul/2019: 正定値行列の説明の小さなtypoを修正しました。
A Gentle Introduction to Matrix Decompositions for Machine Learning

A Gentle Introduction to Matrix Decompositions for Machine Learning
Photo by mickey, some rights reserved.このページのコンテンツは著作権法によって保護されています。

チュートリアルの概要

このチュートリアルは4つのパートに分かれています:

  1. 行列分解とは?
  2. LU 行列分解
  3. QR 行列分解
  4. Cholesky 分解

Need help with Linear Algebra for Machine Learning?

今すぐ 7 日間の無料メール クラッシュ コース (サンプル コード付き) を受講してください。

登録してクリックすると、コースの PDF 電子書籍版を無料で入手できます。

無料ミニコースをダウンロード

Matrix Decomposition とは?

これは、元の行列自体ではなく、分解された行列に対して実行できる、より複雑な行列操作を単純化できるアプローチです。

行列分解のよくある類似は、10の2×5への因数分解などの数の因数分解です。 このため、行列分解は行列因子分解とも呼ばれています。

簡単で広く使われている2つの行列分解法として、LU行列分解とQR行列分解があります。

LU行列分解

LU分解は正方行列に対するもので、行列をL成分とU成分に分解します。

1
A = L . U

ドット表記なしでもいい。

<7160>

1
A = LU

<9011>ここでAは分解したい正方行列である。 Lは下三角行列、Uは上三角行列です。

因子LとUは三角行列である。 消去して出てくる因数分解はA=LUです。

-97ページ『線形代数入門 第5版』2016.4612>

LU分解は反復数値処理で求めるので、分解できない行列や分解が容易ではない行列では失敗する可能性があります。

この分解の変形で、実際に解くのに数値的に安定なものをLUP分解、または部分ピボット付きLU分解と呼ぶ。

1
A = P . L . U

親行列の行は分解処理を簡単にするために並び替えられ、追加のP行列は結果を並べ替えるか結果を元の順序に戻す方法を指定します。

LU 分解は、線形回帰の係数を求めるような線形方程式系の解を単純化するため、また行列式や行列の逆数を計算するためによく使われます。

LU 分解は Python で lu() 関数を用いて実装できます。 より具体的には、この関数は LPU 分解を計算します。

以下の例では、まず 3×3 の正方行列を定義します。 LU分解が計算され、その成分から元の行列が再構築されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# LU分解
from numpy import array
from scipy.LU decomposition

from scipy.LU decomposition

from numpy import array from scipy.LU decomposition # LU分解

# define a square matrix
A = array(, , ])
print(A)
# LU decomposition
P. LU decomposition
P, L, U = lu(A)
print(P)
print(L)
print(U)
# reconstruct
B = P.dot(L).dot(U)
print(B)

この例を実行すると、まず定義された3×3行列がプリントされ、次に分解のP、L、U成分がプリントされ、最後に元の行列が再構築されることになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

]
]
]
]
]

QR Matrix Decomposition

QR分解はm×n行列(正方行列に限らない)を対象とし、行列をQ成分とR成分に分解するものである。

1
a = q . R

ドット表記なしでもいい。

1
A = QR

9011>ここにAは分解したい行列を表します。 Qは大きさm×mの行列、Rは大きさm×nの上三角行列である。

QR分解は、分解できない、あるいは簡単に分解できない行列に対して失敗することがある反復数値法を用いて求められる。

LU分解のように、QR分解は線形方程式系を解くためにしばしば用いられるが、正方行列に限定されるわけではない。 デフォルトでは、この関数は Q 行列と R 行列を、より小さい、またはより経済的な「縮小」された次元で返します。 これはほとんどのアプリケーションで必要ありませんが、mode 引数を ‘complete’ と指定することにより、Q に対して m x m、R に対して m x n の期待されるサイズを返すように変更できます。

以下の例は、3×2 の行列を定義し、QR 分解を計算し、分解した要素から元の行列を再構築します。

1
2
3
4
5
6
7
8
9
10
11
12
13

# QR分解
from numpy import array

numpy.NUMPY.NUMPY.COM

from the numpy.NUMPY.COM

# QR分解は、QuickTimeを使用することで、QRを分解することができます。linalg import qr
# define a 3×2 matrix
A = array(, , ])
print(A)
# QR decomposition
Q, R = qr(A, ‘complete’)
print(Q)
print(R)
# reconstruct
B = Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Qdot(R)
print(B)

この例を実行すると、まず定義された3×2行列が表示され、次にQとRの要素が、最後に再構成された行列が最初に表示したものと一致するように表示されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

]
]
]
]

コレスキー分解

コレスキー分解は、すべての固有値が0より大きい正方対称の行列のためのものです。 いわゆる正定値の行列。

機械学習では、実数値の行列のコレスキー分解に注目し、複素数を扱う場合は無視することにします。

分解は次のように定義される:

1
A = L . L^T

ドット表記なしでもよい。

1
A = LL^T

ここでAは分解する行列である。 Lは下三角行列、L^TはLの転置です。

分解は上三角行列の積として書くこともでき、例えば:

1
A = U^T . U

ここでUは上三角行列です。

コレスキー分解は、線形回帰の線形最小二乗法や、シミュレーション、最適化手法の解に使用されます。

対称行列を分解する場合、コレスキー分解はLU分解の約2倍の効率があり、このような場合は優先されるべきです。

対称正定値行列はかなり特殊ですが、いくつかのアプリケーションでかなり頻繁に登場するので、コレスキー分解という特殊分解について知っておくとよいでしょう。 コレスキー分解を使用できる場合、線形方程式を解くための他の方法よりも約 2 倍速くなります。

– 100 ページ、「Numerical Recipes:

コレスキー分解は、NumPy で cholesky() 関数を呼び出すことによって実装することができる。

以下の例では、3×3の対称・正定値行列を定義してコレスキー分解を計算し、元の行列を再構築しています。

1
2
3
4
5
6
7
8
9
10
11
12

# コレスキー分解
from numpy import array
from numpy.linalg import cholesky
# define a 3×3 matrix
A = array(, , ])
print(A)
# Cholesky decomposition
L = cholesky(A)
print(L)
# reconstruct
B = L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L. L.dot(L.T)
print(B)

この例を実行すると、まず対称行列、次に分解による低三角行列、そして再構成された行列が表示されます。

1
2
3
4
5
6
7
8
9
10
11

]
]
]

Extensions

このセクションでは、チュートリアルを拡張するためのいくつかのアイデアをリストアップしています。

  • 自分のデータで各操作を使用した 5 つの例を作成する。
  • 機械学習の論文を検索し、各操作が使用されている例を 1 つ見つける。

これらの拡張機能を検討した場合、ぜひ教えてください。

Further Reading

このセクションでは、さらに深く知りたい場合に、このトピックに関するより多くのリソースを提供します。

Books

  • セクション 6.6 Matrix decompositions. No Bullshit Guide To Linear Algebra, 2017.
  • 第7講 QR因数分解, Numerical Linear Algebra, 1997.
  • 第2.3講 LU分解とその応用, 数値のレシピ: 2007.
  • Section 2.10 QR分解, 数値計算機レシピ: 2007.
  • Section 2.9 コレスキー分解,数値計算のレシピ,科学技術計算センター,第3版. The Art of Scientific Computing, Third Edition, 2007.
  • Lecture 23, Cholesky Decomposition, Numerical Linear Algebra, 1997.

API

  • scipy.linalg.lu() API
  • numpy.linalg.qr() API
  • Numpy.linalg.lu() API numpy.linalg.qr() API

  • Numpy.linalg.lu() API
  • Lecture 23, Cholesky Degosition, Numberal Algebra, 2007.7138cholesky() API

Articles

  • 行列分解 on Wikipedia
  • LU分解 on Wikipedia
  • QR 分解 on Wikipedia
  • コレスキー分解 on Wikipedia

概要

このチュートリアルにおいて、私は、このチュートリアルで、「行列分解は、どのように行うべきか? Pythonで行列分解とその計算方法を発見しました。

具体的には、次のことを学びました。

  • 行列分解とは何か、なぜこれらのタイプの操作が重要なのか。
    下のコメントで質問してください、できる限りお答えします。

    機械学習のための線形代数のハンドルを握ろう!

    機械学習のための線形代数

    線形代数についての理解を深める


    Linear Algebra for Machine Learning

    この新しい電子書籍では、次のようなトピックに関する自習用チュートリアルを提供しています:
    Vector Norms, Matrix Multiplication, Tensors, Eigendecomposition, SVD, PCA and much more.

    最後にデータの数学がわかる

    Skip the Academics.Of.PiratesFinished Understanding the Mathematics of Data. 結果だけを出す。

    中身を見る

    Tweet Share Share

コメントを残す

メールアドレスが公開されることはありません。