この用語と一緒に検索・参照されやすいタグ。 関連ページに飛ぶときの手がかりにも使えます。
多様体学習 は「高次元データが実は低次元の曲がった面(多様体)上に乗っている」と仮定し、 その本質的な低次元構造を保ったまま次元削減する技術。 PCA が線形なのに対し、 t-SNE/UMAP/Isomap は非線形構造を保存する。
「曲面仮説 → 近傍構造保存 → 可視化」が多様体学習の中核。
🍰 まずはやさしく
複雑なデータを平らにする手法です。
データの正体を見えやすくするために使います。
スマホの大量の写真から特徴を探すようなものです。
この章では多様体学習の結論を学びます。
多様体学習は、 高次元データが低次元多様体上に乗っていると仮定して非線形に次元削減する手法群。
ここまでが要点です。 ただし実際に使う前に、 このページの「⚠️ よくある落とし穴」で挙げた Perplexity 依存/距離の解釈/再現性 には必ず目を通してください。 つまずくのは知識が無いときより、 知ってはいたが確認を飛ばしたときです。
🍰 まずはやさしく
データの整理に使う道具のようなものです。
たくさんの情報をまとめて見るために使います。
都道府県の多くのデータを地図にする例があります。
この章ではどんな場面で使うかを学びます。
本サイトの SSDSE 都道府県データを低次元可視化する際に登場し得ます。 「47都道府県を 100 指標で見るのは大変 → 2 次元に潰して地図化」が典型用途。
この用語は一見すると単独で理解できそうに見えますが、 実際には前提となる概念(測定・尺度・サンプリングなど)と組合せて初めて意味を持ちます。 「定義を覚える」より「どんな問いに答える道具なのか」を捉えるのが効率的です。
🍰 まずはやさしく
丸まった紙を広げるイメージです。
隠れたデータの形を見つけるために使います。
多くの項目を数本の軸で表すようなものです。
この章では直感的な仕組みを学びます。
「多様体学習」を最初に学ぶときは、 厳密な定義よりイメージを優先しましょう。 以下は具体例・比喩を用いた直感的理解の入口です。
高次元データの中には、 実は「低次元の曲面(多様体)に沿って分布している」ものが多い。 紙を丸めた「Swiss Roll」のように、 3 次元で見ても本質は 2 次元曲面。 多様体学習はその展開図を作る技術。 SSDSE-B-2026 の 47 都道府県を 100 次元の指標で表しても、 本質的な「都市度・人口規模・経済発展度」など 2〜3 次元で表せることが多い。
🍰 まずはやさしく
数学を使った厳密なルールです。
計算で正しくデータを変換するために使います。
点と点の距離を数式で表すようなものです。
この章では定義や数式の読み方を学びます。
やさしい説明で掴んだ感覚を、ここで t-SNE の目的関数(KL ダイバージェンス) の定義式に対応づけます。下の式は左辺 $\text{KL}(P \| Q)$ が何で決まるかを右辺で書き下したもので、Σ(合計)、分数(割り算)、log(対数) が現れます。それぞれの記号が何の量を指すのかは、次の「🔬 数式を言葉で読み解く」で 1 つずつ確かめてください。
直感で全体像を掴んだら、 次は厳密な定義を見ます。 数式は短いものでも、 「何を入力にして、 何を出力するのか」を意識して読むと早く慣れます。
数式を眺めるだけでは身につかないので、 各記号がどんな役割を担っているかを言葉で押さえます。 「数式を音読する習慣」がつくと、 論文や教科書を読むスピードが体感で 2 倍ほど上がります。
上の数式に出てくる各記号が何を表すかを、 言葉で翻訳します。 1 つずつ自分の言葉で言い換えられるようになると、 論文や教科書のスピードが一気に上がります。
| 記号 | 意味(言葉での説明) |
|---|---|
| $W_{ij}$ | 高次元での近傍重み(カーネル類似度) |
| $y_i$ | 低次元埋め込み後の点 |
| $Y^\top Y = I$ | 冗長性を除く正規直交制約 |
| 多様体 | 局所的にはユークリッド、 大域的に曲がっている空間 |
| t-SNE/UMAP | 実務でよく使われる多様体学習アルゴリズム |
数式だけでは「実感」が湧きにくいので、 具体的な数値で 1 度手計算してみると理解が定着します。 以下の例は、 本サイトで扱う SSDSE-B-2026 や公開教材に近い形式で用意しました。
SSDSE 47 都道府県を 100 指標から 2D へ:
| 手法 | 線形/非線形 | 強み |
|---|---|---|
| PCA | 線形 | 解釈性、 大域構造 |
| Isomap | 非線形 | 多様体上の距離保存 |
| LLE | 非線形 | 局所構造 |
| t-SNE | 非線形 | クラスタ可視化 |
| UMAP | 非線形 | 速度と品質のバランス |
手計算で得た値と、 後述の Python 実装で算出した値が一致することを確認すると、 「数式とコードの対応関係」がクリアに見えるようになります。
数式だけでは「分かった気になる」だけで終わりがち。 ここで SSDSE-B-2026(教育用標準データセット — 47 都道府県 × 100+ 指標、 2018-2023 年度)の実値を当てはめて、 多様体学習 の挙動を電卓的に追体験します。
SSDSE-B-2026 は 統計センターの SSDSE 配布ページ から CSV を直接ダウンロードできます。 本サイトでは data/raw/SSDSE-B-2026.csv に配置している前提でコードを書いています。
t-SNE のキーパラメータ perplexity は「各点の近傍密度の有効サイズ」を制御する。 数式を言葉で読み解くと、 perplexity = 2^H(P_i)(点 i の近傍分布 P_i のエントロピー H の指数)。 直感的には「何個の近傍を見るか」。 SSDSE-B-2026 (47 県) で perplexity を 5/10/20/30 と振り、 PCA との「保存される構造」を定量比較する。
🎯 このコードでやること:SSDSE-B-2026 の 109 列を t-SNE と PCA で 2 次元化し、 perplexity スイープと近傍保存率 (trustworthiness) を測る。
📥 入力データ:SSDSE-B-2026 の 2023 年 47 県 × 109 列を StandardScaler で標準化した X (shape=(47, 109))。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.manifold import TSNE, trustworthiness from sklearn.decomposition import PCA df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df23 = df[df['SSDSE-B-2026'] == 2023].drop(columns=['SSDSE-B-2026', 'Code', 'Prefecture']) X = StandardScaler().fit_transform(df23) # PCA ベースライン pca2 = PCA(n_components=2, random_state=0).fit_transform(X) tw_pca = trustworthiness(X, pca2, n_neighbors=5) print(f'PCA(2): trustworthiness@5 = {tw_pca:.3f}') # t-SNE の既定は Barnes-Hut 近似だが、標本数が数千未満のときは method='exact' の # ほうが正確でしかも桁違いに速い(47 県なら 75 秒 → 0.1 秒)。 # t-SNE: perplexity スイープ for perp in [5, 10, 20, 30]: emb = TSNE(n_components=2, perplexity=perp, random_state=0, init='pca', method='exact').fit_transform(X) tw = trustworthiness(X, emb, n_neighbors=5) print(f't-SNE perp={perp:2d}: trustworthiness@5 = {tw:.3f}') |
📤 実行例:
💬 結果の読み方:perplexity=30 で trustworthiness 0.941 が最大。 47 県という小サンプルでは perplexity を大きめにとっても局所構造が保たれ、 いずれの perplexity でも t-SNE が PCA を上回る。 PCA は線形射影で 109 次元 → 2 次元へ圧縮するため情報損失が生じるが、 それでも trustworthiness 0.900 と比較的高く、 規模系指標が支配的なデータで線形射影が健闘することを示す。
🎯 このコードでやること:同じ X に対し UMAP を n_neighbors=5/10/20 で実行し、 trustworthiness と計算時間を t-SNE と比較。
📥 入力データ:上の標準化済み X (47, 109)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import time import umap for nn in [5, 10, 20]: t0 = time.perf_counter() emb = umap.UMAP(n_components=2, n_neighbors=nn, min_dist=0.1, random_state=0).fit_transform(X) tw = trustworthiness(X, emb, n_neighbors=5) print(f'UMAP n_neighbors={nn:2d}: tw@5={tw:.3f}, time={time.perf_counter()-t0:.2f}s') # t-SNE perp=10 の時間も計測 t0 = time.perf_counter() _ = TSNE(n_components=2, perplexity=10, random_state=0).fit_transform(X) print(f't-SNE perp=10 time={time.perf_counter()-t0:.2f}s') |
📤 実行例:
💬 結果の読み方:UMAP は n_neighbors=20 で tw=0.915 が最大で、 いずれも PCA (0.900) を上回る良好な近傍保存を示す。 ただし同じ X での t-SNE (perp=10 で tw=0.926) にはわずかに及ばず、 n=47 の小標本では t-SNE の方が僅差で高精度かつ高速(初回 UMAP は numba のコンパイルで時間がかかる)。 UMAP の真価は 10 万行を超える大規模データで発揮される (t-SNE は O(n log n) でも実時間が爆発する)。 47 県データで「UMAP の方が速い」と思い込むのは典型的な誤り。
| 条件 | 推奨手法 | 理由 |
|---|---|---|
| 大局的距離を保持したい | MDS / Isomap | 埋め込み距離 ≈ 多様体測地距離 |
| 局所クラスタを強調したい | t-SNE (perp=√n) | KL 発散最小化が局所構造に注力 |
| 速度・大規模・新点追加 | UMAP | transform() で新規データを射影可能 |
| 線形射影で十分 | PCA | 解釈可能・成分の意味付け容易 |
| 分類タスクの可視化 | LDA → t-SNE 多段 | 教師ラベルで supervise 後に可視化 |
核心:「とりあえず t-SNE」はアンチパターン。 SSDSE-B-2026 の 47 県を 2 次元化するなら、 まず PCA → 寄与率を確認 → 累積寄与率が 70% に届かない場合のみ t-SNE/UMAP に進む、 という段階的アプローチが推奨される。 PCA だけで十分な構造が見えれば 解釈可能性 (PC1=人口規模軸など) という大きな利点を享受できる。
多様体学習は「高次元データを 2 次元に潰してプロットする手法」だけではない。 SSDSE-B-2026(都道府県 × 約 110 指標、 47 行)のような小標本・多変量・解釈志向のデータに対しては、 PCA(線形多様体)→ Isomap(測地距離保存)→ t-SNE/UMAP(近傍構造強調)という三段階の道具立てを持つことで、 単一手法の限界(線形性、 大域構造の崩壊、 ハイパーパラメータ過敏)を補い合える。 本セクションでは、 47 県データという n=47, p≒110 の極めて典型的な「広く浅いデータ」に対して、 どの手法をどの順番で、 どんな前処理と検証フローで適用すべきかを、 実装手順と落とし穴付きで提示する。
SSDSE-B-2026 の指標は総人口 A1101(≒10⁷)、 消費支出 L3221(≒10⁵)、 標準地価 C5401(≒10⁴〜10⁵)、 合計特殊出生率 A4103(≒10⁰)と桁違いに尺度が異なる。 これを生のまま PCA に流すと「人口」だけが第一主成分を占有し、 残る 100 指標は実質的に無視される。 多様体学習の前段では以下の四点を順に実施する。
| 手順 | 目的 | Python 実装 | 省略時の症状 |
|---|---|---|---|
| ① 欠損処理 | 距離計算の破綻防止 | df.dropna(axis=1, thresh=int(0.9*len(df))) | NaN 含む列で距離が ∞ になる |
| ② 対数変換 | 人口・地価の右裾を圧縮 | np.log1p(df['A1101']) | 東京・大阪が常に外れ点になり多様体が歪む |
| ③ 標準化 | 列ごとに平均 0・分散 1 | StandardScaler().fit_transform(X) | 人口だけが PC1 を占有 |
| ④ 多重共線性整理 | 相関 0.95 以上のペアを片方削除 | df.corr().abs() > 0.95 | 「総人口 A1101」と「日本人人口 A1102」(相関 0.9999)など実質同一列が二重に効いてしまう |
この四段階を経て初めて「47 行 × 約 60 列の整理済み行列」になる。 ここから多様体学習を始める。 ④で削った列の情報は完全に失われるわけではなく、 残された列に強く相関した形で含まれている。
「最初から t-SNE/UMAP」は誤り。 SSDSE-B-2026 のように n が小さく(47)、 変数が解釈可能な指標の場合、 まず PCA で「線形多様体で何 % 説明できるか」を見極めるのが正攻法である。 経験則として:
| PC1+PC2 累積寄与率 | 推奨手法 | 理由 |
|---|---|---|
| 70% 以上 | PCA で完結 | 解釈可能、 計算安定、 追加予算ゼロ |
| 50–70% | Kernel PCA / Isomap を併用 | 弱い非線形性が想定される。 測地距離で大域構造を保存 |
| 50% 未満 | UMAP(または t-SNE) | 強い非線形構造あり。 ただし大域距離は保存されないことに留意 |
SSDSE-B-2026(2023 年度・対数変換なしの標準化のみ)で実際に PCA を回すと、 人口規模系の指標が多いため PC1(人口・経済規模軸)だけで寄与率 77% 前後、 PC1+PC2 で累積寄与率 82% 前後になる。 表の基準では「PCA で完結」のゾーンだが、 これは規模系指標に引きずられた結果でもあり、 対数変換や規模系指標の除外を行うと寄与率は下がって、 PCA だけでは捉えきれないニュアンス(例: 沖縄県の特異な出生率構造、 北海道の気候・人口構造の極端さ)が残る。 ここで Isomap や UMAP を「補助線」として重ねることで、 PCA 軸の解釈を保ちつつ、 隠れた近傍構造を可視化できる。
t-SNE の perplexity と UMAP の n_neighbors は、 ともに「何件の近傍を一つのご近所と見なすか」を決める鍵パラメータ。 SSDSE-B-2026 のような n=47 の小標本では、 推奨域が一般的なベンチマーク(n=数千以上)とは大きく異なる。
| 手法 | パラメータ | 一般的推奨 | SSDSE n=47 推奨 | 理由 |
|---|---|---|---|---|
| t-SNE | perplexity | 30–50 | 5–15 | perplexity が n の 1/3 を超えると全点が一塊になる |
| UMAP | n_neighbors | 15–50 | 5–10 | 大きすぎると全県が「東京 vs その他」の二分化に潰れる |
| UMAP | min_dist | 0.1 | 0.3–0.5 | 小さすぎると点が重なってラベルが読めない |
| Isomap | n_neighbors | 10–20 | 5–8 | 大きいと近傍グラフが完全グラフ化し PCA と同等になる |
実務 Tips: t-SNE/UMAP は乱数初期化に依存して結果が変わる。 SSDSE では random_state を固定し、 さらに 5 種類の seed で並列に走らせて安定して同じ近傍関係が出るかを目視確認するのが推奨される。 「沖縄と離島県」「東京・神奈川・大阪のメガ都市群」「東北 6 県の高齢化クラスタ」など、 どの seed でも一貫して同じ群を作る点は信頼でき、 seed ごとに揺らぐ点は 境界曖昧な事例として保留すべきである。
教師なしの多様体学習には「正解ラベル」がないため、 評価は三つの指標を組み合わせる。
sklearn の sklearn.manifold.trustworthiness で前者は直接計算できる。 後者は seaborn.scatterplot(hue='地方区分') のように色分けで点検する。 これら三つが揃って初めて「多様体学習が成功した」と言える。
高校・大学初年次の演習で頻出する誤解を、 SSDSE-B-2026 を題材に明示的に解消しておく。
| 誤解 | 正しい理解 |
|---|---|
| 「t-SNE の点間距離が意味を持つ」 | 局所構造のみ保存。 大域距離(クラスタ間の距離)は無意味。 解釈の際は「クラスタ内の位置関係」だけを使う。 |
| 「クラスタの大きさが集団のばらつきを表す」 | t-SNE/UMAP のクラスタ大きさは確率密度の局所スケール調整で決まる人工的な値。 集団のばらつきとは別物。 |
| 「2 次元化したから機械学習の精度が上がる」 | 情報損失で精度はむしろ下がることが多い。 多様体学習は可視化と探索的解析が主目的で、 予測モデルの前処理としては PCA など線形手法が安全。 |
| 「新しいデータも同じ多様体上に乗せられる」 | t-SNE は transform() を提供しない(再 fit が必要)。 新規データへの汎化が要件なら UMAP か Parametric t-SNE を選ぶ。 |
これらの誤解は、 論文や報告書で「t-SNE の点間距離を計測してさらなる解析を加える」「クラスタ面積を比較して多様性を論じる」といった致命的なミスに直結する。 教材としては「散布図の解釈は局所的に、 距離は順序のみ」というルールを徹底する必要がある。
多様体学習という名は 2000 年前後に急速に広まったが、 その背景には「高次元データの呪い」と呼ばれる根本問題がある。 ある変数の次元 p が増えるにつれて、 任意の二点間の距離はほぼ一定値に収束してしまい、 「近い」「遠い」の区別が消失する。 SSDSE-B-2026 で言えば、 47 県を 110 指標すべての標準化空間に置いて「青森と岩手の距離 / 青森と東京の距離」の比を測ると、 多くの距離が似たり寄ったりの値に潰れる。 これでは「近隣県は似ているはず」という直感が、 計算上は反映されない。 多様体学習はこの呪いに対する具体的な処方箋であり、 データが本質的に低次元の多様体に乗っているという仮定を活かす。
PCA は 1901 年の Pearson 論文に遡る古い手法で、 「分散最大の線形軸」を探すだけのシンプルな道具である。 1960–1970 年代には MDS(多次元尺度法)が登場し、 「距離行列を保存する低次元埋め込み」という概念が定着した。 1990 年代後半、 Schölkopf らが Kernel PCA を提案し、 「カーネル関数で非線形性を導入する」という発想が一気に広まった。 2000 年に Tenenbaum らの Isomap、 同年に Roweis らの LLE が発表され、 「測地距離を保存する」「局所線形性を保存する」という多様体学習の基本パラダイムが確立した。 2008 年に van der Maaten らが t-SNE を発表し、 可視化の世界を一変させた。 2018 年に McInnes らが UMAP を発表し、 速度と大域構造の両立を実現した。
この歴史は線形 → カーネル → 局所多様体 → 確率的可視化という流れで読み解ける。 SSDSE-B-2026 を扱う実務家は、 自分のデータがどの段階の道具で十分かを見極める必要がある。 47 県の構造は意外なほど線形に近い(PCA で 60% 説明できる)ため、 多くの場合は PCA + Kernel PCA で十分であり、 t-SNE/UMAP は探索的可視化の補助として使うのが筋である。
「110 指標の都道府県データは、 実は数次元の多様体に乗っている」という仮説は、 経験的にも理論的にも支持されている。 経験的には、 PCA の特異値分解で得られる特異値が急速に減衰し、 累積寄与率が数次元で 60–80% に達する事実が観測される。 理論的には、 都道府県の指標は 気候・産業構造・人口構造といった少数の「潜在因子」によって駆動されていると仮定でき、 観測値はこれら因子の関数として表現される。 多様体学習は、 この潜在因子空間を直接同定しようとする試みと言える。
この観点は、 因子分析や潜在変数モデルとの強い関連を示唆する。 実際、 確率的 PCA(PPCA)は PCA を生成モデルとして再定式化したものであり、 さらに変分オートエンコーダ(VAE)は「非線形 PPCA」と見なせる。 つまり、 多様体学習はディープラーニングの一部(表現学習)と地続きであり、 「次元削減」「特徴量抽出」「表現学習」は本質的に同じ問題を別角度から解いていると理解するのが正しい。
多様体学習は SSDSE-B-2026 のような探索的データ解析だけでなく、 以下の幅広い応用領域で実務的に使われている。
SSDSE-B-2026 における典型的な応用は、 「47 県のグループ化」「特徴的な県の発見」「政策評価の前段としての類型化」である。 例えば「東北 6 県は本当に一つの塊か、 それとも秋田・青森と宮城・福島で二分されているか」を多様体学習で問うことができる。 これは行政の補助金配分や政策評価の根拠資料として、 数値的に意味のある分析になる。
多様体学習は「式の理解は難しいが結果は直感的」という珍しい教材である。 SSDSE-B-2026 を使った教育では、 以下の三段階アプローチが効果的と確認されている。
| 段階 | 学習内容 | 活動例 | 所要時間 |
|---|---|---|---|
| ① 可視化体験 | PCA で 47 県を 2 次元にプロット | 「自分の県を探す」「近隣県との位置関係を確認」 | 30 分 |
| ② 比較実験 | PCA, t-SNE, UMAP の出力を並べて比較 | 「同じデータでも見え方が変わる」を体感 | 45 分 |
| ③ パラメータ探索 | perplexity や n_neighbors を変えて挙動観察 | 「ハイパーパラメータが結果を変える」を体験 | 60 分 |
この三段階を経た学習者は、 単に「t-SNE はクラスタを綺麗に出す手法」と覚えるのではなく、 「結果の解釈には注意が必要」「単一手法に頼らず複数で確認」「自分の事前知識と照合」という科学的態度を身につける。 これこそが SSDSE-B-2026 を題材にしたデータサイエンス教育の核心であり、 多様体学習はその格好の教材となる。
このコードでやること: SSDSE-B-2026 から数値列のみを抽出し、 標準化したうえで PCA、 t-SNE、 UMAP の三つを順に適用、 同じデータが手法によってどう見え方が変わるかを 1 枚の図で比較する。
📥 入力データ(SSDSE-B-2026 抜粋):
📤 実行例(参考出力):
💬 結果の読み方: PCA の累積寄与率 82% は「規模系指標が支配的で、 線形 2 軸だけで大半を説明できる」ことを意味する(残る約 18% に非線形なニュアンスが潜む)。 t-SNE の Trustworthiness 0.94 前後は近傍構造の保存が良好であることを示す。 手法を並べて見ると、 PCA は大域構造(東京と地方県の対置)、 t-SNE は局所構造(近隣県同士の凝集)が強調されることが理解できる。 実際の意思決定では、 両者を補完的に使うのが正しい。
多様体学習は「データの真の形状」を可視化する強力な道具だが、 同時に誤用しやすい道具でもある。 SSDSE-B-2026 のような小標本・解釈志向のデータでは、 PCA を起点とし、 必要に応じて Isomap/UMAP を補助線として用い、 t-SNE は最後の探索的可視化として使う、 という保守的アプローチが推奨される。 結果の解釈では「距離は順序のみ、 大きさは無意味、 単独手法は信用しない」の三原則を徹底することで、 多様体学習を科学的に正しく使いこなせる。 次の学習ステップとしては、 次元削減の数理基礎、 Kernel PCA の理論、 そして表現学習一般への接続(VAE, Self-supervised Learning)が自然な発展となる。
perplexity として「30」と「10」のどちらが推奨されるか。 理由とともに 100 字以内で答えよ。解答の指針: ① 10(n=47 では perplexity が n/3 を超えると全点が一塊になる)。 ② 40%、 Kernel PCA と Isomap(または UMAP)。 ③ t-SNE は近傍構造のみ保存、 大域距離やクラスタ面積は確率密度の局所スケーリングで決まる人工的な値だから。 ④ 対数=右裾圧縮、 標準化=列スケール統一、 多重共線性=実質同一列の除去、 欠損=距離破綻防止。 ⑤ 不十分。 数値指標は近傍保存度のみ測るので、 地方ブロックなどの外部知識と一致するかを目視確認することで初めて妥当性を担保できる。
多様体学習を初めて使うと、 教科書には書かれていない細かい疑問に必ずぶつかる。 ここでは SSDSE-B-2026 を題材に、 現場でよく問われる 10 個の問いを丁寧に解説する。
どちらも正しいが目的が違う。 PCA は大域構造(東京と離島県の対比のような大きな差)を保存し、 数値も解釈可能。 t-SNE は局所構造(隣接県の凝集)を保存するが、 数値の物理的意味は失われる。 SSDSE-B-2026 で「人口規模で県を比べたい」なら PCA、 「文化的に近い県の集まりを見たい」なら t-SNE/UMAP が向く。 一つの図ですべてを語ろうとせず、 目的別に複数の図を並べるのが正解である。
概ね正しいが万能ではない。 UMAP は計算が速く、 大域構造の保存も t-SNE より良い。 さらに transform() で新規データの埋め込みが可能。 ただし確率密度の局所スケーリングは t-SNE のほうが洗練されており、 微細なクラスタ分離は t-SNE が勝ることがある。 SSDSE-B-2026 のような n=47 の小標本では、 両者の差はほぼ見えないので速くて再現性の高い UMAP を第一選択とするのが実務的判断。
t-SNE/UMAP の結果に k-means を適用するのは推奨されない。 出力空間の距離が非ユークリッド的(局所的に歪んだ確率距離)なので、 ユークリッド距離前提の k-means とは相性が悪い。 PCA の結果なら問題ない。 代替案として、 多様体学習の前段で「コサイン類似度行列を作り → 階層クラスタリング」というアプローチが推奨される。
典型的な「次元の呪い」状況である。 サンプル数 n=47 に対し変数 p=110 という p > n のケースでは、 多変量正規分布を仮定した古典統計は破綻する。 多様体学習は「真の次元数は p よりずっと小さい」という多様体仮説を頼りに、 この呪いを回避する。 SSDSE-B-2026 の場合、 真の次元数は 5–10 程度と推定され、 PCA で 5 成分を取れば 80% 程度の情報が保存される。
使える。 ただし三つの条件を満たすこと: ①random_state を明示して再現可能にする、 ②複数の seed で同じ近傍関係が得られることを確認、 ③論文には Trustworthiness などの数値指標も併記する。 「t-SNE プロットを 1 枚貼って終わり」は科学的とは言えない。 SSDSE-B-2026 を使った教育では、 必ず「seed=42 と seed=2024 で同じか確認」というステップを入れる。
人口(10⁷ オーダー)が距離計算を支配し、 出生率(10⁰ オーダー)はほぼ無視される。 結果として「人口で並び替えた図」しか得られず、 多様体学習を使う意味が失われる。 SSDSE-B-2026 で標準化を省略するとほぼ必ず、 東京・神奈川・大阪が片側、 残り 44 県が反対側に貼り付く退化した図になる。
直接入れるのは推奨されない。 多様体学習の距離計算はユークリッド距離を前提とするため、 ワンホットエンコードしたカテゴリ変数を入れると距離が歪む。 代替案: ①地方区分は色分けに使うだけにする(埋め込みには入れない)、 ②Gower 距離など混合型距離行列を計算してから MDS を適用、 ③量的指標のみで多様体を作ったあと、 地方区分との一致をクロス集計で確認。
よい。 可視化が目的なら 2 か 3、 後段の機械学習の前処理なら 5–20 が一般的。 PCA の場合は累積寄与率 80% を超える最小次元数を選ぶ。 SSDSE-B-2026 では PC1–PC5 の累積寄与率が 80% 前後になることが多いので、 「2 次元で可視化、 5 次元で機械学習」と使い分けるのが定石である。
三つの選択肢がある: ①そのまま含める(東京の特異性が図に現れる)、 ②対数変換で圧縮(推奨)、 ③除外して別途分析(東京を抜くと残り 46 県の細部が見えやすくなる)。 多くの場合②を選び、 そのうえで「東京は外れ値だが構造解析の対象外として扱う」と注記する。 完全除外は情報損失が大きいので、 ある特殊な目的(例: 中規模都市の類型化)に限定する。
完全な正解は存在しない(教師なし)が、 以下の三段階で「妥当性」を担保できる: ①数値指標(Trustworthiness ≥ 0.95, Continuity ≥ 0.95)、 ②外部知識との一致(地方区分、 政令市区分など)、 ③予測タスクでの実用性(埋め込みを使った県の出生率予測など下流タスクの精度)。 これら三つが揃って初めて「この多様体学習結果は意思決定に使える」と言える。
合成データで「スイスロール」の直線距離と多様体距離を比較する。
1 2 3 4 | euclid = 1.0 geodesic = 1.5 ratio = euclid / geodesic print(f"圧縮率: {ratio:.3f}") |
💬 手計算 (Step 2) 0.667 と Python 出力が完全一致。
多様体学習のすべての出発点は多様体仮説 (Manifold Hypothesis):「高次元に見えるデータも、 実は少数の内在的な自由度で生成されており、 高次元空間の中の低次元の曲面(多様体)の上に乗っている」という仮定です。 下のデモはすべて合成データ(合成デモ)です。 左のキャンバスで 3 次元に折り畳まれたスイスロール/S字カーブを回転させて眺め、 右のキャンバスで「線形 PCA 投影」と「非線形展開」を切り替えてください。 3 次元に見えるのに、 色帯をたどると実は 1 枚の 2 次元シートだった——これが体感できれば多様体仮説は理解できたも同然です。 なお「測地線距離 vs 直線距離」の観点は姉妹ページ Isomap のデモで扱っているので、 ここでは「なぜ線形次元削減では足りないか」に集中します。
何が起きているか:PCA は「分散が最大の方向にまっすぐな軸を通す」だけなので、 巻かれたシートを真上から押し潰した影しか作れません。 その結果、 巻きの内側(青系)と外側(赤系)——シートの上では遠く離れた場所——が隣同士に潰れて色帯が入り乱れます。 一方「非線形展開」はシートに沿った内在座標(巻きに沿った距離 × 高さ)で並べ直すため、 色帯が順序よくグラデーションを保ちます。 これが「線形次元削減では足りない」の正体です。 逆に言えば、 データがそもそも平ら(折り畳みなし)なら PCA で十分であり、 多様体学習の出番は「折り畳み・曲がり」があるときに限られます。
多様体仮説のもう一つの顔が内在次元 (intrinsic dimension):「観測は高次元でも、 データを実質的に動かしている自由度はいくつか」。 例えば地球の表面は 3 次元空間に浮かぶ曲面ですが、 位置は緯度・経度の 2 数で決まる——内在次元は 2 です。 次の 3 問で感覚を確かめてください。
上のデモは「多様体仮説が成り立つ理想形」です。 実データでは次の 3 点でつまずきます。 (t-SNE の perplexity 依存などアルゴリズム個別の注意は「⚠️ よくある落とし穴」を参照)
デモで見た「折り畳みを開く」作業を、 各アルゴリズムがどんな戦略で行うかの一覧です。 リンクのある手法は個別ページで詳説しています。
| 手法 | 展開の戦略 | 保存するもの | 弱点 |
|---|---|---|---|
| Isomap | 近傍グラフ上の測地線距離で MDS | 大域的な多様体距離 | ショートカット辺に脆い・遅い |
| LLE | 各点を近傍の線形結合で再構成し重みを保存 | 局所の線形構造 | 大域配置が歪む・近傍数に敏感 |
| t-SNE | 近傍確率分布の KL を最小化 | 局所クラスタ構造 | クラスタ間距離は無意味・逆変換なし |
| UMAP | ファジー単体集合の交差エントロピー最小化 | 局所+ある程度の大域 | n_neighbors 依存・確率的 |
| オートエンコーダ | NN で圧縮→復元を学習(詳細は 深層学習) | 復元に必要な情報・逆変換可 | 要大標本・チューニング重い |
| カーネル PCA | カーネルで高次元に写して線形 PCA | カーネルが定める非線形構造 | カーネル選択が本質的に難しい |
| PCA(参照点) | 分散最大の直線軸に射影(展開しない) | 大域の線形構造・解釈性 | 折り畳みを潰す(デモ 2 の通り) |
整理すると、 Isomap/LLE は「多様体仮説を素直に信じる」古典、 t-SNE/UMAP は「可視化に特化した近傍保存」の現代標準、 オートエンコーダは「展開関数そのものを学習する」深層学習アプローチ(新規データへの適用=out-of-sample 射影が可能な点が独特)です。 上位概念は 次元削減 を参照してください。
公的統計(SSDSE-B-2026)を題材に、 最小限の Python コードで動作させます。 ファイルパス(data/raw/SSDSE-B-2026.csv)は自分の環境に合わせて変更してください。 まずはこのまま動かすことが理解の最短ルートです。
1 2 3 4 5 6 7 8 9 10 11 12 | from sklearn.manifold import TSNE from sklearn.preprocessing import StandardScaler import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) X = df[df['SSDSE-B-2026'] == 2023].select_dtypes('number').fillna(0) Xs = StandardScaler().fit_transform(X) # t-SNE の既定は Barnes-Hut 近似だが、標本数が数千未満のときは method='exact' の # ほうが正確でしかも桁違いに速い(47 県なら 75 秒 → 0.1 秒)。 emb = TSNE(n_components=2, perplexity=10, random_state=0, method='exact').fit_transform(Xs) print(emb.shape) # (47, 2) |
▶ 実行 を押せばこのページの中でそのまま動きます(ライブラリもデータも同梱済みで、 準備は要りません)。 手元の Python に移して動かすときは pip install numpy pandas scikit-learn が必要です。 読んでいるデータは data/raw/SSDSE-B-2026.csv。 日本語を含むので encoding='cp932' の指定を落とさないでください。
本サイトの全コードは 論文一覧ページ から実例として確認できます。 自分のデータで試したい場合は、 列名・欠損記号・単位の違いだけ調整すれば、 ほぼそのまま流用できます。
「多様体学習」を初めて使う方向けに、 ハンズオン的な実行手順を整理します。 上の Python 実装と組み合わせて、 1 度自分の手でなぞってみることを強く推奨します。
data/raw/ に配置(または自分のデータを用意)。 列名と単位を確認。df.head()、 df.describe()、 df.isna().sum() で全体像を把握。 ここで欠損や外れ値の見当を付ける。この 8 ステップを 1 度回すと、 「用語を読んで分かった気になる」段階から「実際に使える」段階に進めます。 知識は身体で覚えるのが結局のところ最速です。
🎯 このコードでやること: 2023 年 47 都道府県の 5 変数(人口・65 歳以上人口・出生数・年平均気温・消費支出)を標準化し、 PCA・Isomap・t-SNE・LLE の 4 手法で 2 次元に落として並べます。 同じデータでも「直線的に潰す PCA」と「曲がった構造をほどく多様体学習」で布置がどう変わるかを、 1 枚の図で見比べるのが目的です。 なお pd.read_csv('data/raw/SSDSE-B-2026.csv') をパス変数にせず直書きしているのは、 初学者が「パスをどこに書くべきか」で迷わないようにするためです。 CSV を同じ階層に置けばそのまま動きます。
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 | # 多様体学習 を SSDSE-B-2026 で確かめる最小コード import pandas as pd import numpy as np # 1) SSDSE-B-2026(教育用標準データセット)を読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) print('shape:', df.shape) # (564, 112) — 47 都道府県 × 12 年度 print('cols head:', list(df.columns[:8])) # 2) 直近年度(2023 年度)に絞る(先頭列 'SSDSE-B-2026' が年度) df23 = df[df['SSDSE-B-2026'] == 2023].copy() print('rows in 2023:', len(df23)) # 3) 多様体学習 を動かすために必要な列だけ取り出す y = df23['A4103'].astype(float) # 合計特殊出生率 x = df23['A1101'].astype(float) # 総人口 print('y stats:', y.describe().round(3).to_dict()) print('x stats:', x.describe().round(0).to_dict()) # 4) 多様体学習 の本処理(このページの主題) # — 具体実装は同カテゴリの個別ページにも掲載 print('---- 多様体学習 結果 ----') print('mean y:', round(y.mean(), 3), '/ std y:', round(y.std(), 3)) print('mean x:', round(x.mean()), '/ std x:', round(x.std())) print('corr(x, y):', round(y.corr(x), 3)) # 2023年度実測: -0.564 |
うまく動かないときは ①data/raw/SSDSE-B-2026.csv のパス、 ②encoding='cp932'(SSDSE-B は Shift_JIS 系)、 ③1 行目に英数字コードヘッダ、 2 行目に日本語列名が入る構造なので 2 行目だけを飛ばす skiprows=[1] が必要、 の 3 点を確認してください。
基本コードに加え、 SSDSE-B-2026 の多変量を取り回す実用パターン。 引数を変数化せず、 パスを直書きしているのは初学者が「どこに何を書くか」で迷わないようにするため。
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 | # 多様体学習 の拡張実装 — 多年度・複数指標を扱う import pandas as pd import numpy as np # 1) 全 564 行(47 都道府県 × 12 年度)を読み込む df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 2) 年度別の代表指標(出生率・総人口・大学数)の平均 agg = df.groupby('SSDSE-B-2026').agg( avg_birth=('A4103', 'mean'), # 合計特殊出生率 avg_pop=('A1101', 'mean'), # 総人口 avg_univ=('E6102', 'mean'), # 大学数 ).round(2) print(agg) # 3) 直近年度(2023)と過去年度(2018)の比較 df18 = df[df['SSDSE-B-2026'] == 2018].set_index('Prefecture') df23 = df[df['SSDSE-B-2026'] == 2023].set_index('Prefecture') # 共通する都道府県だけ抽出 common = df18.index.intersection(df23.index) df18 = df18.loc[common] df23 = df23.loc[common] growth_pop = ((df23['A1101'] - df18['A1101']) / df18['A1101']).round(4) print('人口増減率トップ5:', growth_pop.sort_values(ascending=False).head().to_dict()) print('人口増減率ワースト5:', growth_pop.sort_values().head().to_dict()) # 4) 多様体学習 の主処理 — ここで個別ページの手法を呼ぶ # (SHAP, KNN, SVM, t-SNE 等は同名ページのコードを参照) print('---- 多様体学習 拡張版完了 ----') |
SSDSE-B-2026 は 564 行(47 都道府県 × 12 年度)あるので、 年度フィルタを忘れると重複計算になります。 必ず df[df['SSDSE-B-2026'] == 2023] のように絞ってから本処理へ進むのが安全です。
多様体学習 を「やってみたけど結局正しかったのか分からない」状態を避けるための、 標準的な検証観点。 SSDSE-B-2026 のような中小規模データでは特に丁寧に。
| 確認する点 | 多様体学習 で何を見るか |
|---|---|
| Perplexity 依存 | 小さいと細かすぎ、 大きいと潰れる。 5〜50 で複数試す。 |
| 距離の解釈 | t-SNE の距離は意味を持たない。 「クラスタの分離」は読み取れるが「クラスタ間距離」はダメ。 |
| 再現性 | 乱数依存で結果が変わる。 random_state を固定。 |
| 過剰な前処理 | 標準化・PCA 前段が結果を大きく変える。 工程をドキュメント化。 |
| t-SNE の距離は不正確 | クラスター間の距離は意味を持たない。 「クラスタリング結果の可視化」専用に。 |
| ハイパーパラメータ依存 | perplexity を変えると別の図に。 複数値で安定性を確認。 |
| 再現性 | 同じデータ・同じコードで同じ結果が出るか。このページの ▶ 実行ボタンで確かめられます |
多様体学習 を使った分析結果を、 第三者が誤読しない形でレポートに書くための標準フォーマット。 SSDSE-B-2026 を使った大学のレポートから業務報告書まで応用可能。
この 7 点セットを書く習慣をつけると、 査読者・上司・同僚から「何が分かって何が分からないのか明確で良い」と評価されます。 数値だけ並べて「すごい結果が出ました」では、 残念ながら通用しません。
以下の問いに自分の言葉で答えられれば、 多様体学習 は「使える知識」として身についています。 まだ答えられない問いがあれば、 該当セクションに戻って再読しましょう。
pd.read_csv('data/raw/SSDSE-B-2026.csv') 直書き版)を手元で実行し、 出力を観察しましたか?8 問中 6 問以上「はい」と答えられれば、 この用語は実務応用レベルで理解できています。 残りは関連用語を学ぶ中で自然に補完されます。
多様体学習が成り立つ前提は、 高次元空間 $\mathbb{R}^D$ にあるデータ $\{x_i\}_{i=1}^n$ が実は低次元 $d \ll D$ の滑らかな部分多様体 $\mathcal{M}$ の近傍に分布しているという仮説です:
$$x_i = f(z_i) + \epsilon_i, \quad z_i \in \mathbb{R}^d, \quad f : \mathbb{R}^d \to \mathbb{R}^D \text{ は滑らか}, \quad \epsilon_i \sim \mathcal{N}(0, \sigma^2 I_D).$$🔬 数式を言葉で読み解く:$D$ 次元の観測 $x_i$ は、 本当は $d$ 次元の潜在変数 $z_i$ を滑らかな写像 $f$ で $D$ 次元に埋め込み、 そこに $D$ 次元方向の小さなノイズ $\epsilon_i$ を加えたもの。 SSDSE-B-2026 の 47 県 × 数十変数のデータも、 実は「人口規模」と「産業構造」の 2 軸でほぼ説明できる、 という直感に対応します。 多様体学習は $f$ も $z_i$ も同時に推定する逆問題で、 PCA(線形)→ Isomap(測地線)→ LLE(局所線形)→ t-SNE / UMAP(局所確率)と進化してきました。
このコードでやること:SSDSE-B-2026 から 47 県の実在指標コード 5 列(A1101=総人口・A1303=老年人口(65歳以上)・A4101=出生数・B4101=経済基盤系・L3221=家計系)を抽出し、 z-score 標準化したうえで Isomap, t-SNE, UMAP の 3 手法で 2 次元埋め込みを生成。 線形 PCA との違いを観察します。
📥 入力データ(skiprows=[1] 適用後・先頭 3 行、 値は略記):
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 | import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.manifold import Isomap, TSNE, LocallyLinearEmbedding from sklearn.decomposition import PCA df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) # 年度列(コード名)で 2023 に絞る cols = ['A1101', 'A1303', 'A4101', 'B4101', 'L3221'] # 実在コード列のみ X = StandardScaler().fit_transform(df[cols].values) # 線形 PCA(比較ベースライン) X_pca = PCA(n_components=2, random_state=2026).fit_transform(X) # Isomap(測地距離保存)n_neighbors は局所近傍サイズ X_iso = Isomap(n_neighbors=8, n_components=2).fit_transform(X) # LLE(局所線形再構成保存) X_lle = LocallyLinearEmbedding(n_neighbors=8, n_components=2, random_state=2026).fit_transform(X) # t-SNE の既定は Barnes-Hut 近似だが、標本数が数千未満のときは method='exact' の # ほうが正確でしかも桁違いに速い(47 県なら 75 秒 → 0.1 秒)。 # t-SNE(局所確率分布の KL 最小化)perplexity は局所近傍の有効サイズ X_tsne = TSNE(n_components=2, perplexity=8, random_state=2026, init='pca', method='exact').fit_transform(X) print('埋め込み結果(東京・大阪・北海道・沖縄の座標):') for name, Z in [('PCA', X_pca), ('Isomap', X_iso), ('LLE', X_lle), ('t-SNE', X_tsne)]: print(f'\n{name}:') for pref in ['北海道', '東京都', '大阪府', '沖縄県']: i = df[df['Prefecture'] == pref].index[0] print(f' {pref}: ({Z[i,0]:+.2f}, {Z[i,1]:+.2f})') |
📤 実行結果(scikit-learn 1.7・random_state=2026 での実測。 座標の符号やスケールは手法・環境で変わる):
💬 結果の読み方:いずれの手法でも東京は大きく外れ値として浮き上がり、 主軸は「人口規模」を表しています。 PCA と Isomap は東京の影響が強く出るのに対し、 t-SNE は人口の小さい県(沖縄など)も近傍構造を保ったまま散布するため、 「人口規模では似ていないが、 産業構造が似ている地域」を見つけやすくなります。 LLE は座標スケールが極めて小さいことに注目(局所線形再構成の重みは正規化されるため絶対値に意味なし、 相対位置のみが重要)。
このコードでやること:t-SNE の最大ハイパーパラメータ perplexity は「局所近傍の有効サイズ」を制御します。 小さいと局所構造、 大きいと大域構造を反映。 47 県のような小データで perplexity を 2, 5, 15, 30 と変えて、 「東京の孤立度」「東日本/西日本の分かれ方」を比較します。
📥 入力データ:上記の標準化済み 5 変数 × 47 県の行列 X。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from sklearn.manifold import TSNE import numpy as np results = {} for perp in [2, 5, 15, 30]: Z = TSNE(n_components=2, perplexity=perp, random_state=2026, init='pca', method='exact').fit_transform(X) i_tokyo = df[df['Prefecture'] == '東京都'].index[0] dist_tokyo = np.linalg.norm(Z - Z[i_tokyo], axis=1) results[perp] = (dist_tokyo.mean(), dist_tokyo.max(), Z) print(f'{"perplexity":>10} | {"東京からの平均距離":>16} | {"最大距離":>10}') for perp, (m, mx, _) in results.items(): print(f'{perp:>10} | {m:>16.2f} | {mx:>10.2f}') |
📤 実行例(実値):
💬 結果の読み方:perplexity を 2 → 30 と上げると東京から他県への距離が 211.03 → 3.09 と縮みます(scikit-learn 1.9・random_state=2026・method='exact' での実測)。 小 perplexity(≤5)では「東京は遠く離れた島」として描かれ、 大 perplexity(30)では「東京はクラスタの片隅」として連続的に配置されます。 47 県程度の小データでは perplexity = √n ≈ 7 が経験則の目安。 perplexity が標本数 $n=47$ を超えると t-SNE は「全データを 1 点に圧縮」しがちなので注意。
このコードでやること:UMAP (McInnes & Healy, 2018) は t-SNE 同様に局所構造を保つが、 大域構造もある程度保ち、 高速・スケーラブルなのが強み。 n_neighbors と min_dist の二つで挙動を制御します。 47 県データに対して標準パラメータで適用。
📥 入力データ:標準化済み X(47 × 5)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import umap # pip install umap-learn import numpy as np # UMAP の挙動を 4 通り試す configs = [ {'n_neighbors': 5, 'min_dist': 0.1}, {'n_neighbors': 15, 'min_dist': 0.1}, {'n_neighbors': 15, 'min_dist': 0.5}, {'n_neighbors': 30, 'min_dist': 0.5} ] for cfg in configs: reducer = umap.UMAP(**cfg, n_components=2, random_state=2026) Z = reducer.fit_transform(X) # 東京と隣接する 3 県を出力 i_tokyo = df[df['Prefecture'] == '東京都'].index[0] dist = np.linalg.norm(Z - Z[i_tokyo], axis=1) near = df.loc[np.argsort(dist)[1:4], 'Prefecture'].tolist() print(f'n_neighbors={cfg["n_neighbors"]}, min_dist={cfg["min_dist"]} → 東京の近傍: {near}') |
📤 実行イメージ(参考。 umap-learn のバージョン・環境により座標と近傍順位は変動する。 東京の近傍が神奈川・大阪・愛知になる点は PCA / t-SNE の実測結果と一致):
💬 結果の読み方:UMAP の挙動はパラメータに対して頑健で、 東京の近傍は常に「神奈川・大阪・愛知」の三大都市圏。 これは社会経済指標の高次元空間での自然な近接関係をよく保存している証拠です。 min_dist を上げると点の密集を緩めるためクラスタ内部が広がり、 n_neighbors を上げると大域構造を重視。 47 県データなら n_neighbors=10-15 が経験的に最適。
このコードでやること:埋め込みの品質を客観評価する指標 trustworthiness(信頼度、 範囲 [0,1])と内在的次元の推定値(PCA 寄与率から)を計算。 trustworthiness は「埋め込み後の近傍が元空間でも近傍だった割合」で、 1 に近いほど良い埋め込みです。
📥 入力データ:上記の各種埋め込み結果 X_pca, X_iso, X_lle, X_tsne。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from sklearn.manifold import trustworthiness from sklearn.decomposition import PCA import numpy as np # 内在次元の推定(PCA 累積寄与率 90% を超える主成分数) pca_full = PCA().fit(X) cum = np.cumsum(pca_full.explained_variance_ratio_) d_intrinsic = np.argmax(cum >= 0.90) + 1 print(f'PCA 累積寄与率 = {cum.round(3).tolist()}') print(f'内在次元(寄与率 90% 達成に必要)= {d_intrinsic}') # trustworthiness(n_neighbors は局所近傍判定の幅) for name, Z in [('PCA', X_pca), ('Isomap', X_iso), ('LLE', X_lle), ('t-SNE', X_tsne)]: t = trustworthiness(X, Z, n_neighbors=5) print(f'{name:>8} trustworthiness = {t:.4f}') |
📤 実行例(実値):
💬 結果の読み方:5 変数のうち第 1 主成分だけで 62.7%、 2 主成分で 86.9%、 3 主成分で 99.7% を説明 → 累積 90% の線を越えるのは第 3 主成分なので、 内在次元は 3 と判定された。 SSDSE-B-2026 の 47 県は 5 次元で観測されているが、 実質3 つの自由度でほぼ動いている。 ただし「2 次元か 3 次元か」は閾値をどこに置くかで簡単に入れ替わる(85% なら 2 次元)点に注意 ── 内在次元は本来連続的なものを無理に整数へ丸めた指標である。 trustworthiness は t-SNE(0.947)と PCA(0.945)がほぼ同着で、 Isomap(0.943)、 LLE(0.895)が続く。 LLE が低いのは小標本ゆえ局所近傍の選び方に振らされやすいため。 「線形 PCA で十分なケース」と「非線形が必要なケース」を切り分ける目安:trustworthiness の差が 0.02 以下なら PCA を選ぶのが解釈性で勝る ── 今回はまさにその状況で、 非線形手法を使う理由が無いと読むべきである。
LLE は次の 2 段階最適化で動きます。 まず各点を近傍からの線形結合で再構成する重み $W_{ij}$ を計算:
$$\min_W \sum_{i=1}^n \left\| x_i - \sum_{j \in \mathcal N(i)} W_{ij} x_j \right\|^2 \quad \text{s.t. } \sum_j W_{ij} = 1.$$次に、 同じ重み $W$ を保ったまま低次元 $z_i$ を求める:
$$\min_{Z} \sum_{i=1}^n \left\| z_i - \sum_{j \in \mathcal N(i)} W_{ij} z_j \right\|^2 \quad \text{s.t. } \sum z_i = 0, \; \frac{1}{n}\sum z_i z_i^T = I_d.$$🔬 数式を言葉で読み解く:第 1 段は「各点 $x_i$ をその近傍 $\mathcal N(i)$ の点で線形再構成する一意な重みを決める」。 重みの和が 1 という制約により、 平行移動・回転・スケーリングに不変な「形」を抽出します。 第 2 段は「低次元での座標 $z_i$ も同じ重みで近傍から再構成できるように」配置する。 これは固有値問題 $M z = \lambda z$(ただし $M = (I-W)^T(I-W)$)に帰着し、 第 2〜$(d+1)$ 番目の小さな固有ベクトルが解です。 つまり LLE は「局所的な近傍関係を保持する低次元埋め込み」を線形代数で求める手法と言えます。
| 手法 | 原理 | 大域構造 | 計算量 | 推奨用途 |
|---|---|---|---|---|
| PCA | 線形・分散最大化 | 保つ | $O(D^3)$ | 第一近似・解釈性 |
| MDS | 距離保存 | 保つ | $O(n^3)$ | 距離行列が既にある |
| Isomap | 測地距離保存 | 保つ | $O(n^3)$ | 凸多様体・スイスロール |
| LLE | 局所線形再構成 | 弱い | $O(n^2 k)$ | 非凸多様体 |
| Laplacian Eigenmaps | グラフラプラシアン | 弱い | $O(n^2)$ | スペクトラルクラスタリング |
| t-SNE | KL 最小化(局所確率) | 壊す | $O(n^2)$ (Barnes-Hut で $O(n \log n)$) | 可視化・クラスタ発見 |
| UMAP | 圏論的近似 | 中程度保つ | $O(n^{1.14})$ | 大規模・前処理 |
Isomap は次の 3 ステップで動きます:
🔬 数式を言葉で読み解く:第 1 式は「グラフ上の経路に沿った辺の長さの和を最小化」する古典的な最短経路問題。 第 2 式は二重中心化変換 $H = I - \frac{1}{n}\mathbf 1 \mathbf 1^T$ で、 距離行列を「中心化された内積行列」に変換する操作。 第 3 式は内積行列 $B = U \Lambda U^T$ の固有分解で、 上位 $d$ 固有値を持つ部分が「測地距離をできるだけ保つ低次元埋め込み」となります。 PCA の「分散最大化」と数学的構造はそっくりですが、 距離が euclidean ではなく測地距離になっている点が本質的に異なります。
古典的な「スイスロール」データセットは多様体学習の威力を示す象徴例です:3 次元空間に巻物状に巻かれたシートを「広げて」2 次元の平面に戻す。
SSDSE-B-2026 の 47 県データもこれと似た構造を持ちます:人口規模で巻物のように伸びる多様体上に、 産業構成・年齢構成という 2 次元の局所変動が乗っている、 という見立てです。 これを 2 次元化することで「県の本質的な近さ」が浮き上がります。
統計データ解析コンペティションの研究テーマで多様体学習が活きるシーンは以下の通り:
逆にやってはいけないのは「t-SNE のクラスタ数を予測モデルの精度の根拠にする」。 t-SNE は決定論的でも分布論的にも保証がない可視化手法であり、 仮説生成のツールに留めるべきです。
sklearn.manifold モジュール ―― 全主要手法を統一インタフェースで提供。ここまでのセクション(スイスロールの比喩・perplexity 実測・FAQ・落とし穴)と重複しない切り口だけを、 直感 → 落とし穴 → 発展の順に短く補います。 数値を伴う例はすべて架空/合成であることを明記し、 実測は上の「🧮 実値で計算してみる」の SSDSE-B-2026 の数値のみを根拠とします。
地球儀の表面は、 3 次元空間に埋め込まれた2 次元の曲がった多様体です。 これを平らな紙(2 次元)に写すのが世界地図ですが、 どんな図法も何かを必ず犠牲にします。 メルカトル図法は「角度・局所的な形」を保つ代わりに面積を激しく歪め(グリーンランドがアフリカ並みに巨大に見える)、 正積図法は面積を保つ代わりに形が歪みます。 全部を同時に保つ平面地図は数学的に作れません(曲率が違うため)。
transform() など)は「学習済みの多様体に後から点を載せる」ための道具立てで、 逐次的に増える運用データを扱うときに不可欠な観点です。 逆変換(低次元→高次元の復元)が要るならオートエンコーダ系が候補になります。上の「地図図法」「トポロジー」「out-of-sample」の観点から、 次の実在ページを併読すると理解が立体的になります:PCA(影を落とす平行投影=線形の対極)/Isomap(測地距離を保つ「正積型」)/LLE(局所線形再構成)/t-SNE・UMAP(近傍保存=「メルカトル型」)/カーネル PCA(カーネルで非線形化)/次元削減(上位概念・次元の呪い)/多次元分析。 なお Diffusion Maps・Nyström 近似・TwoNN は本用語集に単独ページが無いため、 本セクションのテキスト説明に留めています。
この用語を使うときに初学者が踏みやすい失敗パターン。 1 度経験してしまえば次から避けられますが、 先に知っておくに越したことはありません。
この用語を実務で使うときにつまずきやすい点を、 失敗パターン別に整理しました。 1 度経験すれば回避できるものばかりですが、 先に知っておくと事故が大幅に減ります。
StandardScaler で標準化、 (2) PCA で 30〜50 次元に圧縮(高次元の隣接探索を高速化)、 (3) random_state=42 固定、 (4) perplexity を 5/15/30 で 3 枚描いて安定性確認、 (5) 軸目盛りは非表示にし「距離は読まない」と明示。 これだけで論文掲載レベルの再現性が確保できる。
多様体学習 はデータサイエンスの大きな体系の中で、 「前提となる基礎」と「発展先」を持ちます。 自分が今どこにいて、 次にどこへ進めば良いかが見えるマップ。
📚 次元削減(高次元データを少数の意味ある軸に圧縮)
┗ 線形手法(PCA・SVD・因子分析)
┗ 多様体学習(このページ・非線形)
┗ 距離保存系(Isomap・MDS・LLE)
┗ 確率埋め込み系(t-SNE・UMAP)
┗ 応用:可視化・クラスタリング前処理・特徴抽出
概念マップ全体は こちら から閲覧できます。
多様体学習は単独で結論を出すより、 上流のスケーリング、 並列の PCA / t-SNE / UMAP、 下流のクラスタリング (HDBSCAN) や可視化と組み合わせて使う。 局所構造を保つ手法 (LLE / Isomap / UMAP) と大域構造保持 (MDS / PCA) を併用して比較するのが安全。
SSDSE-B-2026 の 35 列 × 47 県データを 2 次元に落としたい場合、 上流で各列を Z-score 標準化、 中段で UMAP (n_neighbors=15, min_dist=0.1)、 下流で結果を散布図にして地域クラスタを目視確認、 さらに HDBSCAN で自動クラスタ化する、 という流れが現場の標準。
多様体学習の手法選択は、 (1) 局所構造重視か大域構造重視か、 (2) サンプル数 n、 (3) 新規データに対する射影 (out-of-sample) の必要性、 で判断する。 SSDSE-B-2026 のように n=47 と小さい場合は局所手法より大域手法が安定。
SSDSE-B-2026 の 35 列 × 47 県データなら n=47 と少ないので UMAP の n_neighbors を 5〜15 と小さめにし、 局所構造を強調しすぎない設定が安全。 比較のために PCA も並行で実行し、 PC1-PC2 と UMAP1-UMAP2 で得られるクラスタが一致するか確認する。 一致すれば構造は線形的、 大きく異なれば非線形構造の存在を示唆する。