論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
LLE
Locally Linear Embedding
次元削減

🔖 キーワード索引

#多様体学習#次元削減#manifold#可視化#Roweis-Saul#PCA代替#manifold#非線形次元削減#Roweis#Saul#scikit-learn#k近傍#固有値分解#局所線形

LLE (Locally Linear Embedding)」は各点を近傍点の線形結合で復元し、 その重みを保存したまま低次元埋め込みを構成する非線形次元削減 (Roweis & Saul, 2000)。 本ページの中核キーワードを以下に整理する。

LLERoweis-Saul (2000)k 近傍 (n_neighbors)局所線形重み W復元誤差 Σ‖x-Σw·x_j‖²スパース固有値問題スイスロール展開Isomap / t-SNE / UMAP との対比多様体仮説SSDSE-B-2026 47 都道府県

これらのキーワードは「lle の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

曲がったデータを平らに伸ばす道具です。

データの形を保ったまま次元を減らします。

スマホの地図を広げるイメージに似ています。

仕組みと弱点について解説します。

LLE:局所線形性を保つ非線形次元削減

∑ 数学的導出: LLE の数式の出どころ

本ページの「📐 定義・数式」セクションでは結果だけを示しましたが、 ここではより詳細に導出を追います。 数式の出どころが分かると、 公式を暗記するのではなく、 必要に応じて再導出できるようになります。

LLE の数学を再構成最適化問題から固有値問題への帰着まで丁寧に追います。 各点 $\mathbf{x}_i$ の k 近傍 $\mathcal{N}(i)$ に対する再構成重み $\mathbf{w}_i = (w_{i,j_1}, \dots, w_{i,j_k})^\top$ を求める問題: $\min \| \mathbf{x}_i - \sum_{j \in \mathcal{N}(i)} w_{ij} \mathbf{x}_j \|^2$ s.t. $\sum_j w_{ij} = 1$。 これを $\mathbf{x}_i = \sum_j w_{ij} \mathbf{x}_i$ (制約より) と書き直すと、 $\| \sum_j w_{ij} (\mathbf{x}_i - \mathbf{x}_j) \|^2 = \mathbf{w}_i^\top C_i \mathbf{w}_i$、 ここで $C_i^{(jk)} = (\mathbf{x}_i - \mathbf{x}_j)^\top (\mathbf{x}_i - \mathbf{x}_k)$ は局所共分散行列。 制約付き二次計画の解は Lagrange 乗数法により $\mathbf{w}_i = C_i^{-1} \mathbf{1} / (\mathbf{1}^\top C_i^{-1} \mathbf{1})$。 数値的安定性のため Tikhonov 正則化 $C_i \to C_i + \delta I$ ($\delta = \epsilon \cdot \text{tr}(C_i) / k$ が典型) を適用。 続いて重み $W$ を固定し、 低次元埋め込み $Y \in \mathbb{R}^{N \times d}$ について $\Phi(Y) = \sum_i \| \mathbf{y}_i - \sum_j W_{ij} \mathbf{y}_j \|^2 = \text{tr}(Y^\top (I-W)^\top (I-W) Y)$ を $Y^\top Y / N = I$, $\mathbf{1}^\top Y = 0$ で最小化。 これは行列 $M = (I-W)^\top (I-W)$ の固有値問題に帰着し、 最小の自明固有値 (0、 固有ベクトル $\mathbf{1}/\sqrt{N}$) を除いた次の $d$ 個の固有ベクトルが埋め込み行列 $Y$ の列を構成します。 計算量は $O(D N k^3)$ (重み計算) + $O(d N^2)$ (固有値分解、 ARPACK 等のスパース法を使えば $O(d N k)$ まで削減可能)。

📍 文脈ボックス

🍰 まずはやさしく

データの次元を減らす手法のひとつです。

似たもの同士を近くに集めるために使います。

都道府県のデータを分析して可視化します。

他の手法との違いについて説明します。

この用語は 次元削減 カテゴリに属します。 関連する別称・略号:(なし)

論文・実務レポートで LLE が登場したら、 まず本ページの「30秒で分かる結論」と「直感で掴む」を読めば、 その文脈で何を言っているか把握できます。

本ページでは LLE (Locally Linear Embedding、 局所線形埋め込み) を扱う。 多様体学習の代表的手法で、 高次元データの「ご近所同士の重み付き関係」を保ったまま低次元に埋め込む。 SSDSE-B-2026 の都道府県多指標データを 2D に圧縮し、 産業構造の似た県が近くに集まる可視化を行う。

