2012/08/08

文系のための「行列」(3)

そろそろ、「行列」というのがどういったものか、
ナントナクでも理解できているのではないだろうか?
そうでないと、少々、困ってしまう。まだ、難しい話はしていない。

すでに述べた話として、
行列は、複数のベクトルの集まりであり、
一つのベクトルは、スカラーの集まりである。

別の言い方をするのであれば、
スカラーが、格子状に並んでいるのが行列とも言える。
まぁ、当たり前のことではあるが。

教科書では、これを「成分」と呼ぶ場合が多い。
ということで、これも覚えておいた方が良い。
実際に、ここからは「成分」という言葉を実際に使うことになる。

さてさて、まだ、難しい話はしていないが、覚えないと行けないことはまだある。
行列で解説されている教科書を読むには、
最低限、行列の「特殊な形式」を知っておかないといけない。

何せ、理工系の学生に書かれたものの多くは、
周知の事実として、良心的な解説はしてくれない。

逆に、完全に素人向けの解説は、説明が簡単すぎる。
基礎知識の無い文系人間がゼロから始めるには、
あまりにも敷居が高い。仕方ないことかもしれないが。

毎度、関係ない話から入ってしまう。我ながら困ったものである。
そうそう。今回は、行列の「特殊な形式」について書くのであった。
ここから先の話は、覚えるしか無い。しかし、多くは無い。

ここで覚えないといけないのは以下の3つ。
  • 正方行列
  • 対称行列
  • 対角行列
他にも覚えないといけないものはあるが、
見た目の違いでは、上の三つの行列を知る必要がある。

さて、では三つの行列の種類について順番に見ていくことにしよう。
ここからは、「R」 というソフトを使って、話を進めることにする。
以下からダウンロードできる。もちろん、オープンソースで無償。

http://www.r-project.org/

コマンドライン操作なので拒否反応がでるかもしれない。
ここは、我慢。乗り越えれば、なんてことない。難しくはない。
とりあえず、今回の話で登場するコマンドを、コピー・アンド・ペースト。

さてさて、Rのインストールが完了していとして、
早速、Rを使って演習を始める。まずは、Rの基本操作の練習から。

Rが立ち上がったら、コマンドコンソールに以下をコピペ。

# 三つのスカラー「5」と「8」と「3」から、
# 変数名を「x」とするベクトルを作る。
x <- c(5, 8, 3)

ここでは、c() というコマンド(命令)が登場している。
こういったコマンドのことを、一般的に「関数」と呼ぶ。
英語では「function」と呼ぶ。何かの機能を定義しているのである。

c()関数は、combination の略で、スカラーからベクトルを作るための関数
この関数は、非常に良く使う。計算のみならず、関数のパラメータの指定や、
グラフを描く際の色の指定や、他にも色々な所で登場する。

