複雑さを解き明かす:ノイズ導入を用いたマニフォールド学習への革新的アプローチ

美容とファッションの専門家がお教えする:美しさを引き立てるファッションアイテムの選び方

データサイエンスの世界では、高次元データは課題とチャンスの両方を提供します。それによって形成や変換が可能な関係やパターンの宝庫が提供されますが、注意深くクリーニングや選択を行わないと、解析や結論の導出が困難になることがあります。「次元の呪い」とも言われます。直感的には、主成分分析(PCA)を使用してデータをより小さな部分空間に埋め込むことが多いですが、それによって問題がさらに困難になる場合もあり、非線形埋め込み技術がより適切な選択肢となることがあります。ただし、適切な非線形技術を選択する際には注意が必要です。誤った選択は、過適合された埋め込みや単に使用に適さない埋め込みにつながる可能性があります。本記事では、高次元データ内の多様体を理解するための新しいアプローチについて議論し、私たちデータサイエンティストが複雑なデータの基礎的な構造に関して的確な定量的な意思決定を行うことができるようにします。

まず、多様体学習とは何か、そして4つの人気のある線形および非線形埋め込み技術の概要を高レベルで具体的に説明します。これにより、各場合で行われる仮定とそれが埋め込みに与える影響についての深い理解を得ることができます。また、ノイズ注入解析アプローチを使用した多様体の評価方法や、推論の種類についても、Pythonの例を示します。本記事の終わりには、異なる多様体学習技術と、データ内の基礎的な構造を真に理解するために取ることのできる手順について十分な理解を得ることができます。

多様体学習

これらの多様体学習技術に飛び込む前に、まず多様体とは何かについて説明することが重要です。我々の文脈では、多様体は高次元空間の構造の近くの他のデータポイントとの局所的および/またはグローバルな関係の近似表現です。ただし、我々は真の構造を事前に知ることができず、データを埋め込む際にデータポイント間の関係について暗黙のうちに仮定することがしばしばあります。数学の多様体学習(リーマン幾何学)とは異なり、1つの空間から別の空間への明示的なマッピングを見つけることが可能です。

機械学習モデルの成功は、パフォーマンスとデータドリブンの洞察において、基本的には渡すデータに依存しています。より多くの情報を渡すことで、これらのアルゴリズムはより複雑な関係とパターンを見つけることができる一方、ノイズや外れ値に対して過学習する結果になりがちな問題を引き起こします。また、大規模かつ複雑な特徴空間では、いくつかの領域がまばらすぎてモデル化が難しいか、または集中しすぎて重要な情報が隠されることが少なくありません。さらに、特徴量の数が増えるにつれて、多くの機械学習アルゴリズムはスケーリングの面でうまく機能しなくなり、モデルの訓練時に増加する計算時間やメモリの需要を引き起こします。

これらの問題を克服するためには、検討する特徴量の数を減らすか、データをできるだけキープしながら低次元空間にマッピングする必要があります。次のセクションでは、異なる手法(線形および非線形)の要点をまとめ、探求します。

主成分分析

主成分分析(PCA)は、データセットの埋め込みや次元削減のための最も有名な手法の一つです。その統計的なアプローチから推論される説明可能性に基づくと考えられています。このアルゴリズムについては、オンラインでさらに深く掘り下げた記事がたくさん見つかるでしょうが、本記事では以下に主要な手順を概説しています。

主な要点は、PCAが線形多様体を仮定し、データを元の特徴量の線形組み合わせであるN個の直交主成分にマッピングすることで、すべてのデータポイント間の関係を保持しようとするということです。このため、まずデータを標準化し、平均を中心にして適切にスケーリングすることで、すべての変数に対して分散が一貫したものになります。

ここで、Xⱼはすべての特徴量jの元の特徴空間Xであり、μとσはそれぞれXⱼの平均と標準偏差です。次に、アルゴリズムは標準化されたデータの共分散行列Sを計算します。

各変数が他の変数とどのように相関するかを表現します。PCAは共分散行列の固有分解を行って固有値λᵢと固有ベクトルvᵢを決定します。