LLE は t-SNE / UMAP / Isomap と並ぶ非線形次元削減で、 局所構造のみを保存する点が特徴。 グローバルな距離関係は失われやすいが、 多様体上の局所的な位置関係は高精度に再現する。 近傍数 k の選び方が結果に大きく影響する。

🎨 直感で掴む

🍰 まずはやさしく

巻いた紙を丁寧に広げるような方法です。

近くの点との関係性を守るために使います。

部活のメンバー同士の距離感に似ています。

計算が進む4つのステップを解説します。

スイスロール (くるくる巻いた紙) のような 3D データを 2D に「展開」したい。 PCA だと巻いたまま潰してしまうが、 LLE は「近くの点同士の関係」を保ちながら開く。 局所線形性 ── 「ご近所はだいたい平面」── という仮定で、 グローバル構造を再構成。

LLE (Locally Linear Embedding) のキモは「全体は曲がっていても、 ご近所だけ見れば平面」という仮定だ。 各点について k 個の近傍を選び、 「それらの重み付き和で元の点を再現する」係数 w_ij を求め、 同じ重みで低次元空間に埋め込み直す。 巻物のような曲面が「ぐにゃっと平らに開く」イメージ。

本ページでは入力 (高次元データ) → 近傍探索 (k-NN) → 局所重みの最適化 → 全体埋め込み (固有値問題) の 4 段階で処理を追う。 この枠組みで t-SNE / UMAP / Isomap と比較すれば、 LLE が「局所構造のみ重視」「グローバル距離は捨てる」という特性が見えてくる。

具体例として SSDSE-B-2026 の都道府県データに LLE を適用し、 産業構造の似た県が 2D 上で近くに集まる埋め込みを得る流れを次節以降で示す。

🎮 触って理解する

LLE の第 1 段階「局所線形再構成の重み $w$」を、 合成デモ(2D 渦巻き曲線上の 26 点、 実データではありません)で体感します。 姉妹ページ Isomap(測地線距離)や 多様体学習(内在次元)が「距離」に注目したのに対し、 ここでは LLE 固有の視点 ──「各点は近傍の重み付き平均で書ける」── だけに集中します。

① 点を選んで、 近傍の線形結合で再構成してみる

曲線上の点をクリック(タップ)して選択すると、 その k 近傍がハイライトされ、 制約 $\sum_j w_{ij}=1$ 付きの最小二乗で求めた重み $w$ による再構成点(赤の ×)が表示されます。 選択点と × のズレが「局所線形近似の誤差」。 k を動かすと、 局所的には曲線もほぼ直線なので誤差が小さいこと、 k を広げすぎると曲率を拾って挙動が変わることが分かります。 正則化 $\delta$($C_i + \delta\,\mathrm{tr}(C_i)/k \cdot I$)を極端に小さくすると、 k > 元次元 (=2) で劣決定になり重みが増大していく傾向も観察できます(この 2D 渦巻きデモでは制約 $\sum_j w_{ij}=1$ の正規化が効くため max|w| は 3 程度までで、 極端な発散までは起きません)。

点をクリック / タップで選択

② 重みバー ── どの近傍がどれだけ寄与するか

中央の縦線が 0。 右(緑)が正の重み、 左(橙)が負の重みです。 制約は $\sum w = 1$ だけなので、 個々の重みは負にもなり得ます(「隣 A に行き過ぎた分を隣 B 側へ引き戻す」外挿的な役割)。 選択点が近傍の凸包の外にあるとき、 特に曲線の端点で負の重みが出やすいことを確かめてください。

③ 展開結果 ── 重みを保存して 1 次元へ(固有値問題は事前計算)

第 2 段階($M=(I-W)^\top(I-W)$ の固有値問題)はブラウザでは重いので、 上と同一の 26 点・k=4・δ=1e-3 について node.js で事前計算した結果を転記して表示します。 最小固有値は 0(自明解)、 2 番目に小さい固有ベクトルが下の 1D 座標です。 色は上の曲線と対応:渦巻きの並び順が 1 直線上で完全に保存(順序の逆転 0 件)されており、 「距離ではなく近傍の重みを保っただけで、 曲がった多様体がほどける」ことが確認できます。

④ Isomap との違い ── 「距離の保存」ではなく「重みの保存」

Isomap: 測地線「距離」を保存 直線距離は使わない 曲線に沿った距離 d を測り、低次元でも d を再現 大域的な「遠い・近い」を数値で保つ LLE: 近傍の「重み w」を保存 w₁ w₂ w₃ 低次元でも同じ w₁, w₂, w₃ で再構成できる配置を探す 距離の数値は保存しない (縮尺・回転は自由)

