Main Content

tsne

t 分布型確率的近傍埋め込み

説明

Y = tsne(X) は、X の高次元の行の 2 次元埋め込みの行列を返します。

Y = tsne(X,Name,Value) は、1 つ以上の名前と値のペアの引数によって指定されたオプションを使用して、埋め込みを修正します。

[Y,loss] = tsne(___) は、任意の入力引数について、データ X とその埋め込み Y をモデル化する同時分布の間のカルバック・ライブラー ダイバージェンスも返します。

すべて折りたたむ

フィッシャーのアヤメのデータ セットには、アヤメの 4 次元測定値および対応する種への分類が格納されています。tsne を使用して次元を削減することにより、このデータを可視化します。

load fisheriris
rng default % for reproducibility
Y = tsne(meas);
gscatter(Y(:,1),Y(:,2),species)

Figure contains an axes object. The axes object contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent setosa, versicolor, virginica.

各種の距離計量を使用して、フィッシャーのアヤメのデータにおける種の分離をより良好にします。

load fisheriris

rng('default') % for reproducibility
Y = tsne(meas,'Algorithm','exact','Distance','mahalanobis');
subplot(2,2,1)
gscatter(Y(:,1),Y(:,2),species)
title('Mahalanobis')

rng('default') % for fair comparison
Y = tsne(meas,'Algorithm','exact','Distance','cosine');
subplot(2,2,2)
gscatter(Y(:,1),Y(:,2),species)
title('Cosine')

rng('default') % for fair comparison
Y = tsne(meas,'Algorithm','exact','Distance','chebychev');
subplot(2,2,3)
gscatter(Y(:,1),Y(:,2),species)
title('Chebychev')

rng('default') % for fair comparison
Y = tsne(meas,'Algorithm','exact','Distance','euclidean');
subplot(2,2,4)
gscatter(Y(:,1),Y(:,2),species)
title('Euclidean')

Figure contains 4 axes objects. Axes object 1 with title Mahalanobis contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent setosa, versicolor, virginica. Axes object 2 with title Cosine contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent setosa, versicolor, virginica. Axes object 3 with title Chebychev contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent setosa, versicolor, virginica. Axes object 4 with title Euclidean contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent setosa, versicolor, virginica.

この場合、コサイン、チェビシェフおよびユークリッド距離計量でクラスターが適切に分離されています。しかし、マハラノビス距離計量では適切に分離されません。

tsne は、NaN エントリが含まれている入力データ行を削除します。したがって、プロットを行う前に、このような行を分類データから削除しなければなりません。

たとえば、フィッシャーのアヤメのデータでいくつかのランダムなエントリを NaN に変更します。

load fisheriris
rng default % for reproducibility
meas(rand(size(meas)) < 0.05) = NaN;

tsne を使用して、4 次元データを 2 次元に埋め込みます。

Y = tsne(meas,'Algorithm','exact');
Warning: Rows with NaN missing values in X or 'InitialY' values are removed.

埋め込みから除去された行数を調べます。

length(species)-length(Y)
ans = 22

NaN 値が含まれていない meas の行を特定することにより、結果のプロットを準備します。

goodrows = not(any(isnan(meas),2));

NaN 値が含まれていない meas の行に対応する species の行のみを使用して、結果をプロットします。

gscatter(Y(:,1),Y(:,2),species(goodrows))

Figure contains an axes object. The axes object contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent setosa, versicolor, virginica.

フィッシャーのアヤメのデータについて 2 次元と 3 次元の両方の埋め込みを求め、各埋め込みの損失を比較します。3 次元の埋め込みの方が、元のデータに一致する自由度が大きいので、損失が小さくなると考えられます。

load fisheriris
rng default % for reproducibility
[Y,loss] = tsne(meas,'Algorithm','exact');
rng default % for fair comparison
[Y2,loss2] = tsne(meas,'Algorithm','exact','NumDimensions',3);
fprintf('2-D embedding has loss %g, and 3-D embedding has loss %g.\n',loss,loss2)
2-D embedding has loss 0.12929, and 3-D embedding has loss 0.0992412.

予想どおり、3 次元の埋め込みの方が損失が小さくなっています。

埋め込みを表示します。RGB カラー [1 0 0][0 1 0] および [0 0 1] を使用します。