これらの固有ベクトルによって定義される行列Wは、固有値の減少順に並べられます。変換されたデータの最終的な射影Yは、単にZとWの積です。

要約すると、PCAは分散を最も保存し説明する方法でデータの内部構造を明らかにする手段を提供します(つまり、最小限の次元で情報を最大化します)。各固有値は分散の割合に比例し、そのため、行列Wは最初の射影された主成分に最も多くの分散を含み、その後の直交成分には少し小さい分数が含まれるように強制されます。

ローカルリニア埋め込み

より高度な非線型手法に進む前に、おそらく最も理解しやすいとされるローカルリニア埋め込み(LLE)から始めましょう。基本的に、LLEは与えられたデータ点とその近傍がお互いの線形結合であるということを前提とし、多様体上の線形接線平面に近似的に表現され、マップされることを仮定します。近傍クラスターを平面にマップする重みは、変換の誤差を最小化するために調整され、このプロセスは各データ点に対して繰り返されます。したがって、データポイントの近傍には局所的な線形性がありますが、非線形性はグローバルに捕捉されます。

データサイエンティストとして、注意深くチューニングが必要な最も近い近傍の数kを定義する必要があります。この値を手に入れたら、最初の最適化問題は、各データ点Xᵢを近傍の平面に線形組み合わせとしてマップする重み配列Wᵢⱼを解決することです:

制約条件により、各iに対して以下の制約が行われます:

これにより、重みが1に合計されて局所的な幾何学が保存されることが保証されます。ここから、埋め込みYᵢは、これらの重みと元の空間Xᵢの単純な積です。同時に以下の埋め込みコスト関数が最小化されるようにします。

上記は、低次元表現が元の空間で局所的な重みを最もよく保存することを保証します。非線形関係を捉えるための非常に優れた解決策ですが、kの値が適切にチューニングされていない場合や、N次元空間の一部が希薄な場合、埋め込みが破損するリスクがあります。次に、最終的な埋め込みを形成するためにローカルとグローバルの関係の組み合わせを使用する他の非線形埋め込み手法を探求します。これによって、ほとんどの場合、より堅牢な結果が得られます。

スペクトラル埋め込み

スペクトラル埋め込み(SE)またはラプラシアン固有マップ埋め込みとも呼ばれる手法は、全てのデータポイントを結びつける類似性グラフを形成し、点間のスペクトラル類似性に基づいてそれぞれに重みを付けます。これにより、SEはLLEと同様に局所的な関係を保存するだけでなく、連結グラフがグローバルな関係も考慮に入れることを保証します。グラフラプラシアンで観察されるスペクトル特性への依存性により、このアルゴリズムは他の手法が特定できない複雑な非線形構造を明らかにすることができます。

このアルゴリズムの最初のステップは、グラフを構築することです:

ここで、Wᵢⱼはノードiとjのエッジの幅であり、σは幅を制御するカスタマイズ可能なパラメータです。これにより、グラフラプラシアン行列LはL=D-Wとして定義されます。ここで、Wはグラフの隣接行列であり、Dは以下のエントリを持つ対角度行列です:

最終の埋め込みに直交性と中央制約を適用することで、アルゴリズムはラプラシアン行列の固有値分解を行い、データを適切に埋め込むための固有値と固有ベクトルを特定します。

等面性特徴マッピング

次に取り上げる非線形多様体技術は、等面性特徴マッピング(ISOMAP)です。このパワフルな非線形埋め込み方法は、上記で述べた方法よりもわずかにカスタマイズ性が高いものです。このアルゴリズムは、高次元空間を接続された近傍グラフによって表現できると仮定し、ノード間の距離が測地線であるとします。その後、多次元尺度法(MDS)を適用してデータの低次元表現を見つけます。この低次元表現では、ノード間のペアごとの距離が可能な限り保持されるようになっています。