Isomap は「点 i と点 j はグラフ上で距離いくつ」という大域的な距離行列を作ってから MDS で埋め込みますが、 LLE は距離の数値を一切保存せず、 「点 i は近傍たちの この混合比 で書ける」という局所的な関係(重み)だけを低次元へ持ち込みます。 重みは回転・並進・スケールに不変なので、 埋め込みは形を保ったまま自由に置ける ── その分、 大域的な縮尺の情報は失われます(t-SNE が確率的類似度、 UMAP がファジー近傍グラフを保存するのとも対照的)。

🔍 デモから読み取る落とし穴と発展

k の選択: 上のデモで k=2 だと再構成は「2 点を通る直線への射影」になり誤差が出やすく、 k=8 だと曲線の反対側まで近傍に入り局所性が崩れ始めます。 「局所線形」が成り立つ範囲に k を収めるのが原則で、 これは 多様体学習全般に共通する近傍サイズ問題です。 正則化 δ: 元次元 D=2 に対し k>2 では局所グラム行列 $C_i$ がランク落ちし、 δ を 1e-8 まで下げると重みが増大する方向に働きます(ただし上のデモの 2D 渦巻きでは制約 $\sum_j w_{ij}=1$ による正規化が発散を打ち消すため、 max|w| はおおむね 3 程度までにとどまり、ウィジェットの不安定警告(>5)は発火しません)。 一方、 高次元・高相関でグラム行列がより強く縮退する実データでは、 同じ操作で重みがはるかに大きく暴れて第 2 段階の固有値問題も不安定化しうるため、 scikit-learn の reg(既定 1e-3)を不用意に下げないこと。 密度の不均一: k-NN は「個数」で近傍を切るため、 点が密な領域では物理的に狭い範囲、 疎な領域では広い範囲を「局所」と見なしてしまい、 密度差の激しいデータでは展開が歪みます(事前の標準化や部分サンプリングで緩和)。 穴あき・非凸な多様体: ドーナツ状に穴の空いたデータでは、 穴の縁で近傍が「対岸」を拾って重みグラフが短絡し、 埋め込みが折り畳まれることがあります。 発展: これらの弱点に対し、 局所ヘシアンで等長性を強める Hessian LLE、 重み計算を複数ベクトルで安定化する Modified LLE(いずれも scikit-learn の method='hessian' / 'modified')、 局所接空間を張り合わせる LTSA が提案されています。 線形で足りるかまず PCA(や Kernel PCA)で確認してから LLE 系へ進むのが実務の定石です。

📐 定義・数式

🍰 まずはやさしく

数式で表したデータの配置ルールです。

最適な位置を決めるために使います。

買い物リストの項目を整理する感覚です。

重みを使った計算式について説明します。

【LLE の最適化】
$$ \min_{\mathbf{Y}} \sum_i \left\| \mathbf{y}_i - \sum_{j\in N(i)} w_{ij} \mathbf{y}_j \right\|^2 $$

高次元での近傍再構成重み $w_{ij}$ を計算したのち、 低次元 $\mathbf{y}_i$ でも同じ重みで再構成できるように埋め込みを最適化する。

🔬 数式を言葉で読み解く

数式に出てくる記号の意味を 1 つずつ確認しましょう。

$N(i)$
$i$ 番目データの k 近傍集合。
$w_{ij}$
近傍点 $j$ で $i$ を再構成する線形重み。
$\mathbf{y}_i$
低次元埋め込み座標。
$k$
近傍数 (ハイパーパラメータ)。

🧮 実値で計算してみる

scikit-learn の LocallyLinearEmbedding を都道府県データで使う例。

STEP 1 高次元特徴量準備
47 都道府県の複数列を取得。
STEP 2 標準化
各列を平均 0 分散 1 に。
STEP 3 LLE 適用
n_neighbors=8, n_components=2 で 2D へ。
STEP 4 可視化
2D 散布図で構造確認。

🧮 数式に値を入れて手で計算する: 局所線形再構成重み

合成 1D データで点 x を近傍 2 点の凸結合で表現する重みを計算する。

Step 1: データ

x = 3 を近傍 x_1=1, x_2=5 で再構成 重み w_1, w_2, w_1 + w_2 = 1

Step 2: 解

3 = w_1·1 + w_2·5 w_1 + w_2 = 1 連立解: w_1 = 0.5, w_2 = 0.5 再構成: 0.5·1 + 0.5·5 = 3 ✓

🐍 Python で再現

1
2
3
4
5
6
import numpy as np
A = np.array([[1, 5], [1, 1]])
b = np.array([3, 1])
w = np.linalg.solve(A, b)
print(f"重み: {w}")
print(f"再構成: {w[0]*1 + w[1]*5}")

📤 実行結果