3 次元プロットに categorical コマンドを使用して種を数値に変換してから、次のように関数 sparse を使用して数値を RGB カラーに変換します。v が正の整数 1、2 または 3 から成るベクトルで種のデータに対応する場合、以下のコマンド

sparse(1:numel(v),v,ones(size(v)))

は、行が種の RGB カラーであるスパース行列になります。

gscatter(Y(:,1),Y(:,2),species,eye(3))
title('2-D Embedding')

Figure contains an axes object. The axes object with title 2-D Embedding contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent setosa, versicolor, virginica.

figure
v = double(categorical(species));
c = full(sparse(1:numel(v),v,ones(size(v)),numel(v),3));
scatter3(Y2(:,1),Y2(:,2),Y2(:,3),15,c,'filled')
title('3-D Embedding')
view(-50,8)

Figure contains an axes object. The axes object with title 3-D Embedding contains an object of type scatter.

入力引数

すべて折りたたむ

データ点。nm 列の行列を指定します。各行は 1 つの m 次元の点です。

tsne は、埋め込みを作成する前に、NaN 値が含まれている行を X から削除します。NaN 入力データと結果のプロットを参照してください。

データ型: single | double

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

例: Y = tsne(X,'Algorithm','Exact','NumPCAComponents',50)

アルゴリズムの制御

すべて折りたたむ

tsne アルゴリズム。'barneshut' または 'exact' を指定します。'exact' アルゴリズムは、元の空間と埋め込まれた空間の間の分布のカルバック・ライブラー ダイバージェンスを最適化します。'barneshut' アルゴリズムは、データの行数が多い場合に近似最適化をより高速に実行し、メモリ使用量を削減します。

メモ

'barneshut' アルゴリズムの場合、tsneknnsearch を使用して最近傍を求めます。

例: 'exact'

メガバイト単位のグラム行列のサイズ。正のスカラーまたは "maximal" として指定します。関数 tsneCacheSize を使用できるのは、名前と値の引数 Distancefast で始まる場合のみです。

CacheSize"maximal" に設定すると、tsne は、MM 列のサイズの中間行列全体に十分なメモリを割り当てようと試みます。ここで、M は入力データ X の行数です。キャッシュ サイズは、中間行列全体に対して十分な大きさである必要はありませんが、少なくとも M 行 1 列のベクトルを保持する十分な大きさでなければなりません。そうでない場合、tsne でのユークリッド距離の計算に標準のアルゴリズムが使用されます。

引数 Distance の値が fast で始まる場合に、CacheSize の値が大きすぎるか "maximal" であると、利用可能なメモリを超えるグラム行列の割り当てが tsne で試行されることがあります。この場合、MATLAB® はエラーを生成します。

例: CacheSize="maximal"

データ型: double | char | string

距離計量。次のいずれかとして指定します。

  • 'euclidean' — ユークリッド距離。

  • 'seuclidean' — 標準化されたユークリッド距離。X の行とクエリ行列の行の間の各座標差は、S = std(X,'omitnan') から算出される標準偏差の対応する要素で除算することによりスケーリングされます。

  • 'fasteuclidean' — 予測子の数が 10 個以上の場合に時間の短縮になる代替アルゴリズムを使用して計算されるユークリッド距離。このアルゴリズムは高速ですが、場合によっては精度が低下することがあります。'fast' から始まるアルゴリズムでは、スパース データはサポートされません。詳細については、アルゴリズムを参照してください。

  • 'fastseuclidean' — 予測子の数が 10 個以上の場合に時間の短縮になる代替アルゴリズムを使用して計算される標準化されたユークリッド距離。このアルゴリズムは高速ですが、場合によっては精度が低下することがあります。'fast' から始まるアルゴリズムでは、スパース データはサポートされません。詳細については、アルゴリズムを参照してください。

  • 'cityblock' — 市街地距離。

  • 'chebychev' — チェビシェフ距離。これは最大座標差です。

  • 'minkowski' — 指数 2 のミンコフスキー距離。この距離はユークリッド距離と同じです。

  • 'mahalanobis' — 正定値共分散行列 cov(X,'omitrows') を使用して計算されたマハラノビス距離。

  • 'cosine' — 1 から、ベクトルとして扱われる観測間の夾角の余弦を引きます。

  • 'correlation' — 1 から、一連の値として扱われる観測間の標本線形相関係数を引きます。

  • 'spearman' — 1 から、一連の値として扱われる観測間の標本スピアマン順位相関係数を引きます。

  • 'hamming' — ハミング距離。異なる座標の比率です。

  • 'jaccard' — 1 からジャカード係数 (異なる非ゼロ座標の比率) を引きます。

  • カスタム距離関数 — @ を使用して指定された距離関数 (@distfun など)。詳細は、詳細を参照してください。

