Main Content

tsne

t-분포 확률적 이웃 임베딩

설명

예제

Y = tsne(X)X의 고차원 행의 2차원 임베딩으로 구성된 행렬을 반환합니다.

예제

Y = tsne(X,Name,Value)는 하나 이상의 이름-값 쌍 인수로 지정된 옵션을 사용하여 임베딩을 수정합니다.

예제

[Y,loss] = tsne(___)는 입력 인수에 대해 데이터 X와 임베딩 Y를 모델링하는 결합 분포 간의 쿨백-라이블러(Kullback-Leibler) 발산도 반환합니다.

예제

모두 축소

피셔의 붓꽃 데이터 세트는 붓꽃에 대한 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.

이 경우 코사인 거리 측정법, 체비쇼프 거리 측정법, 유클리드 거리 측정법은 군집을 상당히 잘 구분합니다. 그러나 마할라노비스 거리 측정법은 군집을 잘 구분하지 못합니다.

tsneNaN 요소를 포함하는 입력 데이터 행을 제거합니다. 따라서 플로팅하기 전에 사용자가 분류 데이터에서 이러한 행을 제거해야 합니다.

예를 들어 피셔의 붓꽃 데이터에 있는 몇 개의 임의 요소를 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.1255, and 3-D embedding has loss 0.0980872.

예상대로 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.

입력 인수

모두 축소

데이터 점으로, n×m 행렬로 지정됩니다. 여기서 각 행은 하나의 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"로 지정됩니다. tsne 함수는 Distance 이름-값 인수가 fast로 시작하는 경우에만 CacheSize를 사용할 수 있습니다.

CacheSize"maximal"로 설정하는 경우, tsne 함수는 크기가 M×M인 전체 중간 행렬에 대해 충분한 메모리를 할당하려고 시도합니다. 여기서 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에서 서로 다른, 0이 아닌 좌표의 백분율인 자카드 계수를 뺀 값

  • 사용자 지정 거리 함수 — @(예: @distfun)을 사용하여 지정된 거리 함수. 자세한 내용은 세부 정보 항목을 참조하십시오.

모든 경우에 tsne는 제곱 쌍별 거리를 사용하여 X의 결합 분포에서 가우스 커널을 계산합니다.

예: 'mahalanobis'

데이터형: char | string | function_handle

데이터의 자연적 군집 크기로, 스칼라 값 1 이상으로 지정됩니다.

Exaggeration 값이 크면 tsneY의 더 큰 결합 확률을 학습하고 Y의 군집 사이에 상대적으로 더 많은 공간을 만듭니다. tsne는 처음 99회 최적화 반복에서 Exaggeration을 사용합니다.

쿨백-라이블러 발산의 값이 최적화의 초기 단계에서 증가하는 경우 Exaggeration 값을 줄여 보십시오. tsne Settings 항목을 참조하십시오.

예: 10

데이터형: single | double

출력값 Y의 차원으로, 양의 정수로 지정됩니다. 일반적으로 NumDimensions2 또는 3으로 설정합니다.

예: 3

데이터형: single | double

PCA 차원 축소로, 음이 아닌 정수로 지정됩니다. tsne는 고차원 데이터를 임베딩하기 전에 먼저 pca 함수를 사용하여 데이터의 차원을 NumPCAComponents로 축소합니다. NumPCAComponents0이면 tsne는 PCA를 사용하지 않습니다.

예: 50

데이터형: single | double

각 점의 유효 국소 이웃 개수로, 양의 스칼라로 지정됩니다. t-SNE Algorithm 항목을 참조하십시오.

혼잡도(perplexity)가 클수록 tsne는 더 많은 점을 최근접이웃으로 사용합니다. 대규모 데이터 세트에는 더 큰 값의 Perplexity를 사용하십시오. 일반적인 Perplexity 값은 5에서 50까지입니다. 반스-헛(Barnes-Hut) 알고리즘에서, tsnemin(3*Perplexity,N-1)을 최근접이웃 개수로 사용합니다. tsne Settings 항목을 참조하십시오.

예: 10

데이터형: single | double

입력 데이터를 정규화할지 지정하는 플래그로, false 또는 true로 지정됩니다. 값이 true이면, tsne는 먼저 X의 평균을 뺀 다음 X의 표준편차로 나눠서 X의 각 열을 중심화합니다.

X의 특징이 다른 스케일에 있는 경우에는 'Standardize'true로 설정하십시오. 학습 과정은 최근접이웃을 기반으로 하므로, 큰 스케일을 가진 특징은 작은 스케일을 가진 특징의 기여를 무시할 수 있습니다.

예: true

데이터형: logical

최적화 제어

모두 축소

초기 임베디드 점으로, n×NumDimensions 실수 행렬로 지정됩니다. 여기서 nX의 행 개수입니다. tsne 최적화 알고리즘은 이러한 점을 초기값으로 사용합니다.

데이터형: single | double

최적화 과정의 학습률로, 양의 스칼라로 지정됩니다. 일반적으로 100에서 1000 사이의 값으로 설정합니다.

LearnRate가 너무 작으면 tsne는 부적합한 국소 최솟값으로 수렴될 수 있습니다. LearnRate가 너무 크면 최적화는 처음에 쿨백-라이블러 발산을 감소시키는 것이 아니라 증가시킬 수 있습니다. tsne Settings 항목을 참조하십시오.