重み: [0.5 0.5] 再構成: 3.0

💬 手計算 (Step 2) [0.5, 0.5] と Python 出力が完全一致。

🐍 Python 実装

最小実装の例。 SSDSE のような実データに対して、 まずはコピペで動かしてみるのが理解の早道です。

📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
1
2
3
4
5
6
7
from sklearn.manifold import LocallyLinearEmbedding
from sklearn.preprocessing import StandardScaler
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
X = StandardScaler().fit_transform(df.select_dtypes('number'))
Y = LocallyLinearEmbedding(n_neighbors=8, n_components=2).fit_transform(X)
print(Y[:5])
📤 実行例(実測) [[ 9.53970570e-16 -3.22297695e-16] [ 9.53457150e-16 -3.15484918e-16] [ 9.60966740e-16 -3.33849170e-16] [ 9.60301187e-16 -3.27874461e-16] [ 9.62206877e-16 -3.17435874e-16]]

🐍 詳細実装例 (SSDSE-B-2026 適用版)

本ページ冒頭の Python 実装はミニマル版でした。 ここでは LLE を SSDSE-B-2026 の実データに適用する完全な実装例を掲載します。 コピペすればそのまま動く形になっています。 ファイルパスは data/raw/SSDSE-B-2026.csv を想定。

📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import os
os.makedirs('output', exist_ok=True)  # 保存先のフォルダを作っておく

# === scikit-learn で LLE を SSDSE-B-2026 に適用 ===
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.manifold import LocallyLinearEmbedding
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# データ読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
prefs = df['Prefecture'].values
X = df.select_dtypes(include='number').dropna(axis=1).values

# 標準化
X_scaled = StandardScaler().fit_transform(X)

# LLE (k=8, 2 次元)
lle = LocallyLinearEmbedding(n_neighbors=8, n_components=2, reg=1e-3, random_state=42)
Y_lle = lle.fit_transform(X_scaled)
print(f'LLE reconstruction error: {lle.reconstruction_error_:.6f}')

# PCA と比較
Y_pca = PCA(n_components=2).fit_transform(X_scaled)

# 並べて可視化
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
axes[0].scatter(Y_lle[:, 0], Y_lle[:, 1], c='C0', s=80)
for i, p in enumerate(prefs):
    axes[0].annotate(p, (Y_lle[i, 0], Y_lle[i, 1]), fontsize=8)
axes[0].set_title('LLE (k=8)')

axes[1].scatter(Y_pca[:, 0], Y_pca[:, 1], c='C1', s=80)
for i, p in enumerate(prefs):
    axes[1].annotate(p, (Y_pca[i, 0], Y_pca[i, 1]), fontsize=8)
axes[1].set_title('PCA')

plt.tight_layout()
plt.savefig('output/lle_vs_pca_ssdse.png', dpi=150)

# 近傍数 k の感度解析
ks = [3, 5, 8, 12, 16, 20]
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
for ax, k in zip(axes.flatten(), ks):
    Y_k = LocallyLinearEmbedding(n_neighbors=k, n_components=2, reg=1e-3).fit_transform(X_scaled)
    ax.scatter(Y_k[:, 0], Y_k[:, 1], s=50)
    ax.set_title(f'k = {k}')
plt.tight_layout()
plt.savefig('output/lle_k_sensitivity.png', dpi=150)
📤 実行例(実測) LLE reconstruction error: -0.000000

⚠️ 実行前に pip install -r requirements.txt で依存パッケージをインストール。 また、 SSDSE-B-2026 の列名は版によって若干異なるので、 df.columns で確認のうえ実コードに合わせて読み替えてください。

⚠️ よくある落とし穴

この用語を使うときに陥りがちな失敗パターン。 経験者ほどここに 1 度はハマっています。