どの場合も、tsne はペアワイズ距離の二乗を使用して X の同時分布におけるガウス カーネルを計算します。

例: 'mahalanobis'

データ型: char | string | function_handle

データ内の自然なクラスターのサイズ。1 以上のスカラー値を指定します。

強調が大きくなると、tsne が学習する Y の結合確率が大きくなり、Y のクラスター間に比較的大きい空間が作成されます。tsne は、最初の 99 回の最適化反復で強調を使用します。

最適化の初期段階でカルバック・ライブラー ダイバージェンスの値が増加する場合は、強調を小さくしてください。tsne の設定を参照してください。

例: 10

データ型: single | double

出力 Y の次元。正の整数を指定します。通常は、NumDimensions2 または 3 に設定します。

例: 3

データ型: single | double

PCA の次元削減。非負の整数を指定します。tsne は、高次元データを埋め込む前に、関数 pca を使用してデータの次元を NumPCAComponents に削減します。NumPCAComponents0 の場合、tsne は PCA を使用しません。

例: 50

データ型: single | double

各点の局所的近傍の有効数。正のスカラーを指定します。t-SNE アルゴリズムを参照してください。

パープレキシティが大きくなると、tsne はより多くの点を最近傍として使用します。データセットが大きい場合は、Perplexity の値を大きくします。一般的な Perplexity の値の範囲は、550 です。Barnes-Hut アルゴリズムでは、tsne は最近傍の個数として min(3*Perplexity,N-1) を使用します。tsne の設定を参照してください。

例: 10

データ型: single | double

入力データを正規化するフラグ。false または true として指定します。値が true の場合、tsneX の各列について、平均を減算することでセンタリングしてから、標準偏差で除算することでスケーリングします。

スケールが異なる特徴量が X に含まれている場合は、'Standardize'true に設定します。学習プロセスは最近傍を基本とすることから、スケールの大きい特徴量がスケールの小さい特徴量の寄与を無効化する可能性があります。

例: true

データ型: logical

最適化の制御

すべて折りたたむ

初期の埋め込み点。nNumDimensions 列の実数行列を指定します。nX の行数です。tsne の最適化アルゴリズムでは、これらの点を初期値として使用します。

データ型: single | double

最適化プロセスの学習率。正のスカラーを指定します。通常は、1001000 の値を設定します。

LearnRate が小さすぎる場合、適切ではない局所的最小値に tsne が収束する可能性があります。LearnRate が大きすぎる場合、最適化の初期段階でカルバック・ライブラー ダイバージェンスが減少するのではなく増加する可能性があります。tsne の設定を参照してください。

例: 1000

データ型: single | double

反復表示の頻度。正の整数を指定します。名前と値のペア Verbose0 ではない場合、tsne は反復が NumPrint 回行われるたびに反復表示を返します。名前と値のペア Options に空ではない 'OutputFcn' エントリが含まれている場合、反復が NumPrint 回行われるたびに出力関数が実行されます。

例: 20

データ型: single | double

最適化オプション。'MaxIter''OutputFcn' および 'TolFun' というフィールドが含まれている構造体を指定します。statset または struct を使用して、'Options' を作成します。

  • 'MaxIter' — 最適化反復の最大回数を指定する正の整数。既定の設定: 1000

  • 'OutputFcn'NumPrint 回の最適化反復ごとに呼び出す関数を 1 つ以上指定する関数ハンドルまたはその cell 配列。構文の詳細は、t-SNE の出力関数 を参照してください。既定の設定: []

  • 'TolFun' — 最適化の停止条件。カルバック・ライブラー ダイバージェンスの勾配のノルムが 'TolFun' より小さくなると、最適化が終了します。既定の設定: 1e-10

例: options = statset('MaxIter',500)

データ型: struct

