1.12 行列演算によるデータの平均の計算

ここでは行列の演算を用いてデータの平均を計算する例を紹介する. まず,以下のようなデータを考えてみる.

##    Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1           5.1         3.5          1.4         0.2
## 2           4.9         3.0          1.4         0.2
## 3           4.7         3.2          1.3         0.2
## 4           4.6         3.1          1.5         0.2
## 5           5.0         3.6          1.4         0.2
## 6           5.4         3.9          1.7         0.4
## 7           4.6         3.4          1.4         0.3
## 8           5.0         3.4          1.5         0.2
## 9           4.4         2.9          1.4         0.2
## 10          4.9         3.1          1.5         0.1

Sepal.Length, Sepal.Width, Petal.Length, Petal.Widthという4種類のデータがそれぞれ10観測されている. このとき,これらをサイズ10×4の行列として見ることができる. 単純にそれぞれのデータの平均を計算するなら,例えばSepal.Lengthであれば,(5.1+4.9++4.4+4.9)/10という計算をすれば良い.他のデータについてもそれぞれ平均を計算すれば良いが,行列演算で表現すると一度に計算することも可能である.

具体的には左から(1/n)1nというベクトルを掛けるだけである.ここで1nとはn次元の要素が全て1であるようなベクトルである.これを1/nでスカラー倍しているので全ての要素が1/nであるベクトルである. 実際データ行列をXとすれば

1n1nX=(1/n1/n1/n)(x11x12x1mx21x22x2mxn1xn2xnm)=(1nni=1xi11nni=1xi21nni=1xim) となり,1/nni=1xijというのはj列目の平均そのものであるので,結果がデータの平均を要素に持つベクトルであることがわかる.

例のデータで実際に計算して見ると

n <- nrow(X) # 行数
ones <- rep(1, n) # 1ベクトル
avgs <- (1/n)*ones %*% X # 1/n 1 X の計算
print(avgs)
##      Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,]         4.86        3.31         1.45        0.22

となり,平均が計算できていることが分かる.

Exercise 1.8 (行列演算の応用) 上記では行列演算による平均の計算を紹介した.(1/n)1nXは平均を計算するが,1nXという1/nのスカラー倍をしない場合を考えてみよう.この演算の結果として得られるベクトルはどのようなベクトルになっているか答えよ.