tsne
t-분포 확률적 이웃 임베딩
설명
예제
피셔(Fisher)의 붓꽃 데이터 시각화하기
피셔의 붓꽃 데이터 세트는 붓꽃에 대한 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.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 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
행렬로 지정됩니다. 여기서 각 행은 하나의 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
함수는 Distance
이름-값 인수가 fast
로 시작하는 경우에만 CacheSize
를 사용할 수 있습니다.
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에서 서로 다른, 0이 아닌 좌표의 백분율인 자카드 계수를 뺀 값사용자 지정 거리 함수 —
@
(예:@distfun
)을 사용하여 지정된 거리 함수. 자세한 내용은 세부 정보 항목을 참조하십시오.
모든 경우에 tsne
는 제곱 쌍별 거리를 사용하여 X
의 결합 분포에서 가우스 커널을 계산합니다.
예: 'mahalanobis'
데이터형: char
| string
| function_handle
Exaggeration
— 데이터의 자연적 군집 크기
4
(디폴트 값) | 스칼라 값 1
이상
데이터의 자연적 군집 크기로, 스칼라 값 1
이상으로 지정됩니다.
Exaggeration 값이 크면 tsne
는 Y
의 더 큰 결합 확률을 학습하고 Y
의 군집 사이에 상대적으로 더 많은 공간을 만듭니다. tsne
는 처음 99회 최적화 반복에서 Exaggeration을 사용합니다.
쿨백-라이블러 발산의 값이 최적화의 초기 단계에서 증가하는 경우 Exaggeration 값을 줄여 보십시오. tsne Settings 항목을 참조하십시오.
예: 10
데이터형: single
| double
NumDimensions
— 출력값 Y
의 차원
2
(디폴트 값) | 양의 정수
NumPCAComponents
— PCA 차원 축소
0
(디폴트 값) | 음이 아닌 정수
PCA 차원 축소로, 음이 아닌 정수로 지정됩니다. tsne
는 고차원 데이터를 임베딩하기 전에 먼저 pca
함수를 사용하여 데이터의 차원을 NumPCAComponents
로 축소합니다. NumPCAComponents
가 0
이면 tsne
는 PCA를 사용하지 않습니다.
예: 50
데이터형: single
| double
Perplexity
— 각 점의 유효 국소 이웃 개수
30
(디폴트 값) | 양의 스칼라
각 점의 유효 국소 이웃 개수로, 양의 스칼라로 지정됩니다. t-SNE Algorithm 항목을 참조하십시오.
혼잡도(perplexity)가 클수록 tsne
는 더 많은 점을 최근접이웃으로 사용합니다. 대규모 데이터 세트에는 더 큰 값의 Perplexity
를 사용하십시오. 일반적인 Perplexity
값은 5
에서 50
까지입니다. 반스-헛(Barnes-Hut) 알고리즘에서, tsne
는 min(3*Perplexity,N-1)
을 최근접이웃 개수로 사용합니다. tsne Settings 항목을 참조하십시오.
예: 10
데이터형: single
| double
Standardize
— 입력 데이터를 정규화할지 지정하는 플래그
false
(디폴트 값) | true
입력 데이터를 정규화할지 지정하는 플래그로, false
또는 true
로 지정됩니다. 값이 true
이면, tsne
는 먼저 X의 평균을 뺀 다음 X의 표준편차로 나눠서 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 Settings 항목을 참조하십시오.
예: 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
최적화 반복 후에 호출할 하나 이상의 함수를 지정하는 함수 핸들 또는 함수 핸들로 구성된 셀형 배열. 구문에 대한 자세한 내용은 t-SNE Output Function 항목을 참조하십시오. 디폴트 값은[]
입니다.'TolFun'
— 최적화 중지 기준. 쿨백-라이블러 발산의 기울기의 노름이'TolFun'
보다 작으면 최적화가 종료됩니다. 디폴트 값은1e-10
입니다.
예: options = statset('MaxIter',500)
데이터형: struct
Theta
— 반스-헛 트레이드오프 파라미터
0.5
(디폴트 값) | 0과 1 사이의 스칼라
반스-헛(Barnes-Hut) 트레이드오프 파라미터로, 0과 1 사이의 스칼라로 지정됩니다. 값이 높을수록 최적화 속도는 빨라지지만 정확도는 떨어집니다. Algorithm
이 'barneshut'
인 경우에만 적용됩니다.
예: 0.1
데이터형: single
| double
Verbose
— 반복 표시
0
(디폴트 값) | 1
| 2
출력 인수
Y
— 임베디드 점
n
×NumDimensions
행렬
임베디드 점으로, n
×NumDimensions
행렬로 반환됩니다. 각 행은 하나의 임베디드 점을 나타냅니다. n
은 NaN
요소를 포함하지 않은 데이터 X
의 행 개수입니다. NaN 입력 데이터가 포함된 결과 플로팅하기 항목을 참조하십시오.
loss
— 쿨백-라이블러 발산
음이 아닌 스칼라
모델링된 입력 분포와 출력 분포 간의 쿨백-라이블러 발산으로, 음이 아닌 스칼라로 반환됩니다. 자세한 내용은 t-SNE Algorithm 항목을 참조하십시오.
세부 정보
사용자 지정 거리 함수
사용자 지정 거리 함수의 구문은 다음과 같습니다.
function D2 = distfun(ZI,ZJ)
tsne
는 ZI
와 ZJ
를 함수에 전달하고 함수는 거리를 계산합니다.
ZI
는X
의 단일 행을 포함하는 1×n 벡터입니다.ZJ
는X
의 여러 행을 포함하는 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를 구하기 위해 알고리즘은 다음 수식의 마지막 줄을 사용하여 거리를 계산합니다.
수식의 마지막 줄에 있는 행렬 를 그람 행렬이라고 합니다. 제곱과 합으로 제곱 거리를 계산하는 대신 그람 행렬을 계산하고 사용하는 경우 일련의 제곱 거리를 계산하는 것이 더 빠르지만 수치적으로 약간 덜 안정적입니다. 자세한 내용은 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 명령 창에 입력하십시오. 웹 브라우저는 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)