(機械学習用の行列) (ベクトル、行列、重回帰)

機械学習マトリックス

バスを待つとき、みんなが並ぶことを期待しますが、人を数字に置き換えると、数字で並ぶことになります。これがマトリックスです。

行列式

行列の行と列

マトリックスは行とクロ(列の略)で構成されます。

\bigl(\begin{smallmatrix} 1 &2 &3 \\ 4 &5 &6 \\ 7 &8 &8 \end{smallmatrix}\bigr)

row は行として変換され、col は列として変換されます。m\回nマトリックスでは、m は行を表し、n は列を表します。

行列変数名

行列の変数名は通常大文字の英字で表されますが、A に設定された行列の変数名は次のとおりです。

A=\bigl(\begin{smallmatrix} 1 & 2 & 3\\ 4 & 5 & 6 \end{smallmatrix}\bigr)

一般的な行列式

他の行列式:

\begin{bmatrix} 1 &2 \\ 3 &4 \end{bmatrix}                \begin{vmatrix} 1 & 2\\ 3 & 4 \end{vmatrix}                \begin{Vmatrix} 1 & 2\\ 3 & 4 \end{Vmatrix}

行列要素式

行列要素は添字で表現されることが多く、以下の書き方が参考になります。

a_{ij}

i は行番号、j は列番号です。

\begin{pmatrix} a_{11} & \cdots & a_{1n}\\ \vdots & \ddots & \vdots \\ a_{m1} & \cdots & a_{mn} \end{pmatrix}                        \begin{pmatrix} a_{1,1} & \cdots & a_{1,n}\\ \vdots & \ddots & \vdots \\ a_{m,1} & \cdots & a_{m,n} \終了{pマトリックス}

行列の加算と減算

基本概念

次の 2 つの行列があります。

A=\begin{pmatrix} a_{1,1} & \cdots &a_{1,n} \\ \vdots & \ddots &\vdots \\ a_{m,1} & \cdots & a_{m,n} \end{p行列}                        B=\begin{pmatrix} b_{1,1} & \cdots &b_{1,n} \\ \vdots & \ddots &\vdots \\ b_{m,1} & \cdots & b_{m,n} \end{p行列}

行列の加算または減算は、同じ位置の要素の加算または減算と同じであるため、以下に示すように、異なるサイズの行列を加算または減算することはできません。

A+B=\begin{pmatrix} a_{1,1}+b_{1,1} & \cdots &a_{1,n}+b_{1,n} \\ \vdots & \ddots &\vdots \\ a_{m,1}+b_{m,1} & \cdots & a_{m,n}+b_{m,n} \end{pmatrix}

AB=\begin{pmatrix} a_{1,1}-b_{1,1} & \cdots &a_{1,n}-b_{1,n} \\ \vdots & \ddots &\vdots \\ a_{ m,1}-b_{m,1} & \cdots & a_{m,n}-b_{m,n} \end{pmatrix}

行列の加算と減算の交換法則と結合法則が確立されます。

交換法則: A+B=B+A

結合法則: (A+B)+C=A+(B+C)

Pythonの練習

行列を定義するには、numpyのmatrix()メソッドを使用できます。

A=\begin{pmatrix} 1 & 2 & 3\\ 4 & 5 & 6 \end{pmatrix}

>>> import numpy as np
>>> A=np.matrix([[1,2,3],[4,5,6]])
>>> A
matrix([[1, 2, 3],
        [4, 5, 6]])
>>>

行列の加算と減算の応用

import numpy as np

A = np.matrix([[1, 2, 3], [4, 5, 6]])
B = np.matrix([[4, 5, 6], [7, 8, 9]])

print('A + B = {}'.format(A + B))
print('A - B = {}'.format(A - B))

実行結果は次のとおりです。

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A + B = [[ 5  7  9]
 [11 13 15]]
A - B = [[-3 -3 -3]
 [-3 -3 -3]]

[Done] exited with code=0 in 4.159 seconds

モーメントと実数の乗算

行列を実数倍するには、行列の各要素に実数を乗じますが、以下は実数 k を乗算する例です。

kA=\begin{pmatrix} ka_{1,1} & \cdots & ka_{1,n}\\ \vdots & \ddots & \vdots \\ ka_{m,1} & \cdots &ka_{m,n} \end{p行列}

