このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
tsne
t 分布型確率的近傍埋め込み
説明
例
フィッシャーのアヤメのデータの可視化
フィッシャーのアヤメのデータセットには、アヤメの 4 次元測定値および対応する種への分類が格納されています。tsne
を使用して次元を削減することにより、このデータを可視化します。
load fisheriris rng default % for reproducibility Y = tsne(meas); gscatter(Y(:,1),Y(:,2),species)
距離計量の比較
各種の距離計量を使用して、フィッシャーのアヤメのデータにおける種の分離をより良好にします。
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')
この場合、コサイン、チェビシェフおよびユークリッド距離計量でクラスターが適切に分離されています。しかし、マハラノビス距離計量では適切に分離されません。
NaN
入力データと結果のプロット
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))
t-SNE の損失の比較
フィッシャーのアヤメのデータについて 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.124191, and 3-D embedding has loss 0.0990884.
予想どおり、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 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)
入力引数
X
— データ点
n
行 m
列の行列
データ点。n
行 m
列の行列を指定します。各行は 1 つの m
次元の点です。
tsne
は、埋め込みを作成する前に、NaN
値が含まれている行を X
から削除します。NaN 入力データと結果のプロットを参照してください。
データ型: single
| double
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: Y = tsne(X,'Algorithm','Exact','NumPCAComponents',50)
Algorithm
— tsne
アルゴリズム
'barneshut'
(既定値) | 'exact'
tsne
アルゴリズム。'barneshut'
または 'exact'
を指定します。'exact'
アルゴリズムは、元の空間と埋め込まれた空間の間の分布のカルバック・ライブラー ダイバージェンスを最適化します。'barneshut'
アルゴリズムは、データの行数が多い場合に近似最適化をより高速に実行し、メモリ使用量を削減します。
メモ
'barneshut'
アルゴリズムの場合、tsne
は knnsearch
を使用して最近傍を求めます。
例: 'exact'
CacheSize
— メガバイト単位のグラム行列のサイズ
1e3
(既定値) | 正のスカラー | "maximal"
メガバイト単位のグラム行列のサイズ。正のスカラーまたは "maximal"
として指定します。関数 tsne
で CacheSize
を使用できるのは、名前と値の引数 Distance
が fast
で始まる場合のみです。
CacheSize
を "maximal"
に設定すると、tsne
は、M
行 M
列のサイズの中間行列全体に十分なメモリを割り当てようと試みます。ここで、M
は入力データ X
の行数です。キャッシュ サイズは、中間行列全体に対して十分な大きさである必要はありませんが、少なくとも M
行 1 列のベクトルを保持する十分な大きさでなければなりません。そうでない場合、tsne
でのユークリッド距離の計算に標準のアルゴリズムが使用されます。
引数 Distance
の値が fast
で始まる場合に、CacheSize
の値が大きすぎるか "maximal"
であると、利用可能なメモリを超えるグラム行列の割り当てが tsne
で試行されることがあります。この場合、MATLAB® はエラーを生成します。
例: CacheSize="maximal"
データ型: double
| char
| string
Distance
— 距離計量
'euclidean'
(既定値) | 'seuclidean'
| 'fasteuclidean'
| 'fastseuclidean'
| 'cityblock'
| 'chebychev'
| 'minkowski'
| 'mahalanobis'
| 'cosine'
| 'correlation'
| 'spearman'
| 'hamming'
| 'jaccard'
| 関数ハンドル
距離計量。次のいずれかとして指定します。
'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
NumDimensions
— 出力 Y
の次元
2
(既定値) | 正の整数
NumPCAComponents
— PCA の次元削減
0
(既定値) | 非負の整数
PCA の次元削減。非負の整数を指定します。tsne
は、高次元データを埋め込む前に、関数 pca
を使用してデータの次元を NumPCAComponents
に削減します。NumPCAComponents
が 0
の場合、tsne
は PCA を使用しません。
例: 50
データ型: single
| double
Perplexity
— 各点の局所的近傍の有効数
30
(既定値) | 正のスカラー
各点の局所的近傍の有効数。正のスカラーを指定します。t-SNE アルゴリズムを参照してください。
パープレキシティが大きくなると、tsne
はより多くの点を最近傍として使用します。データセットが大きい場合は、Perplexity
の値を大きくします。一般的な Perplexity
の値の範囲は、5
~ 50
です。Barnes-Hut アルゴリズムでは、tsne
は最近傍の個数として min(3*Perplexity,N-1)
を使用します。tsne の設定を参照してください。
例: 10
データ型: single
| double
Standardize
— 入力データを正規化するフラグ
false
(既定値) | true
入力データを正規化するフラグ。false
または true
として指定します。値が true
の場合、tsne
は X
の各列について、平均を減算することでセンタリングしてから、標準偏差で除算することでスケーリングします。
スケールが異なる特徴量が X
に含まれている場合は、'Standardize'
を true
に設定します。学習プロセスは最近傍を基本とすることから、スケールの大きい特徴量がスケールの小さい特徴量の寄与を無効化する可能性があります。
例: true
データ型: logical
InitialY
— 初期の埋め込み点
1e-4*randn(N,NumDimensions)
(既定値) | n
行 NumDimensions
列の実数行列
初期の埋め込み点。n
行 NumDimensions
列の実数行列を指定します。n
は X
の行数です。tsne
の最適化アルゴリズムでは、これらの点を初期値として使用します。
データ型: single
| double
LearnRate
— 最適化プロセスの学習率
500
(既定値) | 正のスカラー
最適化プロセスの学習率。正のスカラーを指定します。通常は、100
~ 1000
の値を設定します。
LearnRate
が小さすぎる場合、適切ではない局所的最小値に tsne
が収束する可能性があります。LearnRate
が大きすぎる場合、最適化の初期段階でカルバック・ライブラー ダイバージェンスが減少するのではなく増加する可能性があります。tsne の設定を参照してください。
例: 1000
データ型: single
| double
NumPrint
— 反復表示の頻度
20
(既定値) | 正の整数
反復表示の頻度。正の整数を指定します。名前と値のペア Verbose
が 0
ではない場合、tsne
は反復が NumPrint
回行われるたびに反復表示を返します。名前と値のペア Options
に空ではない 'OutputFcn'
エントリが含まれている場合、反復が NumPrint
回行われるたびに出力関数が実行されます。
例: 20
データ型: single
| double
Options
— 最適化オプション
'MaxIter'
、'OutputFcn'
および 'TolFun'
というフィールドが含まれている構造体
最適化オプション。'MaxIter'
、'OutputFcn'
および 'TolFun'
というフィールドが含まれている構造体を指定します。statset
または struct
を使用して、'Options'
を作成します。
'MaxIter'
— 最適化反復の最大回数を指定する正の整数。既定の設定:1000
。'OutputFcn'
—NumPrint
回の最適化反復ごとに呼び出す関数を 1 つ以上指定する関数ハンドルまたはその cell 配列。構文の詳細は、t-SNE の出力関数 を参照してください。既定の設定:[]
。'TolFun'
— 最適化の停止条件。カルバック・ライブラー ダイバージェンスの勾配のノルムが'TolFun'
より小さくなると、最適化が終了します。既定の設定:1e-10
。
例: options = statset('MaxIter',500)
データ型: struct
Theta
— Barnes-Hut のトレードオフ パラメーター
0.5
(既定値) | 0 ~ 1 のスカラー
Barnes-Hut のトレードオフ パラメーター。0 ~ 1 のスカラーを指定します。値を大きくすると最適化が高速になりますが、精度は低下します。Algorithm
が 'barneshut'
の場合のみ適用されます。
例: 0.1
データ型: single
| double
出力引数
Y
— 埋め込み点
n
行 NumDimensions
列の行列
埋め込み点。n
行 NumDimensions
列の行列として返されます。各行は 1 つの埋め込み点を表します。n
は、データ X
の NaN
エントリが含まれていない行の数です。NaN 入力データと結果のプロットを参照してください。
loss
— カルバック・ライブラー ダイバージェンス
非負のスカラー
モデル化された入力分布と出力分布の間のカルバック・ライブラー ダイバージェンス。非負のスカラーとして返されます。詳細は、t-SNE アルゴリズムを参照してください。
詳細
カスタム距離関数
カスタム距離関数の構文は次のとおりです。
function D2 = distfun(ZI,ZJ)
tsne
は ZI
と ZJ
をカスタム関数に渡し、カスタム関数が距離を計算します。
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 個の変数を格納)、次の方程式の最後の行を使用して距離を計算します。
方程式の最後の行にある行列 は "グラム行列" と呼ばれます。正方化と加算によって平方距離を計算する代わりに、グラム行列を計算して使用すると、一連の平方距離の計算は高速になりますが、数値的安定性は少し低くなります。詳細については、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 で導入MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)