グラフを構築する際には、最も近い近傍点の数や、データ点とその近傍点の相対ユークリッド距離の制限を選択することができます。これらの制約は適切に調整する必要があります。たとえば、ショートカットエッジが形成されないようにあまり大きすぎないように、つまりキーとなる構造情報が欠落しないようにする必要があります。また、連結グラフを作成するのにあまりに小さすぎないようにする必要もあります。これらの近傍条件が満たされていれば、2つのノード間にエッジが確立されます。グラフGがある場合、アルゴリズムは最短パスアルゴリズム(Dijkstra法やFloyd法など)を使用して、すべての点の間の測地距離Dᵢⱼを計算します:

最後のステップは、データを部分空間にマッピングすることで、これにはDᵢⱼにMDSを適用します。PCAの概要で述べたように、固有値分解の前に共分散行列を評価することになります。MDSは若干異なり、中心化行列Hに対するグラム行列Bを計算します:

ここで、eは1のベクトルであり、nはデータ点の数です。最終的な埋め込みは、最大の固有値に対応するd個の固有ベクトルから得られます:

ノイズの注入

ここまでは、低次元空間にデータを埋め込むための線形および非線形方法の選択について説明しました。しかし、特に視覚化できない高次元データを扱う場合、どの方法が有用な情報を捉えているかをどのように知るのでしょうか。数量的な観点から埋め込み技術の性能を判断するためのアプローチの一つは、ノイズ注入と呼ばれる手法を使用することです。この手法では、元の空間にさまざまな量のノイズを加え、そのノイズが埋め込みに与える影響を監視します。基本的な原則は、元の空間におけるノイズ(歪み)の量が増加するにつれて、任意の多様体学習アルゴリズムが真の基本構造を捉えるのに失敗する点が訪れるというものです。ノイズの量が変化するにつれて埋め込みにどのように反応するかを観察することで、各技術がデータセットの基本構造をどれだけモデル化しているかを簡単に特定することができます。以下に、この分析を行うためのステップバイステップの要約と、アイデアを具体化するための2つのPythonの例を示します:

  1. 元のデータセットにガウスノイズを追加した代替データセットを生成し、その後の代替データセットごとに分散をスケーリングします。
  2. これらのデータセットをマニフォールド学習の異なる手法を使用して埋め込みます。
  3. 各手法について、ノイズ注入された埋め込みと元の空間(合成のノイズなし)の埋め込みを、形状を比較するための一般的な統計的手法であるプロクラステス解析を使用して比較します。この評価方法では、1つの空間を回転、スケール、平行移動させて、各データ点間の二乗距離の総和を最小化することを目指します。この差は類似性の尺度であり、埋め込み方法がノイズに対してどのようにパフォーマンスを発揮するかを分析するために検討されます。
  4. 最後のステップは、プロクラステス距離の変化を合成追加ノイズのスケールに対してプロットし、各手法のパフォーマンスについての結論を導くことです。

上記の手順をクラシックなSカーブデータセットに適用しましょう:

import matplotlib.pyplot as plt
from sklearn import manifold, datasets
import numpy as np
from scipy.spatial import procrustes
from sklearn.decomposition import PCA

def compute_procrustes_distances(data, embedding_technique, max_noise, noise_step=0.05):
    """
    ガウシアンノイズレベルの範囲でプロクルステス距離を計算します。
    パラメータ:
        data(np.array):元のデータセット。
        embedding_technique(object):マニフォールド学習のテクニックのインスタンス。
        max_noise(float):追加するノイズの最大レベル。
        noise_step(float):ノイズの増加に対するインクリメンタルステップ。
    戻り値:
        list:各ノイズレベルのプロクルステス距離のリスト。
    """
    base_embedding = embedding_technique.fit_transform(data)
    noise_levels = np.arange(0, max_noise, noise_step)
    distances = []
    for noise in noise_levels:
        noisy_data = data + np.random.normal(-noise, noise, data.shape)
        noisy_embedding = embedding_technique.fit_transform(noisy_data)
        _, _, disparity = procrustes(base_embedding, noisy_embedding)
        distances.append(disparity)
    return distances