実数による行列の乗算の交換法則、結合法則、および分配法則が確立されます。

交換法則: kA=Ak

結合法則: jkA=j(kA)

分配法則: (j+k)A=jA+kA

k(A+B)=kA+kB

行列は 2 倍されます。

import numpy as np

A = np.matrix([[1, 2, 3], [4, 5, 6]])

print('2 * A   = {}'.format(2 * A))
print('0.5 * A = {}'.format(0.5 * A))

操作結果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
2 * A   = [[ 2  4  6]
 [ 8 10 12]]
0.5 * A = [[0.5 1.  1.5]
 [2.  2.5 3. ]]

[Done] exited with code=0 in 4.375 seconds

行列乗算

行列の乗算で重要な点は、行列の乗算を実行する前に、左の行列の列数が右の行列の行数と同じでなければならないことです。

掛け算の基本ルール

A行列はi\times j、B行列はj\times k

AB_{ik}=\sum_{i=1}^{n}a_{i,j}b_{j,k}

numpy モジュールを使用すると、* または @ 演算子を使用して行列の乗算を実行できます。

import numpy as np

A = np.matrix([[1, 2], [3, 4]])
B = np.matrix([[5, 6], [7, 8]])
print('A * B = {}'.format(A * B))

C = np.matrix([[1, 0, 2], [-1, 3, 1]])
D = np.matrix([[3, 1], [2, 1], [1, 0]])
print('C @ D = {}'.format(C @ D))

操作結果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A * B = [[19 22]
 [43 50]]
C @ D = [[5 1]
 [4 2]]

[Done] exited with code=0 in 2.09 seconds

乗算の場合

次の表は、A と B が購入したい果物の数量を示しています。

名前 バナナ マンゴー りんご
初め 2 3 1
2番 3 2 5

次の表は、スーパーマーケットとデパートでの果物の価格を示しています。

果物の名前 スーパーマーケットの価格 デパートの価格
バナナ 30 50
マンゴー 60 80
りんご 50 60

A と B がスーパーやデパートでそれぞれいくらのお金を買う必要があるかを計算します。

import numpy as np

A = np.matrix([[2, 3, 1], [3, 2, 5]])
B = np.matrix([[30, 50], [60, 80], [50, 60]])
print('A * B = {}'.format(A * B))

操作結果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A * B = [[290 400]
 [460 610]]

[Done] exited with code=0 in 2.403 seconds

さまざまな果物のカロリーが次のようになると仮定します。

フルーツ
バナナ 30カロリー
マンゴー 50カロリー
りんご 20カロリー

A と B はそれぞれ次の量を食べて、どのくらいのカロリーを生成するかを計算します。

名前 バナナ マンゴー りんご
初め 1 2 1
2番 2 1 2

コードは以下のように表示されます。

import numpy as np

A = np.matrix([[1, 2, 1], [2, 1, 2]])
B = np.matrix([[30], [50], [20]])
print('A * B = {}'.format(A * B))

実行結果は次のとおりです。

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A * B = [[150]
 [150]]

[Done] exited with code=0 in 2.34 seconds

行列の乗算規則

行列演算中に、結合法則と分配法則が確立されます。

結合法則:A\times B\times C=(A\times B)\times C=A\times (B\times C)

分配法則:A\times (BC)=A\times BA\times C

行列演算を行う場合、交換法則は成り立ちません。

A\times B 等しくない B\times A

検証はA\times B 次と等しくありません B\times A

コードは以下のように表示されます。

import numpy as np

A = np.matrix([[1, 2], [3, 4]])
B = np.matrix([[5, 6], [7, 8]])
print('A * B = {}'.format(A * B))
print('B * A = {}'.format(B * A))

操作結果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A * B = [[19 22]
 [43 50]]
B * A = [[23 34]
 [31 46]]

[Done] exited with code=0 in 4.095 seconds

正方行列

行数と列数が等しい場合、行列は正方行列になります。

恒等行列

正方行列の左上から右下までの対角要素がすべて1、その他の要素が0の場合、この行列を単位行列と呼びます。

単位行列は、大文字の E または I で表される場合があります。

単位行列は、アラビア数字の 1 に似ています。行列に単位行列を乗算すると、元の行列になります。