先頭行にシャープ(「#」)が付いている行は、
関数では無い行を意味する。なぜ、書くのか?単なるメモである。

数千行に渡ってプログラムを書いていると、
書いている本人が色々と忘れる。他の人に教えるにも不便。
この話は、いずれ詳しく書く事にしよう。

さてさて、次は、Rで行列を作る方法。今度は、ベクトルから行列を作ってみる。

# xと名付けたベクトルに、サンプルデータを入れる。
x <- c(8,2,9,3,2,4,6,5,9,6,5,4,3,5,4,1)

# ベクトルx からMと名付けた行列を作る。

M <- matrix(x, nrow=4, ncol=4)

ここで登場するのはmatrix()関数。これもよく使う。
今度は、括弧内に、x、nrow、ncolの3つが入っている。これらをパラメータと呼ぶ。
ここでは、最低限の3つのパラメータを指定しているが、実際にはもっと存在している。

まず、xというのは、最初に作ったベクトル16個のスカラーから成っている。
nrowというのは、行数を指定するパラメータ。ここでは4を指定している。
ncolというのは、列数を指定するパラメータ。ここでも4を指定している。

要するに、xに入っているベクトルの成分(スカラー)を使って、
4✕4の行列を作成しているのである。
ちなみに、ここで作られた行列は以下のようになっている。



さてさて、いよいよ、本題に入るとしよう。

まずは、「正方行列」について。「正方形」という言葉からも連想できるかと思うが、
要するに、「正方行列」とは、行数と列数が同じ行列のことを言う。

ある行列があって、その行列が n行 × p列 であったとする。
多次元データの場合では、対象数がn個で、属性数がp個である。
つまり、n = p となっているような行列のことである。

実は、先程、Rのコマンド操作の練習で作成した行列「M」も正方行列
ちなみに、「R」では、行数と列数を以下の方法で取り出すことができるので、
一応、確かめてみる(数が少ないので見れば判るのであるが...)。

# 行列M の行数を取り出す。
nrow(M)

# 行列M の列数を取り出す。

ncol(M)

実行結果は以下の通り。

> # 行列M の行数を取り出す。
> nrow(M)
[1] 4

> # 行列M の列数を取り出す。
> ncol(M)
[1] 4

ここでは、nrow()関数ncol()関数が登場している。パラメータには行列を指定。
結果は、行数が4、列数が4、という結果が帰ってくる。
行数列数が同じなので、この行列は「正方行列」と言える。

ところで、この正方行列を「じ〜」と眺めてみると、ある特殊な傾向が見えてくる。
一つ目の「縦ベクトル」と一つ目の「横ベクトル」はどのようになっているか?
そうそう、同じベクトルが入っている。これが「対称行列」と呼ばれるもの。

対称行列というのは、「対角成分」を挟んで、「上側の部分」と「下側の部分」が
同じになっているもの。したがって、行と列を入れ替えても同じになる。
これも重要。多次元データ解析では、毎度のように出てくる。

Rの基本操作の練習も兼ねて、同じ行列もう一度作成し、
縦ベクトル横ベクトルを取り出す。

# xと名付けたベクトルに、サンプルデータを入れる。
x <- c(8,2,9,3,2,4,6,5,9,6,5,4,3,5,4,1)

# ベクトルx からMと名付けた行列を作る。

M <- matrix(x, nrow=4, ncol=4)

# 一つ目の「縦ベクトル(一列目)」を抽出する

M[,1]

# 一つ目の「横ベクトル(一行目)」を抽出する

M[1,]

実行結果は以下の通り。

> # xと名付けたベクトルに、サンプルデータを入れる。
> x <- c(8,2,9,3,2,4,6,5,9,6,5,4,3,5,4,1)

> # ベクトルx からMと名付けた行列を作る。
> M <- matrix(x, nrow=4, ncol=4)

> # 一つ目の「縦ベクトル(一列目)」を抽出する
> M[, 1]
[1] 8 2 9 3

> # 一つ目の「横ベクトル(一行目)」を抽出する
> M[1, ]
[1] 8 2 9 3

行列が入った変数「M」の後ろに大括弧(「[」と「]」)が付いていて、
カンマ(「,」)」で区切られている。これは、見れば解ること。
要するに、カンマの前で「行番号を、後ろで「列番号を指定するのである。

ふむ。確かに、対角成分を挟んで、上半分の成分と、下半分の成分が同じ。
一つ目の「縦ベクトル」(一列目)と、一つ目の「横ベクトル」(一行目)は、
いずれも、[8, 2, 9, 3] である。他の行と列も同じ。要するに反転させても同じ。

最後は、「対角行列」と呼ばれる行列。
結論から言うと、以下のような行列が「対角行列」である。
どのような特徴があるか?この行列をよく見て、その特徴を考えてみる。

 

まず、この行列は、3✕3の行列なので、正方行列である。これは解る。
そして、もうひとつの特徴として、対角成分以外が全て「0」であって、
対角成分のみに値が入っている。そのような特徴がある。

とりあえず、この種の形式の行列が確認できたところで、
Rを使って簡単な演習を行う。


# 三つのスカラー「5」と「8」と「3」から、
# 変数名を「x」とするベクトルを作る。
x <- c(5, 8, 3)

# 作ったベクトル「x」から、
# 変数名を「M」とする「対角行列」を作る。
(M <- diag(x))

そして、その実行結果。

> # 三つのスカラー「5」と「8」と「3」から、
> # 変数名を「x」とするベクトルを作る。
> x <- c(5, 8, 3)
>
> # 作ったベクトル「x」から、
> # 変数名を「M」とする「対角行列」を作る。
> (M <- diag(x))
     [,1] [,2] [,3]
[1,]    5    0    0
[2,]    0    8    0
[3,]    0    0    3


ここでは、diag()関数 が登場する。ベクトルから「対角行列」を作るための関数。
ちなみに、括弧(「(」と「)」)で括っているが、
このようにすることで、出力結果をすぐに表示してくれる。

さて、この結果はどのようになっているか?

たしかに、上手くいった。これが「対角行列」と呼ばれるものである。


2 件のコメント:

  1. まず、対象行列→対称行列だと思います。
    そして、n×nの正方行列のうち、対角成分以外のすべての成分が0であるものを対角行列と呼ぶのではないかと思います(堀内龍太郎、浦部治一郎(2005)「線形代数学」p.9~)。

    返信削除
  2. 誤字の指摘ありがとうございます。説明の仕方については...う〜ん、Rのコマンドの説明順序とかもあって、迷ったんですよね。まぁ、最初にこの記事を書いたのはかなり前だし、とにかく、書きなおして見ました。

    返信削除