❌ 1. k (近傍数)の選択を間違える
小さすぎる k (例:3)だとグラフが断片化し、 「離島」のような孤立クラスタが大量発生して埋め込みが歪む。 大きすぎる k (例:n の半分)だと曲面の局所性が消え、 ほぼ PCA と同じ結果になり LLE の意味が失われる。 SSDSE-B-2026 (n=47) なら k = 5〜12 が現実的。 trustworthiness 指標や下流タスクの精度で CV するのが定石。
❌ 2. 外れ値・ノイズへの脆弱性
k-NN グラフで決まる局所重みは外れ値の影響を直接受け、 1 点ノイズが入っただけで近傍重みの線形方程式が不安定化、 2D 配置全体が回転・反転することも。 robust 版 (RLLE) や、 前処理での外れ値除外、 modified LLE (MLLE) などで対策。
❌ 3. 新規データへの非外挿 (Out-of-Sample 問題)
LLE は学習データに対する固有値分解で埋め込みを得るので、 「新しい点をその空間に投影する明示的な写像」が存在しない。 新規予測には Nyström 近似や Parametric LLE が必要。 本番運用では PCA+kernel PCA / Autoencoder の方が再現性が高いことも。
❌ 4. グローバル構造の歪み
局所重視の設計のため、 大域的な距離(クラスタ間の遠近)は保証されない。 SSDSE で「東京と沖縄」が偶然 2D 上で近くに来ても、 元空間で似ているとは限らない。 大域構造も保ちたいなら Isomap (測地距離) や UMAP (大域 + 局所) を併用検討。
❌ 5. 標準化忘れ
k-NN ベースなので距離計算前にスケーリング必須。 単位の異なる「人口(万単位)」「高齢化率(0-1)」を混在させると人口だけで近傍が決まる。 StandardScaler → LLE の順で適用する。
❌ 近傍数 k の感度
k を変えるだけで埋め込み形状が劇的に変わります。複数の k で結果を比較し、安定する範囲を探してください。SSDSE n=47 では k=5〜10 程度が目安。
❌ グローバル構造の欠如
LLE は局所構造のみを保存するため、遠く離れたクラスター間の相対距離は保証されません。PCA や UMAP との比較が有益。
❌ 正則化の必要
近傍点数 k > 元次元のとき、再構成重みの最小二乗が劣決定となり数値的に不安定。`reg=1e-3` 程度の正則化を入れてください。
❌ 外れ値感受性
孤立した外れ値は近傍が遠くなり、埋め込みで歪みを生みます。事前に外れ値検出 (IsolationForest 等) を行うのが安全。

🗺 拡張概念マップ:LLE (局所線形埋め込み) の周辺地図

LLE (局所線形埋め込み)次元削減 の系譜に位置づけられます。 ここでは前提概念・並列概念・発展概念を、 ツリーマップ的に整理します。 用語を 1 つ覚えても、 その上下・左右の文脈を知らないと使いどころが分かりません。 概念マップを 地図 として手元に置いておくと、 論文を読みながら「ああ、 この用語は私が知っているあの用語の親戚だ」と即座に位置づけられます。

前提となる概念 (上位 / 必須前知識)

並列にある概念 (同レベル / 比較対象)

次元削減 内には、 LLE (局所線形埋め込み) と目的が似た複数の手法が存在します。 状況によって使い分けが必要になるので、 違いを意識しながら学んでください。 本ページ「🌐 関連手法・派生」セクションのリンクから 1 つずつ確認すると、 自分の中の「使い分けマップ」が作れます。

発展した概念 (下位 / 次の学習目標)

LLE (局所線形埋め込み) を一通り理解した後、 自然に学びたくなる発展トピックは「派生手法」「実応用」「理論的拡張」の 3 方向です。 派生手法は同じカテゴリ内の上位互換、 実応用は実務での使い方、 理論的拡張は数学的厳密性 (収束性・最適性) の追究です。 自分の興味に応じて、 どの方向に伸ばすかを意識的に選んでください。

論文での出会い方

本サイトの再現論文集には LLE (局所線形埋め込み) を活用した研究が複数収録されています。 トップページから検索・絞り込みで該当論文を見つけ、 「30 秒で分かる結論」「結果」セクションを優先的に読むと、 LLE (局所線形埋め込み) がどう実問題に応用されているかが具体的に把握できます。 抽象的な定義より、 具体的応用 3 件 を見るほうが理解の速度は 5 倍速くなります。

🔭 上級トピック: LLE の数理:再構成重みから固有値問題への帰着

