ベクトルの集まりが「余分なものを含んでいないか」を判定する概念が、線形独立 と 線形従属 です。イメージとしては、線形独立なベクトルとは「どれも他のベクトルの組み合わせでは作れない」もので、線形従属なベクトルには「仲間はずれにしても情報が減らない」余分なベクトルが含まれています。
この概念は、基底の定義、行列のランク、連立方程式の解の構造など、線形代数のあらゆる場面で中心的な役割を果たします。機械学習では特徴量の冗長性の議論、信号処理では基底関数の独立性など、応用場面も広範です。
本記事の内容
- 線形結合の定義
- 線形独立・線形従属の厳密な定義
- 2次元・3次元での幾何学的意味
- 判定方法(行列を用いた方法)
- Pythonでの判定と可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
線形結合とは
定義
ベクトル空間 $V$ のベクトル $\bm{v}_1, \bm{v}_2, \ldots, \bm{v}_k$ に対して、スカラー $c_1, c_2, \ldots, c_k \in \mathbb{R}$ を用いた
$$ \begin{equation} c_1 \bm{v}_1 + c_2 \bm{v}_2 + \cdots + c_k \bm{v}_k \end{equation} $$
を $\bm{v}_1, \bm{v}_2, \ldots, \bm{v}_k$ の 線形結合(linear combination)と呼びます。$c_1, c_2, \ldots, c_k$ を 係数 と呼びます。
直感
線形結合とは、ベクトルを「伸び縮みさせて足し合わせる」操作です。$\mathbb{R}^2$ で $\bm{v}_1 = (1, 0)$, $\bm{v}_2 = (0, 1)$ なら、任意の $(a, b) = a\bm{v}_1 + b\bm{v}_2$ と表せるので、$\bm{v}_1, \bm{v}_2$ の線形結合で平面全体が生成されます。
線形独立と線形従属の定義
線形独立(linearly independent)
ベクトル $\bm{v}_1, \bm{v}_2, \ldots, \bm{v}_k$ が 線形独立 であるとは:
$$ \begin{equation} c_1 \bm{v}_1 + c_2 \bm{v}_2 + \cdots + c_k \bm{v}_k = \bm{0} \implies c_1 = c_2 = \cdots = c_k = 0 \end{equation} $$
すなわち、線形結合で零ベクトルを作れるのは すべての係数が $0$ のときだけ である場合、線形独立といいます。
線形従属(linearly dependent)
ベクトル $\bm{v}_1, \bm{v}_2, \ldots, \bm{v}_k$ が 線形従属 であるとは、線形独立でないこと、すなわち:
$$ c_1 \bm{v}_1 + c_2 \bm{v}_2 + \cdots + c_k \bm{v}_k = \bm{0} $$
を満たす すべてが $0$ でない係数の組 $(c_1, c_2, \ldots, c_k)$ が存在することです。
同値な言い換え
ベクトルの組 $\{\bm{v}_1, \ldots, \bm{v}_k\}$ が線形従属であることは、次と同値です。
少なくとも1つのベクトルが、残りのベクトルの線形結合で表せる。
証明を示します。$c_j \neq 0$ となる $j$ が存在するとき:
$$ \begin{align} c_1 \bm{v}_1 + \cdots + c_j \bm{v}_j + \cdots + c_k \bm{v}_k &= \bm{0} \\ c_j \bm{v}_j &= -(c_1 \bm{v}_1 + \cdots + c_{j-1} \bm{v}_{j-1} + c_{j+1} \bm{v}_{j+1} + \cdots + c_k \bm{v}_k) \\ \bm{v}_j &= -\frac{c_1}{c_j} \bm{v}_1 – \cdots – \frac{c_{j-1}}{c_j} \bm{v}_{j-1} – \frac{c_{j+1}}{c_j} \bm{v}_{j+1} – \cdots – \frac{c_k}{c_j} \bm{v}_k \end{align} $$
よって $\bm{v}_j$ は他のベクトルの線形結合で書けます。逆も同様に示せます。
幾何学的意味
2次元の場合
$\mathbb{R}^2$ の2本のベクトル $\bm{v}_1, \bm{v}_2$ について:
- 線形独立 $\Leftrightarrow$ 2本のベクトルが 平行でない(異なる方向を向いている)
- 線形従属 $\Leftrightarrow$ 2本のベクトルが 平行(一方が他方のスカラー倍)
直感的には、2本のベクトルが異なる方向を指していれば、その線形結合で平面全体を覆えます。平行だと1次元(直線)しか覆えず、1本は「余分」です。
3次元の場合
$\mathbb{R}^3$ の3本のベクトル $\bm{v}_1, \bm{v}_2, \bm{v}_3$ について:
- 線形独立 $\Leftrightarrow$ 3本のベクトルが 同一平面上にない
- 線形従属 $\Leftrightarrow$ 3本のベクトルが 同一平面上にある(1本が残り2本の線形結合で書ける)
3本のベクトルが異なる平面方向に広がっていれば、その線形結合で3次元空間全体を覆えます。
判定方法
行列を使った判定
ベクトル $\bm{v}_1, \bm{v}_2, \ldots, \bm{v}_k \in \mathbb{R}^n$ を列ベクトルとして並べた行列を
$$ \bm{A} = [\bm{v}_1 \mid \bm{v}_2 \mid \cdots \mid \bm{v}_k] $$
とするとき:
$$ c_1 \bm{v}_1 + c_2 \bm{v}_2 + \cdots + c_k \bm{v}_k = \bm{0} \iff \bm{A}\bm{c} = \bm{0} $$
ここで $\bm{c} = (c_1, c_2, \ldots, c_k)^T$ です。
したがって、$\bm{v}_1, \ldots, \bm{v}_k$ が線形独立であることは、同次方程式 $\bm{A}\bm{c} = \bm{0}$ の解が $\bm{c} = \bm{0}$ のみであることと同値です。
行列式による判定($k = n$ の場合)
$n$ 本のベクトルが $\mathbb{R}^n$ で線形独立であるための必要十分条件は:
$$ \det(\bm{A}) \neq 0 $$
行列式が $0$ でなければ線形独立、$0$ なら線形従属です。
ランクによる判定(一般の場合)
$k$ 本のベクトルを列に並べた $n \times k$ 行列 $\bm{A}$ に対して:
$$ \bm{v}_1, \ldots, \bm{v}_k \text{ が線形独立} \iff \mathrm{rank}(\bm{A}) = k $$
行列のランクが列数に等しければ線形独立です。
具体例
例1: $\mathbb{R}^2$ で線形独立
$\bm{v}_1 = (1, 2)$, $\bm{v}_2 = (3, 1)$ の線形独立性を調べます。
$$ c_1 \begin{pmatrix} 1 \\ 2 \end{pmatrix} + c_2 \begin{pmatrix} 3 \\ 1 \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \end{pmatrix} $$
これは連立方程式になります。
$$ \begin{align} c_1 + 3c_2 &= 0 \\ 2c_1 + c_2 &= 0 \end{align} $$
第1式から $c_1 = -3c_2$ を第2式に代入すると:
$$ \begin{align} 2(-3c_2) + c_2 &= 0 \\ -5c_2 &= 0 \\ c_2 &= 0 \end{align} $$
よって $c_1 = 0$。線形独立 です。
行列式でも確認できます:
$$ \det \begin{pmatrix} 1 & 3 \\ 2 & 1 \end{pmatrix} = 1 \cdot 1 – 3 \cdot 2 = -5 \neq 0 $$
例2: $\mathbb{R}^3$ で線形従属
$\bm{v}_1 = (1, 2, 3)$, $\bm{v}_2 = (4, 5, 6)$, $\bm{v}_3 = (2, 1, 0)$ について:
$$ \bm{v}_1 – 2\bm{v}_2 + \bm{v}_3 \ne \bm{0} $$
ではなく、正しく計算してみましょう。
$$ \bm{v}_3 = 2\bm{v}_1 – \bm{v}_2 $$
を確認します。
$$ 2 \begin{pmatrix} 1 \\ 2 \\ 3 \end{pmatrix} – \begin{pmatrix} 4 \\ 5 \\ 6 \end{pmatrix} = \begin{pmatrix} 2 – 4 \\ 4 – 5 \\ 6 – 6 \end{pmatrix} = \begin{pmatrix} -2 \\ -1 \\ 0 \end{pmatrix} $$
これは $-\bm{v}_3$ に等しいので、$\bm{v}_3 = -(2\bm{v}_1 – \bm{v}_2) = -2\bm{v}_1 + \bm{v}_2$ です。つまり:
$$ 2\bm{v}_1 – \bm{v}_2 + \bm{v}_3 = \bm{0} $$
係数 $(2, -1, 1)$ はすべて $0$ ではないので、線形従属 です。
行列式でも確認できます:
$$ \det \begin{pmatrix} 1 & 4 & 2 \\ 2 & 5 & 1 \\ 3 & 6 & 0 \end{pmatrix} = 1(0 – 6) – 4(0 – 3) + 2(12 – 15) = -6 + 12 – 6 = 0 $$
Pythonでの実装
線形独立性の判定
import numpy as np
def check_linear_independence(vectors):
"""
ベクトルのリストが線形独立かどうかを判定する
Parameters
----------
vectors : list of array-like
判定したいベクトルのリスト
Returns
-------
bool
線形独立なら True
"""
# ベクトルを列ベクトルとして行列を構成
A = np.column_stack(vectors)
rank = np.linalg.matrix_rank(A)
n_vectors = len(vectors)
print(f"行列 A:\n{A}")
print(f"ランク: {rank}, ベクトル数: {n_vectors}")
if rank == n_vectors:
print("→ 線形独立")
return True
else:
print("→ 線形従属")
return False
# 例1: 線形独立な場合
print("=== 例1: R^2 で線形独立 ===")
v1 = np.array([1, 2])
v2 = np.array([3, 1])
check_linear_independence([v1, v2])
print()
# 例2: 線形従属な場合
print("=== 例2: R^3 で線形従属 ===")
v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6])
v3 = np.array([2, 1, 0])
check_linear_independence([v1, v2, v3])
print()
# 例3: R^3 で3本が線形独立
print("=== 例3: R^3 で線形独立 ===")
v1 = np.array([1, 0, 0])
v2 = np.array([0, 1, 0])
v3 = np.array([0, 0, 1])
check_linear_independence([v1, v2, v3])
# 正方行列の場合は行列式でも判定
print("\n=== 行列式による判定 ===")
A = np.column_stack([np.array([1, 2]), np.array([3, 1])])
det_A = np.linalg.det(A)
print(f"det(A) = {det_A:.4f} → {'線形独立' if abs(det_A) > 1e-10 else '線形従属'}")
2次元での可視化
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# --- 線形独立の例 ---
ax = axes[0]
v1 = np.array([1, 2])
v2 = np.array([3, 1])
# 線形結合が張る領域を背景で表示
t1 = np.linspace(-2, 2, 50)
t2 = np.linspace(-2, 2, 50)
T1, T2 = np.meshgrid(t1, t2)
X = T1 * v1[0] + T2 * v2[0]
Y = T1 * v1[1] + T2 * v2[1]
ax.scatter(X.flatten(), Y.flatten(), c='lightblue', s=1, alpha=0.3, label='Span')
# ベクトルを矢印で表示
ax.quiver(0, 0, v1[0], v1[1], angles='xy', scale_units='xy', scale=1,
color='blue', linewidth=2, label='$\\mathbf{v}_1 = (1, 2)$')
ax.quiver(0, 0, v2[0], v2[1], angles='xy', scale_units='xy', scale=1,
color='red', linewidth=2, label='$\\mathbf{v}_2 = (3, 1)$')
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)
ax.axhline(y=0, color='k', linewidth=0.5)
ax.axvline(x=0, color='k', linewidth=0.5)
ax.set_title('Linearly Independent (spans $\\mathbb{R}^2$)')
ax.legend(fontsize=9)
# --- 線形従属の例 ---
ax = axes[1]
v1 = np.array([1, 2])
v2 = np.array([2, 4]) # v2 = 2 * v1
# 線形結合は直線上のみ
t = np.linspace(-3, 3, 100)
line_x = t * v1[0]
line_y = t * v1[1]
ax.plot(line_x, line_y, 'lightblue', linewidth=8, alpha=0.5, label='Span (line)')
ax.quiver(0, 0, v1[0], v1[1], angles='xy', scale_units='xy', scale=1,
color='blue', linewidth=2, label='$\\mathbf{v}_1 = (1, 2)$')
ax.quiver(0, 0, v2[0], v2[1], angles='xy', scale_units='xy', scale=1,
color='red', linewidth=2, label='$\\mathbf{v}_2 = (2, 4) = 2\\mathbf{v}_1$')
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)
ax.axhline(y=0, color='k', linewidth=0.5)
ax.axvline(x=0, color='k', linewidth=0.5)
ax.set_title('Linearly Dependent (spans a line)')
ax.legend(fontsize=9)
plt.tight_layout()
plt.savefig("linear_independence_2d.png", dpi=150, bbox_inches='tight')
plt.show()
3次元での可視化
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(14, 6))
# --- 線形独立(3本が空間全体を張る)---
ax1 = fig.add_subplot(121, projection='3d')
vectors_indep = [
np.array([1, 0, 0]),
np.array([0, 1, 0]),
np.array([0, 0, 1])
]
colors = ['blue', 'red', 'green']
labels = ['$\\mathbf{v}_1$', '$\\mathbf{v}_2$', '$\\mathbf{v}_3$']
for v, c, l in zip(vectors_indep, colors, labels):
ax1.quiver(0, 0, 0, v[0], v[1], v[2], color=c, linewidth=2,
arrow_length_ratio=0.1, label=l)
ax1.set_xlim([-1.5, 1.5])
ax1.set_ylim([-1.5, 1.5])
ax1.set_zlim([-1.5, 1.5])
ax1.set_xlabel('$x$')
ax1.set_ylabel('$y$')
ax1.set_zlabel('$z$')
ax1.set_title('Linearly Independent\n(span $\\mathbb{R}^3$)')
ax1.legend(fontsize=9)
# --- 線形従属(3本が同一平面上)---
ax2 = fig.add_subplot(122, projection='3d')
v1 = np.array([1, 0, 1])
v2 = np.array([0, 1, 1])
v3 = np.array([1, 1, 2]) # v3 = v1 + v2
vectors_dep = [v1, v2, v3]
labels_dep = ['$\\mathbf{v}_1 = (1,0,1)$', '$\\mathbf{v}_2 = (0,1,1)$',
'$\\mathbf{v}_3 = (1,1,2) = \\mathbf{v}_1 + \\mathbf{v}_2$']
for v, c, l in zip(vectors_dep, colors, labels_dep):
ax2.quiver(0, 0, 0, v[0], v[1], v[2], color=c, linewidth=2,
arrow_length_ratio=0.1, label=l)
# 3本が張る平面を表示
s = np.linspace(-1, 1, 10)
t = np.linspace(-1, 1, 10)
S, T = np.meshgrid(s, t)
X = S * v1[0] + T * v2[0]
Y = S * v1[1] + T * v2[1]
Z = S * v1[2] + T * v2[2]
ax2.plot_surface(X, Y, Z, alpha=0.2, color='yellow')
ax2.set_xlim([-1.5, 1.5])
ax2.set_ylim([-1.5, 1.5])
ax2.set_zlim([-1.5, 2.5])
ax2.set_xlabel('$x$')
ax2.set_ylabel('$y$')
ax2.set_zlabel('$z$')
ax2.set_title('Linearly Dependent\n(span a plane)')
ax2.legend(fontsize=8, loc='upper left')
plt.tight_layout()
plt.savefig("linear_independence_3d.png", dpi=150, bbox_inches='tight')
plt.show()
まとめ
本記事では、線形独立と線形従属の定義と意味について解説しました。
- 線形独立 とは、零ベクトルを作る線形結合が自明な(すべて $0$ の)ものしかないことである
- 線形従属 とは、少なくとも1つのベクトルが他のベクトルの線形結合で表せることと同値である
- 幾何学的には、線形独立なベクトルは「異なる方向に広がる」ベクトルである
- 判定には行列式やランクが利用できる: $\det(\bm{A}) \neq 0$ または $\mathrm{rank}(\bm{A}) = k$
- ベクトル数 $k$ が空間の次元 $n$ を超えると、必ず線形従属になる
次のステップとして、以下の記事も参考にしてください。