単位行列を乗算した結果が変化しないことを確認します。

import numpy as np

A = np.matrix([[1, 2], [3, 4]])
B = np.matrix([[1, 0], [0, 1]])
print('A * B = {}'.format(A * B))
print('B * A = {}'.format(B * A))

操作結果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A * B = [[1 2]
 [3 4]]
B * A = [[1 2]
 [3 4]]

[Done] exited with code=0 in 2.165 seconds

逆行列

基本概念

逆行列を持つことができるのは正方行列のみです。行列にその逆行列を掛けると、単位行列 E が得られます。次の概念を参照できます。

A\times A^{-1}=E         または        A^{-1}\times A=E

行列の場合、その逆行列の式は次のようになります。

A=\begin{pmatrix} a_{1,1} &a_{1,2} \\ a_{2,1} &a_{2,2} \end{pmatrix}        A^{-1}=\frac{1}{a_{1,1}a_{2,2}-a_{1,2}a_{2,1}}\begin{pmatrix} a_{2,2} &-a_{1,2} \\ -a_{2,1} & a_{1,1} \end{pmatrix}

逆行列が存在するためのもう 1 つの条件は、a_{1,1}a_{2,2}-a_{1,2}a_{2,1}それが 0 に等しくないことです。以下はA^{-1}行列 A とその逆行列の例です。

A=\begin{pmatrix} 2 &3 \\ 5 &7 \end{pmatrix}                A^{-1}=\frac{1}{14-15}\begin{pmatrix} 7 &-3 \\ -5 & 2 \end{pmatrix}=\begin{pmatrix} -7 &3 \\ 5 & -2 \end{p行列}

Pythonの練習

numpy モジュールをインポートし、inv() メソッドを使用して逆行列を計算します。

import numpy as np

A = np.matrix([[2, 3], [5, 7]])
B = np.linalg.inv(A)
print('A_inv = {}'.format(B))
print('E     = {}'.format((A * B).astype(np.int64)))

操作結果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A_inv = [[-7.  3.]
 [ 5. -2.]]
E     = [[1 0]
 [0 0]]

[Done] exited with code=0 in 4.747 seconds

逆行列を使用して連立方程式を解く

次のような連立方程式があるとします。

3x+2y=5

x+2y=-1

上記の連立方程式を次の行列で表します。

\begin{pmatrix} 3 &2 \\ 1 &2 \end{pmatrix}\begin{pmatrix} x\\ y \end{pmatrix}=\begin{pmatrix} 5\\ -1 \end{pmatrix}

\begin{pmatrix} 3 &2 \\ 1 &2 \end{pmatrix}の逆行列に\begin{pmatrix} 0.5 &-0.5 \\ -0.25 &0.75 \end{pmatrix}等号の両側で同じ逆行列を乗算すると、次の結果が得られます。

\begin{pmatrix} 0.5 &-0.5 \\ -0.25 &0.75 \end{pmatrix}\begin{pmatrix} 3 &2 \\ 1 &2 \end{pmatrix}\begin{pmatrix} x\\ y \end{pmatrix }=\begin{pmatrix} 0.5 &-0.5 \\ -0.25 &0.75 \end{pmatrix}\begin{pmatrix} 5\\ -1 \end{pmatrix}

導出により以下の結果が得られます。

\begin{pmatrix} x\\ y \end{pmatrix}=\begin{pmatrix} 3\\ -2 \end{pmatrix}

上記の連立方程式の解は、x=3、y=-2 であることがわかります。

逆行列の概念を使用して、上記の実行結果を検証します。

import numpy as np

A = np.matrix([[3, 2], [1, 2]])
A_inv = np.linalg.inv(A)
B = np.matrix([[5], [-1]])
print('{}'.format(A_inv * B))

操作結果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
[[ 3.]
 [-2.]]

[Done] exited with code=0 in 2.025 seconds

テンソル

テンソルは数学的なスタック構造です。

テンソルは軸空間で表されます。

スカラーは 0 軸テンソル、ベクトルは 1 軸テンソル、行列は 2 軸テンソル、3 次元空間は 3 軸テンソルです。

3D データを定義し、shape() メソッドを使用してデータの形状をリストします。

import numpy as np

