ベクトル空間と基底

ベクトルと言えば数字を並べた数ベクトルや、矢印で表される幾何学的ベクトルを思い浮かべがちですが、行列や関数、数列などもベクトルの一種です。
ベクトルの性質を知ると、数ベクトルに限らず関数などが共通でもっている性質が見えてきます。

また、内積空間など、ベクトル空間であることが条件になる理論が存在するので、前提条件のための基礎として知っておくと良いと思います。

# ベクトルとは

ベクトル空間と呼ばれる集合に対して、その元（集合を構成する要素）のことをベクトルと言います。
ベクトル空間のことを線形空間と呼ぶこともありますが、ここではベクトル空間と記載します。

「集合 $V$ が実数体 $\mathbb{R}$ 上のベクトル空間である」とは、以下の性質を持つ「演算+と実数倍」が定義されていることを言います。
（ $\mathbb{R}$ は実数全体の集合のことを指します。）
（表の中では $\boldsymbol{u,v,w}^\forall \in V, a,b^\forall \in \mathbb{R}$ （u,v,wはVの元、a,bは実数）とします）
|番号|数式|説明|
|:-:|:--|:--|
|A|$\boldsymbol{u+v} \in V$|足し算が定義出来て、その結果も集合の要素である|
|B|$a\boldsymbol{u} \in V$|実数倍が定義出来て、その結果も集合の要素である|
|1|$\boldsymbol{u}+\boldsymbol{v}=\boldsymbol{v}+\boldsymbol{u}$|足し算の前後の順番は変えてOK（交換法則）|
|2|$(\boldsymbol{u}+\boldsymbol{v})+\boldsymbol{w}=\boldsymbol{v}+(\boldsymbol{u}+\boldsymbol{w})$|足し算の計算順番は変えてOK（結合法則）|
|3|$\boldsymbol{0}^\exists \in V, \boldsymbol{u}+\boldsymbol{0}=\boldsymbol{0}+\boldsymbol{u}=\boldsymbol{u}$|足しても結果が変わらない元がある（零ベクトルのこと）|
|4|$\boldsymbol{u'}^\exists \in V, \boldsymbol{u}+\boldsymbol{u'}=\boldsymbol{u'}+\boldsymbol{u}=\boldsymbol{0}$|足して零ベクトルになる元がある（逆ベクトルのこと）|
|5|$(ab)\boldsymbol{u}=a(b\boldsymbol{u})$|実数倍を複数回行うなら先に倍率を計算してもOK|
|6|$(a+b)\boldsymbol{u}=a\boldsymbol{u}+b\boldsymbol{u}$|実数倍について、定数側は纏められる|
|7|$a(\boldsymbol{u}+\boldsymbol{v})=a\boldsymbol{u}+a\boldsymbol{v}$|実数倍について、ベクトル側も纏められる|
|8|$1\boldsymbol{u}=\boldsymbol{u}$|1倍しても元は変わらない|

A,Bは正確には1~8のような性質を持つように演算や実数倍を定義するか、もしくは先に決めた演算があって性質を調べるものなので、性質というより前提条件のようなものなのですが、成り立つ式たちという意味では同じように見ても良いかもしれません。
10個も条件があると混乱してしまいそうですが、「足し算と定数倍が、自然な形で定義できるもの」という認識でもざっくりはOKだと思います。

普通は一般的な足し算で定義することが多く定義でも+で書くことが多いので+で記載しましたが、一般的な掛け算風の演算や、その他いい感じに定義したものでも上の条件が満たせるなら良いです。
また、ざっくり「+,-,×,÷」の4つの演算ができるものを体と呼びますが、実数体 $\mathbb{R}$ の代わりに一般的な体を使ってもOKです。
体や演算の一般的な話は長くなるので他サイトを参考にしてください。

## プログラムでベクトルを表してみる

数式の記法でベクトルを定義しましたが、このままだとA,Bが違う性質であることが分かりにくく、数式に拒否反応を示すかもしれないので、ここでは集合を「クラス」のことだと思って書きなおしてみます。

まず、演算＋と実数倍が定義されているとは、以下のようなインタフェースを実装したものと考えます。
```java
interface Vector {
    public Vector add(Vector other);
    public Vector multiple(float scalar);
}
```
足し算と実数倍の関数が定義されています。
そして、実装された2つの関数 `add`, `multiple` が以下の性質を持つとき、その実装されたクラスの変数はベクトルになります。

各変数の定義は以下の型のつもりで記載します。また、比較演算子は使えるとして記載します。
```java
Vector vec1, vec2, vec3;
float a, b;
```
|番号|数式|
|:-:|:--|
|A|`vec1.add(vec2).getClass() == vec1.getClass()`|
|B|`vec1.multiple(a).getClass() == vec1.getClass()`|
|1|`vec1.add(vec2) == vec2.add(vec1)`|
|2|`vec1.add(vec2).add(vec3) == vec1.add(vec2.add(vec3))`|
|3|次の性質を持つ変数 `vec_zero`が存在する<br>`vec_zero.add(vec1) == vec1 && vec1.add(vec_zero) == vec1`|
|4|`vec1` に対して次の性質を持つ変数 `vec1_inverse`を作ることが出来る<br>`vec1_inverse.add(vec1) == vec_zero && vec1.add(vec_inverse) == vec_zero`|
|5|`vec1.multiple(a * b) == vec1.multiple(b).multiple(a)`|
|6|`vec1.multiple(a + b) == vec1.multiple(a).add(vec1.multiple(b))`|
|7|`vec1.add(vec2).multiple(a) == vec1.multiple(a).add(vec2.multiple(a))`|
|8|`vec1.multiple(1) == vec1`|

A,Bだけ型の話をしているので、別の次元の条件文であることが分かるかと思います。
また、数式の足し算や実数倍ではない書き方をしたことで、計算順番の変更は自明な結果とは思えない条件が並んでいたことも分かるかと思います。
これら10個の条件文が常にtrueになるような実装をしたクラスの変数のことがベクトルだと考えると良いと思います。

## ベクトル空間の例

具体例がある方が分かりやすいと思うのでいくつか紹介します。

### 数ベクトル

よく扱われるので紹介のみ行います。
平面や空間の位置ベクトルによく使われる、数字をいくつか並べたものです。
```math
\left(
\begin{array}{c}
1\\2\\3
\end{array}
\right) + \left(
\begin{array}{c}
4\\5\\6
\end{array}
\right) = \left(
\begin{array}{c}
5\\7\\9
\end{array}
\right)\\
3\left(
\begin{array}{c}
1\\2\\3
\end{array}
\right) = \left(
\begin{array}{c}
3\\6\\9
\end{array}
\right)
```

### 幾何学的ベクトル

こちらもよく扱われるものなのでさらっと画像一枚で紹介します。
有効線分という矢印で表される、向きと大きさがあるものです。
![幾何学的ベクトル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3389082/875d08bb-2524-6b5a-66b5-445d7a743964.png)

### 関数

関数については以下のように足し算と定数倍を定義します。
ただし、分かりやすさのため1変数の関数 $f:\mathbb{R}\rightarrow\mathbb{R}$ 全体の集合 $F\[x\]$ で説明しますが、2変数以上などでも同じように定義できます。

関数なので、引数 $x$ を付けて書くので括弧だらけになります。少しわかりにくいかもしれないので、あえて関数側にかかっている括弧は角括弧[]にしています。
```math
f,g \in F[x], a \in \mathbb{R}\\
[f+g](x) = f(x)+g(x)\\
[a*f](x) = a*f(x)
```
以下の $f,g,h$ は $F\[x\]$ の元なので、具体的にA,B,1~8を試してみます。
```math
f(x) = x+1\\
g(x) = 3x\\
h(x) = x^2
```
|番号|数式|
|:-:|:--|
|A|$\[f+g\](x)=f(x)+g(x)=(x+1)+(3x)=4x+1 \in F\[x\]$|
|B|$\[4f\](x)=4\*f(x)=4\*(x+1)=4x+4 \in F\[x\]$|
|1|$\[f+g\](x)=f(x)+g(x)=(x+1)+(3x)=4x+1$<br>$\[g+f\](x)=g(x)+f(x)=(3x)+(x+1)=4x+1$|
|2|$\[\[f+g\]+h\](x)=\[f+g\](x)+h(x)=(f(x)+g(x))+h(x)=((x+1)+(3x))+(x^2)=x^2+4x+1$<br>$\[f+\[g+h\]\](x)=f(x)+\[g+h\](x)=f(x)+(g(x)+h(x))=(x+1)+((3x)+(x^2))=x^2+4x+1$|
|3|$c_0$を結果が0になる定数関数とする（$c_0(x)=0$）。<br>$\[f+c_0\](x)=f(x)+c_0(x)=(x+1)+(0)=x+1$<br>$\[c_0+f\](x)=c_0(x)+f(x)=(0)+(x+1)=x+1$|
|4|$f'(x)=f(x)=-x-1$とすると、<br>$\[f+f'\](x)=f(x)+f'(x)=(x+1)+(-x-1)=0$<br>$\[f'+f\](x)=f'(x)+f(x)=(-x-1)+(x+1)=0$|
|5|$\[(4\*5)\*f\](x)=\[20\*f\](x)=20\*f(x)=20\*(x+1)=20x+20$<br>$\[4\*\[5\*f\]\](x)=4\*\[5\*f\](x)=4\*(5\*f(x))=4\*(5\*(x+1))=4\*(5x+5)=20x+20$|
|6|$\[(4+5)\*f\]=\[9\*f\](x)=9\*(x+1)=9x+9$<br>$\[4\*f\](x)+\[5\*f\](x)=4\*(x+1)+5\*(x+1)=4x+4+5x+5=9x+9$|
|7|$\[4\*(f+g)\]=4\*\[f+g\](x)=4\*(f(x)+g(x))=4\*((x+1)+(3x))=4\*(4x+1)=16x+4$<br>$\[4\*f\](x)+\[4\*g\](x)=4\*f(x)+4\*g(x)=4\*(x+1)+4\*(3x)=4x+4+12x=16x+4$|
|8|$\[1\*f\](x)=1\*f(x)=1\*(x+1)=x+1$|