예: 1000

데이터형: single | double

반복 표시 빈도로, 양의 정수로 지정됩니다. Verbose 이름-값 쌍이 0이 아니면 tsne는 매번의 NumPrint 반복 후에 반복 표시를 반환합니다. Options 이름-값 쌍이 비어 있지 않은 'OutputFcn' 요소를 포함하고 있다면 매번의 NumPrint 반복 후에 출력 함수가 실행됩니다.

예: 20

데이터형: single | double

최적화 옵션으로, 필드 'MaxIter', 'OutputFcn', 'TolFun'을 포함하는 구조체로 지정됩니다. statset 또는 struct를 사용하여 'Options'를 만듭니다.

  • 'MaxIter' — 최대 최적화 반복 횟수를 지정하는 양의 정수. 디폴트 값은 1000입니다.

  • 'OutputFcn' — 매번의 NumPrint 최적화 반복 후에 호출할 하나 이상의 함수를 지정하는 함수 핸들 또는 함수 핸들로 구성된 셀형 배열. 구문에 대한 자세한 내용은 t-SNE Output Function 항목을 참조하십시오. 디폴트 값은 []입니다.

  • 'TolFun' — 최적화 중지 기준. 쿨백-라이블러 발산의 기울기의 노름이 'TolFun'보다 작으면 최적화가 종료됩니다. 디폴트 값은 1e-10입니다.

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

데이터형: struct

반스-헛(Barnes-Hut) 트레이드오프 파라미터로, 0과 1 사이의 스칼라로 지정됩니다. 값이 높을수록 최적화 속도는 빨라지지만 정확도는 떨어집니다. Algorithm'barneshut'인 경우에만 적용됩니다.

예: 0.1

데이터형: single | double

반복 표시로, 0, 1 또는 2로 지정됩니다. Verbose0이 아니면 tsne는 매번의 NumPrint 반복 시 쿨백-라이블러 발산과 그 기울기의 노름에 대한 요약 테이블을 출력합니다.

Verbose2이면 tsne는 가우스 커널의 분산도 출력합니다. tsne는 이러한 커널을 X의 결합 확률에 대한 계산에 사용합니다. 최소 분산과 최대 분산의 스케일에 큰 차이가 있다면, 경우에 따라 X를 다시 스케일링하여 더 적합한 결과를 얻을 수 있습니다.

예: 2

데이터형: single | double

출력 인수

모두 축소

임베디드 점으로, n×NumDimensions 행렬로 반환됩니다. 각 행은 하나의 임베디드 점을 나타냅니다. nNaN 요소를 포함하지 않은 데이터 X의 행 개수입니다. NaN 입력 데이터가 포함된 결과 플로팅하기 항목을 참조하십시오.

모델링된 입력 분포와 출력 분포 간의 쿨백-라이블러 발산으로, 음이 아닌 스칼라로 반환됩니다. 자세한 내용은 t-SNE Algorithm 항목을 참조하십시오.

세부 정보

모두 축소

사용자 지정 거리 함수

사용자 지정 거리 함수의 구문은 다음과 같습니다.

function D2 = distfun(ZI,ZJ)

tsneZIZJ를 함수에 전달하고 함수는 거리를 계산합니다.

  • ZIX 또는 Y의 단일 행을 포함하는 1×n 벡터입니다.

  • ZJX 또는 Y의 여러 행을 포함하는 m×n 행렬입니다.

함수는 D2를 반환하며, 이는 거리로 구성된 m×1 벡터입니다. D2의 j번째 요소는 관측값 ZI와 관측값 ZJ(j,:) 간의 거리입니다.

일반적으로, 데이터가 희소 형식이 아니면 기본으로 제공되는 거리 함수가 함수 핸들보다 빠릅니다.

알고리즘

모두 축소

tsne는 원래의 고차원 점의 상대적 유사성을 모방하는 저차원 공간에 일련의 임베디드 점을 생성합니다. 임베디드 점은 원래 데이터의 군집을 보여줍니다.

대략적으로, 알고리즘은 원래 점을 가우스 분포에서 오는 것으로 모델링하고 임베디드 점을 스튜던트 t 분포에서 오는 것으로 모델링합니다. 알고리즘은 임베디드 점을 옮겨서 이러한 두 분포 간의 쿨백-라이블러 발산을 최소화하려고 시도합니다.

자세한 내용은 t-SNE 항목을 참조하십시오.

고속 유클리드 거리 알고리즘

fast로 시작하는 Distance 인수의 값(예: 'fasteuclidean''fastseuclidean')은 계산 시간을 아끼기 위해 추가 메모리를 사용하는 알고리즘을 사용해 유클리드 거리를 계산합니다. 이 알고리즘은 Albanie[1] 및 다른 문헌에서 "Euclidean Distance Matrix Trick"이라고 합니다. 내부 테스트에 따르면 이 알고리즘은 예측 변수 개수가 10개 이상인 경우 시간을 아끼는 것으로 나타났습니다. 'fast'로 시작하는 알고리즘은 희소 형식 데이터를 지원하지 않습니다.

각 xi가 n개의 변수를 갖는 모든 점 xi와 xj 간 거리의 행렬 D를 구하기 위해 알고리즘은 다음 수식의 마지막 줄을 사용하여 거리를 계산합니다.

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에 개발됨

모두 확장