LLE の数学的核心は、 「局所的な線形構造を保ったまま低次元に埋め込む」という幾何的要請を、 2 段階の最適化問題として定式化することにあります。 ステップ 1 では各点 $\mathbf{x}_i$ の k 近傍を $\mathcal{N}(i)$ とし、 再構成誤差 $\epsilon(W) = \sum_i \| \mathbf{x}_i - \sum_{j \in \mathcal{N}(i)} W_{ij} \mathbf{x}_j \|^2$ を $\sum_j W_{ij}=1$ かつ $W_{ij}=0\ (j \notin \mathcal{N}(i))$ の制約下で最小化します。 この問題は局所共分散行列 $C_i^{jk} = (\mathbf{x}_i - \mathbf{x}_j)^\top (\mathbf{x}_i - \mathbf{x}_k)$ を用いて、 各点ごとに $\mathbf{w}_i = C_i^{-1} \mathbf{1} / (\mathbf{1}^\top C_i^{-1} \mathbf{1})$ という閉形式解が得られます。 ステップ 2 では重み $W$ を固定し、 低次元埋め込み $\mathbf{y}_i$ について同じ再構成誤差 $\Phi(Y) = \sum_i \| \mathbf{y}_i - \sum_j W_{ij} \mathbf{y}_j \|^2$ を最小化します。 これは行列 $M = (I-W)^\top (I-W)$ の二次形式 $\text{tr}(Y^\top M Y)$ を、 $Y^\top Y / N = I$ かつ $\sum_i \mathbf{y}_i = 0$ の制約下で最小化する問題に等価で、 $M$ の最小の自明固有値 (0、 固有ベクトル $\mathbf{1}$ ) を除いた次の $d$ 個の固有ベクトルが埋め込み座標になります。 PCA が大域的共分散行列の主固有ベクトルを使うのに対し、 LLE はスパースな局所連結行列の最小固有ベクトルを使う点が双対的で美しい構造を持ちます。 数値的注意点として、 k が元次元を超えると局所共分散行列が劣決定となり、 Tikhonov 正則化 $C_i + \epsilon I$ が必須となります。 scikit-learn の LocallyLinearEmbedding では reg パラメータでこれを制御できます。

LLE LLE scikit-learn umap-learn openTSNE PHATE diffusion-maps

🔗 隣接手法への橋渡し

LLE は局所線形性を保存する次元削減であり、 前段の k 近傍探索の設計と後段の可視化・分類器入力との接続で多様体構造の理解が深まる。

上流の k-NN グラフ構築が局所線形近似の品質を決め、 並列の Isomap (測地線距離) / t-SNE と比較して「局所 vs 大域構造」のどちらを保存したいかを判断し、 下流の埋め込み座標を散布図化して隣接関係の保存度を視覚評価する流れで多様体学習の選択が固まる。

🌳 意思決定ツリー: LLE を選ぶか

LLE を使うべきか」を判断するためのフローチャート。 上から順番に Yes/No で答えていけば、 自分の問題に最適な手法選定にたどり着きます。

  1. 1. データはどれくらい高次元か? 元次元 d が 100 以下 → PCA で十分なことも / 100-10,000 → LLE/UMAP/t-SNE 適 / 10,000+ → PCA 前処理 + UMAP の 2 段。
  2. 2. サンプル数 N は? N < 100 → LLE 不安定、 PCA 推奨 / N が 100-10,000 → LLE OK / N が 10万+ → UMAP 推奨 (LLE は計算量大)。
  3. 3. 大域構造を保ちたいか? Yes → PCA or Isomap or UMAP (n_neighbors 大) / No (局所のみ) → LLE。
  4. 4. クラスタリングの可視化が目的? t-SNE or UMAP 推奨 (LLE はクラスタ可視化に弱い)。
  5. 5. 線形/非線形どちらか不明? まず PCA → 寄与率が低い (例: 上位 2 軸で 50% 未満) なら非線形必要 → LLE/UMAP。
  6. 6. 結果の再現性は? LLE は決定論的 (乱数依存なし) なので再現性高い / t-SNE/UMAP は乱数初期化依存。

🧭 直感をさらに深める — 「距離」ではなく「レシピ」を運ぶ

LLE の一番の勘所を一言でいうと、 各点を「近傍たちの配合レシピ」で書き直し、 そのレシピだけを低次元へ持ち込むことです。 点 $\mathbf{x}_i$ を近傍 $\{\mathbf{x}_j\}$ の線形結合 $\sum_j w_{ij}\mathbf{x}_j$ で最も良く再現する重み $w_{ij}$(配合比)を求め、 低次元でも同じ配合比で $\mathbf{y}_i \approx \sum_j w_{ij}\mathbf{y}_j$ が成り立つ配置 $Y$ を探す。 「ご近所だけ見れば世界はほぼ平ら(局所線形)」という多様体仮説のもとで、 局所の平面片をパッチワークのように貼り合わせると、 大域的には曲がった多様体が平面へと展開されます。 多様体学習の一般論をこのページの具体で体感するのが本節の狙いです。

局所は線形・大域は非線形という二層構造が、 PCA との決定的な違いです。 PCA は全データを 1 枚の平面に射影するため、 スイスロール(架空・合成のデモ多様体)のように巻いた面は「巻いたまま潰れて」重なってしまう。 LLE は面を小さなパッチに割り、 各パッチ内でのみ線形近似を効かせるので、 巻きをほどいて広げられます。 「線形の道具を、 局所という狭い舞台でだけ使う」── これが非線形を線形の積み重ねで扱う LLE の思想です。