def plot_data(X, colour):
    """
    データセットを3Dでプロットします。
    パラメータ:
        X(np.array):データポイント。
        colour(np.array):データポイントの色マッピング。
    """
    fig = plt.figure(figsize=(30, 10))
    ax = fig.add_subplot(111, projection='3d')
    ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=colour, cmap=plt.cm.Spectral)
    ax.view_init(4, -72)
    plt.show()

def plot_procrustes_distances(noise_range, distances, labels):
    """
    異なる埋め込み技術のプロクルステス距離をプロットします。
    パラメータ:
        noise_range(np.array):ノイズレベルの範囲。
        distances(dict):各埋め込み技術の距離のディクショナリ。
        labels(list):各埋め込み技術のラベルのリスト。
    """
    plt.figure(figsize=(10, 6))
    for label in labels:
        plt.plot(noise_range, distances[label], label=label)
    plt.xlabel('ノイズの範囲')
    plt.ylabel('プロクルステス距離')
    plt.title('埋め込み技術の比較')
    plt.legend()
    plt.show()

# Sカーブデータセットの生成とプロット
X, colour = datasets.make_s_curve(1000, random_state=0)
plot_data(X, colour)

# 異なる埋め込み技術のプロクルステス距離を計算
max_noise = 2
noise_range = np.arange(0, max_noise, 0.05)
embedding_techniques = {
    "PCA": PCA(2),
    "ISOMAP": manifold.Isomap(n_components=2),
    "LLE": manifold.LocallyLinearEmbedding(n_neighbors=10, n_components=2),
    "SE": manifold.SpectralEmbedding(n_components=2, n_neighbors=10)
}
distances = {label: compute_procrustes_distances(X, technique, max_noise) for label, technique in embedding_techniques.items()}

# 計算されたプロクルステス距離をプロット
plot_procrustes_distances(noise_range, distances, embedding_techniques.keys())

もちろん、実際の世界の応用では、このダミーの例と同様に真の構造に関する情報は得られませんが、今は真の構造を知らないと仮定しましょう。上記のグラフから何を導き出すことができるでしょうか?基本的に、良い傾向はシグモイド曲線に似たものであり、最初には少量のノイズに対して非常に似た埋め込みがあるが、ある臨界点が訪れると、ノイズが真の構造を断片化するため、プロクルステス距離が急激に増加することが期待されます。この時点で、ノイズをほとんど意味のない情報として捉える、直後の埋め込みが予想されます。これを考慮し、上記のグラフを踏まえると、次のようにまとめることができます:

PCA:プロクルステス距離はノイズと共に増加しますが、傾向はかなり直線的であり、真の構造の十分な情報を捉えていない可能性があります。他のトレンドを考慮せずに、これだけでも非線形の埋め込みが必要であることを強く示しています。

LLE:わずかなノイズでも非常に少ない弾力性しか見られず、これはローカル直線性の主要な仮定の違反によるものである可能性が高いです。近傍数kを増やすと、埋め込みの脆弱性が低減する可能性がありますが、その結果の部分空間での詳細(情報)の欠失というコストが発生するかもしれません。

ISOMAP:最初はこの埋め込み技術のパフォーマンスは問題ありませんが、ノイズが増えるにつれて、情報の不足が明らかになります(ノイズレベル: 0.25の線形トレンド)。

SE:探索したすべての方法の中で、SEが最も優れたパフォーマンスを発揮しますが、最適なフィットを得るには調整が必要です。

全体的に、データの構造が非線形多様体に存在しており、その非線形性はSEとISOMAPで比較的うまく捉えられていることが明らかです。これを考慮すると、LLEからのパフォーマンスの低さからも、元の空間で多様体の著しい曲率を推測することができます。別の例でこれを探求してみましょう:

# Sカーブデータセットの生成とプロットX、color = datasets.make_swiss_roll(1000, random_state=0)plot_data(X, color)# 異なる埋め込み技術のプロクラステス距離の計算max_noise = 4noise_range = np.arange(0, max_noise, 0.05)embedding_techniques = {    "PCA": PCA(2),    "ISOMAP": manifold.Isomap(n_components=2),    "LLE": manifold.LocallyLinearEmbedding(n_neighbors=10, n_components=2),    "SE": manifold.SpectralEmbedding(n_components=2, n_neighbors=10)}distances = {label: compute_procrustes_distances(X, technique, max_noise) for label, technique in embedding_techniques.items()}# 計算されたプロクラステス距離のプロットplot_procrustes_distances(noise_range, distances, embedding_techniques.keys())