A = np.array([[[1, 2],
                [3, 4]],
               [[5, 6],
                [7, 8]],
               [[9, 10],
                [11, 12]]])

print('{}'.format(A))
print('shape = {}'.format(np.shape(A)))

結果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ch21_10.py"
[[[ 1  2]
  [ 3  4]]

 [[ 5  6]
  [ 7  8]]

 [[ 9 10]
  [11 12]]]
shape = (3, 2, 2)

[Done] exited with code=0 in 1.479 seconds

転置行列

基本概念

行列の転置の概念は、行列の列要素と行要素を交換することであるため、行列はの行列n\回mに変換できます。m\回n

行列を A 、転置行列の式はA^T

Pythonの練習

転置行列を設計するときは、numpy モジュールの transpose() を使用するか、T を使用できます。

転置行列の応用。

import numpy as np

A = np.array([[0, 2, 4, 6],
              [1, 3, 5, 7]])              
B = A.T
print('{}'.format(B))
C = np.transpose(A)
print('{}'.format(C))

操作結果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
[[0 1]
 [2 3]
 [4 5]
 [6 7]]
[[0 1]
 [2 3]
 [4 5]
 [6 7]]

[Done] exited with code=0 in 2.633 seconds

行列の転置に関する規則 

転置された行列を再度転置して、行列の内容を復元できます。

(A^T)^T=A

行列を追加して転置することは、各行列を転置して追加することと同じです。

(A+B)^T=A^T+B^T

スカラー c に行列を乗算してから転置すると、最初に転置してからスカラーを乗算した場合と同じ結果になります。

(cA)^T=cA^T

行列を転置してから反転します。これは、行列を反転してから転置することと同じです。

(A^T)^{-1}=(A^{-1})^T

行列を乗算してから転置することは、行列を転置し、順序を交換してから乗算することと同じです。

(AB)^T=B^TA^T

転置行列の適用

省略

ベクトル、行列、および重回帰

線形回帰におけるベクトルの適用

単純な一次方程式は次のとおりです。

y=ax+b

x は年間訪問データを表し、y は年間国際ライセンス販売データを表します。データが巨大で、n 年にわたって収集された場合は、ベクトルを使用してこのデータを表現できます。

x=(x_1\; x_2\cdots x_n)        #下付き文字はn年目を表し、x_nn年目の顧客訪問数を表します。

y=(y_1\; y_2\cdots y_n)        #下付き文字はn年目を表し、y_nn年目の販売試験論文数を表します。

x_n上記のsumを代入するとエラーが発生するため添字をエラーに追加して、エラーをエラー ベクトルで表すことができます。y_ny=ax+b\バレプシロン

\varepsilon =(\varepsilon_1\;\varepsilon_2\;\cdots \;\varepsilon_n)

ここで線形方程式は次のようになります。y=ax+b+\バレプシロン

ここで、傾き a と切片 b はスカラーです。傾き a にベクトル x を乗算すると n 次元ベクトルになるため、次のようにスカラー b をベクトルに変更する必要があります。b=(b_1\;b_2\;\cdots \;b_n)

線形方程式全体で導出が行われます。

y=ax+b+\バレプシロン

\varepsilon =y-ax-b

最小二乗法を使用して二乗誤差の合計を計算します。\バレプシロン _{i}^{2}=\sum_{i=1}^{n}\バレプシロン _{i}^{2}

誤差ベクトルの内積\バレプシロン、導出式:\varepsilon _{i}^{2}=\sum_{i=1}^{n}\varepsilon _{i}^{2}=\left \|  \バレプシロン \右 \|^2

誤差二乗最小化の実行は、ベクトルの内積を計算することと同じです。\varepsilon \cdot \varepsilon =(y-ax-b)\cdot (y-ax-b) 

重回帰におけるベクトルの適用

\ベータ重回帰では、係数を傾きとして使用し、切片\beta_0を で置き換えるのが一般的であり、重回帰の一般式全体は次の式で表すことができます。y=\beta _1x_1+\beta _2x_2+\cdots +\beta _nx_n+\beta _0+\varepsilon

重回帰における行列の適用

省略

切片を行列に入れる

省略

単純な線形回帰

省略

おすすめ

転載: blog.csdn.net/DXB2021/article/details/127196611