表の中で出てきた定数関数と恒等関数については、以下のグラフのような関数です。
![恒等関数と定数関数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3389082/6ef605ab-7fed-1e2d-0477-b248a7070a57.png)

それぞれの条件の各等式が成り立っていることが確認できました。

### 数列

数列は以下のように足し算と定数倍を定義します。
無限に続く数列の集合 $S$ で説明しますが、有限数列でも同じように定義できます。
```math
\{a_n\}, \{b_n\} \in S, k \in \mathbb{R}\\
\{a_n\}+\{b_n\}=\{a_n+b_n\}\quad\cdots\cdots第i項は a_i+b_i になる\\
k\{a_n\}=\{ka_n\}\quad\cdots\cdots第i項は ka_i になる
```
以下の $\{a_n\},\{b_n\},\{c_n\}$ は $S$ の元なので、具体的にA,B,1~8を試してみます。
数列なので数字を並べた表記をしますが、書き下そうとすると見にくくなってしまうため、この記事では書き下し時に角括弧[]で1つの数列であることを示す書き方をします。
```math
\{a_n\}: 1,2,3,4,\cdots\cdots\quad(自然数を並べた数列)\\
\{b_n\}: 1,2,4,8,\cdots\cdots\quad(公比2の等比数列)\\
\{c_n\}: 1,3,5,7,\cdots\cdots\quad(奇数を並べた数列)
```
|番号|数式|
|:-:|:--|
|A|$\\{a_n\\}+\\{b_n\\}=1+1, 2+2, 3+4, 4+8,\cdots\cdots =2,4,7,12,\cdots\cdots \in S$|
|B|$2\\{a_n\\}=2\*1, 2\*2, 2\*3, 2\*4, \cdots\cdots=2,4,6,8,\cdots\cdots \in S$|
|1|$\\{a_n\\}+\\{b_n\\}=1+1, 2+2, 3+4, 4+8,\cdots\cdots =2,4,7,12,\cdots\cdots$<br>$\\{b_n\\}+\\{a_n\\}=1+1, 2+2, 4+3, 8+4,\cdots\cdots=2,4,7,12,\cdots\cdots$|
|2|$(\\{a_n\\}+\\{b_n\\})+\\{c_n\\}=\[1+1, 2+2, 3+4, 4+8,\cdots\cdots \]+\[1,3,5,7,\cdots\cdots \]=\[2,4,7,12,\cdots\cdots \]+\[1,3,5,7,\cdots\cdots \]=2+1, 4+3, 7+5, 12+7,\cdots\cdots =3,7,12,19,\cdots\cdots $<br>$\\{a_n\\}+(\\{b_n\\}+\\{c_n\\})=\[1,2,3,4,\cdots\cdots \]+\[1+1,2+3,4+5,8+7,\cdots\cdots \]=\[1,2,3,4,\cdots\cdots \]+\[2,4,9,15,\cdots\cdots \]=1+2, 2+5, 3+9, 4+15,\cdots\cdots =3,7,12,19,\cdots\cdots $|
|3|$\\{o_n\\}$を0のみが出てくる数列とする（$\\{o_n\\}=0,0,0,0,\cdots\cdots$）。<br>$\\{a_n\\}+\\{o_n\\}=4+0, 3+0, 2+0, 1+0,\cdots\cdots=4,3,2,1,\cdots\cdots$<br>$\\{o_n\\}+\\{a_n\\}=0+4, 0+3, 0+2, 0+1,\cdots\cdots=4,3,2,1,\cdots\cdots$|
|4|$\\{a'_n\\}: -1,-2,-3,-4,\cdots\cdots$とすると、<br>$\\{a_n\\}+\\{a'_n\\}=1+(-1), 2+(-2), 3+(-3), 4+(-4),\cdots\cdots=0,0,0,0,\cdots\cdots$<br>$\\{a'_n\\}+\\{a_n\\}=(-1)+1, (-2)+2, (-3)+3, (-4)+4,\cdots\cdots=0,0,0,0,\cdots\cdots$|
|5|$(2\*3)\\{a_n\\}=6\\{a_n\\}=6\*1, 6\*2, 6\*3, 6\*4,\cdots\cdots=6,12,19,24,\cdots\cdots$<br>$2(3\\{a_n\\})=2\*\[3\*1, 3\*2, 3\*3, 3\*4,\cdots\cdots\]=2\*\[3, 6, 9, 12,\cdots\cdots\]=2\*3, 2\*6, 2\*9, 2\*12,\cdots\cdots=6,12,18,24,\cdots\cdots$|
|6|$(2+3)\\{a_n\\}=5\\{a_n\\}=5\*1, 5\*2, 5\*3, 5\*4,\cdots\cdots=5,10,15,20,\cdots\cdots$<br>$2\\{a_n\\}+3\\{a_n\\}=\[2\*1, 2\*2, 2\*3, 2\*4,\cdots\cdots\]+\[3\*1, 3\*2, 3\*3, 3\*4,\cdots\cdots\]=\[2, 4, 6, 8,\cdots\cdots\]+\[3, 6, 9, 12,\cdots\cdots\]=2+3, 4+6, 6+9, 8+12,\cdots\cdots=5,10,15,20,\cdots\cdots$|
|7|$2(\\{a_n\\}+\\{b_n\\})=2\[1+1, 2+2, 3+4, 4+8,\cdots\cdots\]=2\[2,4,7,12,\cdots\cdots\]=2\*2, 2\*4, 2\*7, 2\*12,\cdots\cdots=4,8,14,24,\cdots\cdots$<br>$2\\{a_n\\}+2\\{b_n\\}=\[2\*1, 2\*2, 2\*3, 2\*4,\cdots\cdots\]+\[2\*1, 2\*2, 2\*4, 2\*8,\cdots\cdots\]=\[2,4,6,8,\cdots\cdots\]+\[2,4,8,16,\cdots\cdots\]=2+2, 4+4, 6+8, 8+16,\cdots\cdots=4,8,14,24,\cdots\cdots$|
|8|$1\\{a_n\\}=1\*1, 1\*2, 1\*3, 1\*5,\cdots\cdots=1,2,3,4,\cdots\cdots$|

それぞれの条件の各等式が成り立っていることが確認できました。

他にも行列などベクトル空間とみなせる集合はたくさんありますが、基本的には自然な足し算と実数倍が定義できていればベクトル空間になっていることが多いです。
零ベクトルがどんなものなのか？を気にしておけばOKです。

## 基底と次元

特定のベクトルの組 $(\boldsymbol{v}_1, \boldsymbol{v}_2,\cdots, \boldsymbol{v}_n)$ に対して、ベクトル空間のどの元を取ってきても、その組の実数倍の和で表せて、その方法が1通りであるとき、そのベクトルの組を基底と呼びます。また、その組に含まれる元の個数がそのベクトル空間の次元になります。
基底の取り方は無限に存在しますが、次元はベクトル空間に対して一意になります。

### 具体例

こちらも具体例がある方が分かりやすいと思うので、いくつか例を出します。

#### 数ベクトル

3つの数字を並べた、数ベクトルを例に出します。

普通は以下の3つを基底にすることが多いです。
```math
\left(
\begin{array}{c}
1\\0\\0
\end{array}
\right) , \left(
\begin{array}{c}
0\\1\\0
\end{array}
\right) , \left(
\begin{array}{c}
0\\0\\1
\end{array}
\right)
```
分かりやすいので上の3つを使うことが多いのですが、基底の定義からだと、以下のような3つのベクトルを基底としても構いません。
```math
\left(
\begin{array}{c}
2\\1\\0
\end{array}
\right) , \left(
\begin{array}{c}
1\\0\\1
\end{array}
\right) , \left(
\begin{array}{c}
5\\1\\2
\end{array}
\right)
```
実際に例えば $\left( \begin{array}{c} 1\\\2\\\3 \end{array} \right)$ というベクトルに対しては
```math
8 \left(
\begin{array}{c}
2\\1\\0
\end{array}
\right) +15 \left(
\begin{array}{c}
1\\0\\1
\end{array}
\right) -6 \left(
\begin{array}{c}
5\\1\\2
\end{array}
\right)
```
という組み合わせで作ることが出来ます。
この例では基底は1通りではないことが分かればOKです。
また、どちらを基底としても個数は3つなので、この集合は次元が3のベクトル空間になります。

#### 放物線と直線を集めた集合

放物線 $f(x)=ax^2+bx+c$, 直線 $g(x)=ax+b$ を集めた集合を $F\[x\]_2$ とします。
※ちょうど縦向きの直線は含めません。

この集合はベクトル空間になるのですが、 $(x^2,x,1)$の組を基底として取ることが出来ます。
例えば放物線 $f(x)=x^2+2x+4$ であれば、 $f(x)=1\*x^2+2\*x+4\*1$ と表せます。
また、直線 $g(x)=3x+2$ であれば、 $g(x)=0\*x^2+3\*x+2\*1$ と表せます。

基底の個数が3つなので、この集合は次元が3のベクトル空間になります。

#### 等差数列を集めた集合

等差数列は以下のような、差が一定な数列です。
```math
\curvearrowright{+2}\\
1,3,5,7,\cdots\cdots\\
\curvearrowright{-3}\\
5,2,-1,-4,\cdots\cdots
```
この集合もベクトル空間になるのですが、一般項がそれぞれ $a_n=1, b_n=n$ となる2つの数列 $\\{a_n\\}, \\{b_n\\}$ の組を基底に取ることが出来ます。

```math
\{a_n\}: 1,1,1,1,\cdots\cdots\\
\{b_n\}: 1,2,3,4,\cdots\cdots
```

例えば先ほどの奇数の列なら、 $-1*\\{a_n\\} + 2*\\{b_n\\}$ と表せます。
また、2つ目の公差が-3の数列なら、 $8*\\{a_n\\} - 3*\\{b_n\\}$ と表せます。

基底の個数が2つなので、この集合は次元が2のベクトル空間になります。

## ベクトルってどこに使うの？

ベクトルであることが分かれば、定義にあるような各性質の式を使うこともできますし、定義以外でもベクトルなら共通で使える定理（性質）があれば、数ベクトルのベクトル空間だけでなく、関数など他のベクトル空間でもその性質をそのまま使うことが出来ます。
上手くベクトルの性質を使っておくと、計算量を減らすようなアルゴリズムの調整ができることもあります。
例えば、何回も関数を使用しないといけない場合、もしそれがベクトル空間の話であれば、先に1つの関数にまとめてしまった関数を作ってから写像してしまった方が動作が軽くなるかもしれません。

ベクトル空間はとある性質を持った集合ということでこれだけだと直接は使いにくいかもしれませんが、例えば線形変換や、固有値・固有ベクトル、内積空間などの概念はベクトル空間が前提になってきます。
ベクトルの定義のところの式を使って定理を組み立てていくので、実際に他の定理やプログラムで役に立つ実例が出てくるのはそのあたりのもう少し制約を付けたあたりになってきますが、例えば「関数もベクトルだ」ということが分かると、「積分の値を関数というベクトル同士の内積として使用する」という話につなげられていきます。
└内積→ノルム→距離→誤差とつなげていくと、「もともとベクトル空間だったから」なんてことから、誤差計算で対応が簡単になったりするかも

## 最後に

ベクトル空間の定義だけ書かれても使い道が分からないと思うので、今後ベクトル空間に関連した記事を書いた場合はこの後に追記していきます。
不定期だと思うので期待はしないでください。

### 参考文献

[ベクトル空間・部分ベクトル空間の定義と具体例10個](https://mathlandscape.com/vector-space/)
[ベクトル空間と次元](https://manabitimes.jp/math/1806)