Isomap との発想の違いも、 この「レシピ vs 距離」で整理できます(本ページ「🎮 触って理解する」④の図が対応)。 Isomap は「点 i と点 j は多様体に沿って距離いくつか」という大域的な測地距離行列を近傍グラフの最短経路で推定し、 MDS でその距離をできるだけ保つ配置を求めます ── 数値としての距離を運ぶ方式です。 対して LLE は距離の数値を一切保存せず、 「点 i は近傍のこの配合比で書ける」という局所的な関係だけを運ぶ。 重みは回転・並進・スケールに不変なので、 埋め込みは形を保ったまま自由に置ける代わりに、 大域的な縮尺の情報は捨てられます。 t-SNE が確率的な近傍類似度を、 UMAP がファジー近傍グラフを保存するのとも対照的で、 「何を不変量として運ぶか」で各手法の個性が決まります。

⚠️ 落とし穴を深掘り — k・正則化・サンプリング・スケール不定性

本ページ「⚠️ よくある落とし穴」を、 なぜそうなるのかという機序まで踏み込んで補足します。 いずれも「局所線形の仮定が壊れる/方程式が悪条件になる」ことに帰着します。

🔍 1. 近傍数 k の二律背反(小さすぎ=分断/大きすぎ=線形性崩壊)
k が小さすぎると近傍グラフが連結でなくなり、 多様体がいくつかの島に分断されて第 2 段階の固有値問題が退化します(複数の連結成分ぶんだけ固有値 0 が現れ、 埋め込みが意味をなさなくなる)。 逆に k が大きすぎると、 曲率のある領域で「多様体の反対側の点」まで近傍に取り込み、 「ご近所は平ら」という前提そのものが崩れて、 結果はほぼ PCA に漸近します。 原則は「局所線形近似が成り立つ最大の範囲に k を収める」こと。 これは 多様体学習全般に共通する近傍サイズ問題で、 唯一の正解はなく、 複数の k で埋め込みの安定性を見るしかありません。
🔍 2. 正則化項はなぜ必須か(近傍数 > 次元で重み行列が特異)
第 1 段階の重みは局所グラム行列 $C_i^{(jk)} = (\mathbf{x}_i-\mathbf{x}_j)^\top(\mathbf{x}_i-\mathbf{x}_k)$ を用いて $\mathbf{w}_i = C_i^{-1}\mathbf{1}/(\mathbf{1}^\top C_i^{-1}\mathbf{1})$ で解きます。 ところが近傍数 $k$ が元の次元 $D$ を超えると、 $k$ 個の近傍差ベクトル $\mathbf{x}_i-\mathbf{x}_j$ が張る空間はたかだか $D$ 次元なので、 $C_i$ はランク落ち(特異)して $C_i^{-1}$ が定義できません。 そこで Tikhonov 正則化 $C_i \to C_i + \delta\,\mathrm{tr}(C_i)/k \cdot I$ を加えて可逆化します(正則化の一種)。 $\delta$ を小さくしすぎると重みが暴れ、 大きくしすぎると全近傍が均等重みに寄って局所情報が失われる。 scikit-learn の reg(既定 1e-3)を不用意に下げないのが安全策です。 なお、 本ページのウィジェットは 2D 渦巻きのため制約 $\sum_j w_{ij}=1$ の正規化が発散を打ち消しますが、 高次元・高相関の実データではこの縮退がはるかに強く効きます。
🔍 3. 疎・不均一サンプリングでの破綻
k-NN は「距離」ではなく「個数」で近傍を切るため、 サンプルが密な領域では物理的に狭い範囲を、 疎な領域では広い範囲を「局所」とみなします。 密度差が激しいデータでは、 疎な側で近傍が曲率をまたいで広がり、 局所線形の仮定が壊れて展開が歪みます。 また全体のサンプルが少なすぎると(経験則で $N \gtrsim 5k$ を割ると)そもそも局所平面を推定するだけの点が足りません。 事前の標準化でスケールを揃え、 密度の偏りが大きい場合は部分サンプリングや適応的近傍(距離しきい値)で緩和します。 SSDSE-B-2026(47 都道府県)のように東京都・大阪府が外れ値的に飛ぶデータでは、 まさにこの密度不均一が起きやすい点に注意します。
🔍 4. 埋め込みのスケール・回転不定性
第 2 段階は $Y^\top Y/N = I$(直交・単位分散)と $\mathbf{1}^\top Y = 0$(中心化)の制約下で $\mathrm{tr}(Y^\top M Y)$ を最小化します。 この制約は分散スケールを $1$ に固定しますが、 軸の符号・軸間の回転・全体の鏡映は決まりません(固有ベクトルは符号任意、 縮退固有値があれば固有空間内で回転自由)。 したがって「x 軸の向き」「時計回りか反時計回りか」といった見かけは実行ごと・実装ごとに変わり得ます。 重みが回転・並進・スケール不変であることの裏返しで、 大域的な縮尺や絶対的な向きに意味を読み込んではいけません。 比較すべきは軸の値そのものではなく、 点同士の近接関係・順序です(本ページ③の 1D 展開が「順序保存」を強調しているのはこのため)。