前述の関数を使用して、各埋め込み技術のプロクラステス距離の傾向を得ました。はっきりとした非線形構造がこのデータ内にあることがわかります。PCAが基本的な構造を捉えるのに苦労している様子も明らかです。元の空間全体での一定の非線形性は、LLEのパフォーマンスが悪いことでさらに強調されています。これは、近隣のマッピングが接平面に対して一定ではないためと考えられます。再び、SEとISOMAPのパフォーマンスが良く、後者がノイズにより構造が破損した後により速くプロクラステス距離1に近づく傾向があることがわかります。SEがすべての埋め込みにいくらかのノイズを捉えている可能性があり、パラメータの調整によってこれを修正できるかもしれません。これらのアルゴリズムをチューニングすることで、埋め込まれたデータの一般化とフィットが向上することがあります。上記のISOMAP手法の例を以下に示します:

import numpy as npfrom scipy.spatial import procrustesimport matplotlib.pyplot as pltfrom sklearn import manifold, datasetsdef return_procrustes_distance(data, embedding_technique, max_noise, noise_step=0.05):    """    異なるノイズレベルに対するプロクラステス距離を計算する。    パラメータ:        data(array_like):埋め込む元のデータ。        embedding_technique(object):埋め込み技術(例:PCA、SpectralEmbedding)。        max_noise(float):追加する最大ノイズレベル。        noise_step(float):ノイズレベルの増分ステップ。    戻り値:        list:各ノイズレベルに対するプロクラステス距離のリスト。    """    embeddings = []    distances = []    noise_range = np.arange(0, max_noise, noise_step)    for noise_level in noise_range:        noisy_data = data + np.random.normal(0, noise_level, data.shape)        embedded_data = embedding_technique.fit_transform(noisy_data)        if not embeddings:  # もしembeddingsリストが空なら            embeddings.append(embedded_data)        _, _, disparity = procrustes(embeddings[0], embedded_data)        distances.append(disparity)    return distances# Sカーブデータセットの生成X、_ = datasets.make_swiss_roll(1000, random_state=0)# パラメータmax_noise = 2k_values = [5, 7, 9]  # ISOMAPの異なるk値# 各k値に対するプロクラステス距離の計算とプロットnoise_levels = np.arange(0, max_noise, 0.05)plt.figure(figsize=(10, 6))for k in k_values:    embedding = manifold.Isomap(n_components=2, n_neighbors=k)    procrustes_distances = return_procrustes_distance(X, embedding, max_noise)    plt.plot(noise_levels, procrustes_distances, label=f'ISOMAP (k={k})')plt.xlabel('Noise Level')plt.ylabel('Procrustes Distance')plt.title('Procrustes Distance by Noise Level for Various k in ISOMAP')plt.legend()plt.show()

上記はチューニングの非常に一般的な例であり、他のパラメータを探索したいと思うでしょうが、簡単に k を調整しノイズの影響を観察することで、アルゴリズムがより一般化することがわかります。

結論

この記事では、多様体学習のさまざまなテクニックを探索し、ハイディメンションデータ内の基本的な構造を理解するためにノイズ注入を使用する方法を示しました。各アルゴリズムの動作方法やそれぞれを支える仮定、埋め込みに対するノイズの影響を分析することにより、データを前処理または処理する際のより具体的な意思決定が可能になります。このアプローチは、埋め込みの一般化やノイズや将来のデータのドリフトに対する応答など、より深い理解を提供します。

MLソリューションの一部として埋め込みテクニックを展開する予定がある場合や、探索的データ分析の実行プロセスを拡張する方法を探している場合、上記のアプローチは、任意のハイディメンションデータセット内の隠れた構造をより深く理解するための良い手段となります。

特記がない限り、すべての画像は著者によるものです。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more