Barnes-Hut のトレードオフ パラメーター。0 ~ 1 のスカラーを指定します。値を大きくすると最適化が高速になりますが、精度は低下します。Algorithm'barneshut' の場合のみ適用されます。

例: 0.1

データ型: single | double

反復表示。01 または 2 を指定します。Verbose0 ではない場合、tsne はカルバック・ライブラー ダイバージェンスおよびその勾配のノルムの概要テーブルを NumPrint 回の反復ごとに出力します。

Verbose2 の場合、tsne はガウス カーネルの分散も出力します。tsne は、これらのカーネルを X の結合分布の計算で使用します。最小の分散と最大の分散でスケールが大きく異なる場合、X を再スケーリングすると結果がより適切になる可能性があります。

例: 2

データ型: single | double

出力引数

すべて折りたたむ

埋め込み点。nNumDimensions 列の行列として返されます。各行は 1 つの埋め込み点を表します。n は、データ XNaN エントリが含まれていない行の数です。NaN 入力データと結果のプロットを参照してください。

モデル化された入力分布と出力分布の間のカルバック・ライブラー ダイバージェンス。非負のスカラーとして返されます。詳細は、t-SNE アルゴリズムを参照してください。

詳細

すべて折りたたむ

カスタム距離関数

カスタム距離関数の構文は次のとおりです。

function D2 = distfun(ZI,ZJ)

tsneZIZJ をカスタム関数に渡し、カスタム関数が距離を計算します。

  • ZI は、X または Y の 1 行が含まれている 1 行 n 列のベクトルです。

  • ZJ は複数行の X または Y を含む m 行 n 列の行列です。

カスタム関数では、m 行 1 列の距離のベクトル D2 を返します。D2 の j 番目の要素は、観測値 ZI および ZJ(j,:) の間の距離です。

ヒント

データがスパースではない場合、組み込みの距離関数の方が関数ハンドルより高速です。

アルゴリズム

すべて折りたたむ

tsne は、相対的な類似度が元の高次元点の類似度に似ている一連の埋め込み点を低次元空間内に構築します。埋め込み点は、元のデータのクラスタリングを示します。

大まかに説明すると、このアルゴリズムは、元の点がガウス分布に由来し、埋め込み点がスチューデントの t 分布に由来するとしてそれぞれをモデル化します。そして、埋め込み点を移動することにより、これらの 2 つの分布の間におけるカルバック・ライブラー ダイバージェンスを最小化しようとします。

詳細は、t-SNEを参照してください。

高速ユークリッド距離アルゴリズム

Distance 引数の fast から始まる値 ('fasteuclidean''fastseuclidean' など) で使用されるアルゴリズムでは、計算時間の短縮のために追加のメモリを使用してユークリッド距離が計算されます。このアルゴリズムは、Albanie の[1]などで "ユークリッド距離行列トリック" として提唱されているものです。内部テストでは、このアルゴリズムによって予測子の数が 10 個以上の場合に時間の短縮になることが確認されています。'fast' から始まるアルゴリズムでは、スパース データはサポートされません。

このアルゴリズムでは、xi と xj のすべての点間の距離の行列 D を求めるために (xi のそれぞれに n 個の変数を格納)、次の方程式の最後の行を使用して距離を計算します。

Di,j2=xixj2=(xixj)T(xixj)=xi22xiTxj+xj2.

方程式の最後の行にある行列 xiTxj"グラム行列" と呼ばれます。正方化と加算によって平方距離を計算する代わりに、グラム行列を計算して使用すると、一連の平方距離の計算は高速になりますが、数値的安定性は少し低くなります。詳細については、Albanie の[1]を参照してください。

グラム行列を格納するためにソフトウェアで既定で使用されるキャッシュのサイズは 1e3 メガバイトです。キャッシュ サイズは名前と値の引数 CacheSize を使用して設定できます。CacheSize の値が大きすぎるか "maximal" である場合、利用可能なメモリを超えるグラム行列の割り当てが tsne で試行されることがあります。この場合、MATLAB はエラーを生成します。

参照

[1] Albanie, Samuel. Euclidean Distance Matrix Trick. June, 2019. Available at https://www.robots.ox.ac.uk/%7Ealbanie/notes/Euclidean_distance_trick.pdf.

バージョン履歴

R2017a で導入

すべて展開する