🚀 発展 — 改良手法・目的関数の比較・固有値問題としての定式化

標準 LLE の弱点(数値不安定・等長性の欠如・孤立クラスタへの脆さ)を補う改良系と、 近縁手法との目的関数の違い、 そして計算の背骨である固有値問題を整理します。

改良手法ファミリー

🚀 Hessian LLE (HLLE)
局所接空間上のヘシアン(2 階微分)を推定し、 その二次形式を最小化することで「局所的に等長(曲げても伸縮しない)」な埋め込みを狙います(Donoho & Grimes, 2003)。 非凸で穴のある多様体に強い一方、 近傍推定により多くの点を要します。 scikit-learn では method='hessian'
🚀 Modified LLE (MLLE)
重み行列 $C_i$ がランク落ちして重み解が一意でない問題に対し、 複数の重みベクトル(ヌル空間の基底)を同時に使って再構成を安定化します(Zhang & Wang, 2006)。 標準 LLE の「正則化 $\delta$ 依存」を大きく緩和。 scikit-learn では method='modified'
🚀 LTSA (Local Tangent Space Alignment)
各点の近傍で局所接空間を PCA 的に推定し、 それらを大域的に「貼り合わせ(アライン)」て埋め込みを構成します(Zhang & Zha, 2004)。 LLE を「再構成重み」ではなく「接空間の整合」として再定式化した親戚です。 scikit-learn では method='ltsa'

目的関数の比較(何を保存するか)

手法 保存する量(目的関数の骨子) 大域構造 解き方
PCA 分散最大の線形部分空間 $\max \mathrm{tr}(W^\top \Sigma W)$ 保持(線形のみ) 共分散の最大固有ベクトル
LLE 局所再構成重み $\sum_i\|\mathbf{y}_i-\sum_j w_{ij}\mathbf{y}_j\|^2$ 捨てる(局所のみ) $M=(I-W)^\top(I-W)$ の最小固有ベクトル
Isomap 測地距離(グラフ最短経路)を保つ $\min\sum(d^{geo}_{ij}-\|\mathbf{y}_i-\mathbf{y}_j\|)^2$ 保持(距離ベース) 中心化距離行列の固有分解(MDS)
t-SNE 近傍の確率分布を KL 距離で一致 $\min \mathrm{KL}(P\,\|\,Q)$ 弱い(局所クラスタ重視) 勾配降下(非凸・乱数依存)
UMAP ファジー近傍グラフの交差エントロピー 中〜強(局所+一部大域) 確率的勾配降下

要点:LLE・Isomap は閉形式の固有値問題に帰着し決定論的(次元削減のスペクトル系)、 t-SNE・UMAP は反復最適化で乱数初期化に依存します。 「距離を保つ(Isomap)」「重みを保つ(LLE)」「確率的類似度を保つ(t-SNE/UMAP)」という保存対象の違いが、 そのまま各手法の得手不得手になります。 Kernel PCA はカーネル行列の固有分解という点で LLE と同じスペクトル系に属し、 近傍構造を陽に組めば LLE を含む多くの手法をカーネル PCA の特殊例として見ることもできます。

固有値問題としての定式化(骨子の再掲)

第 1 段階で各行が近傍再構成係数からなるスパースな重み行列 $W$($\sum_j W_{ij}=1$)を得たら、 第 2 段階は疎な対称半正定値行列 $M=(I-W)^\top(I-W)$ の最小固有ベクトルを求める問題になります。 最小固有値は必ず $0$(固有ベクトルは全 $1$ ベクトル $\mathbf{1}/\sqrt{N}$ で、 全点を 1 点に潰す自明解)なのでこれを捨て、 次に小さい $d$ 個の固有ベクトルを並べたものが $d$ 次元埋め込み $Y$ です。 PCA が共分散の最大固有ベクトルを使うのと双対的に、 LLE は局所連結行列の最小固有ベクトルを使う ── この「ボトム側スペクトル」を取る構造が Laplacian Eigenmaps とも共通します。 $N$ が大きいときはスパース固有値ソルバー(ARPACK / LOBPCG)が必須で、 重み計算 $O(DNk^3)$ と固有分解が計算コストの二本柱です(本ページ「∑ 数学的導出」「🔭 上級トピック」も参照)。