2016-02-29 7 views
2

Я использую t-SNE с кодом matlab с этого сайта (https://lvdmaaten.github.io/tsne/). Тем не менее, вся ошибка, когда я запускаю эту программу, с размером данных больше, чем количество данных. Приведенный ниже код является кодом я использую в настоящее время, и ошибка всегда происходит здесьМогу ли я использовать t-SNE, когда размер больше, чем количество данных?

M = M(:,ind(1:initial_dims)); 

ошибка

Index exceeds matrix dimensions. 
Error in tsne (line 62) 
    M = M(:,ind(1:initial_dims)); 

Я называю эту tsne функцию с помощью команды в MATLAB

output = tsne(input, [], 2, 640, 30); 

Размер входного файла (162x640), размер 640, а число данных - 162. Ниже приведен код, приведенный на веб-сайте выше.

function ydata = tsne(X, labels, no_dims, initial_dims, perplexity) 
%TSNE Performs symmetric t-SNE on dataset X 
% 
% mappedX = tsne(X, labels, no_dims, initial_dims, perplexity) 
% mappedX = tsne(X, labels, initial_solution, perplexity) 
% 
% The function performs symmetric t-SNE on the NxD dataset X to reduce its 
% dimensionality to no_dims dimensions (default = 2). The data is 
% preprocessed using PCA, reducing the dimensionality to initial_dims 
% dimensions (default = 30). Alternatively, an initial solution  obtained 
% from an other dimensionality reduction technique may be specified in 
% initial_solution. The perplexity of the Gaussian kernel that is  employed 
% can be specified through perplexity (default = 30). The labels of  the 
% data are not used by t-SNE itself, however, they are used to color 
% intermediate plots. Please provide an empty labels matrix [] if you 
% don't want to plot results during the optimization. 
% The low-dimensional data representation is returned in mappedX. 
% 
% 
% (C) Laurens van der Maaten, 2010 
% University of California, San Diego 

if ~exist('labels', 'var') 
    labels = []; 
end 
if ~exist('no_dims', 'var') || isempty(no_dims) 
    no_dims = 2; 
end 
if ~exist('initial_dims', 'var') || isempty(initial_dims) 
    initial_dims = min(50, size(X, 2)); 
end 
if ~exist('perplexity', 'var') || isempty(perplexity) 
    perplexity = 30; 
end 

% First check whether we already have an initial solution 
if numel(no_dims) > 1 
    initial_solution = true; 
    ydata = no_dims; 
    no_dims = size(ydata, 2); 
    perplexity = initial_dims; 
else 
    initial_solution = false; 
end 

% Normalize input data 
X = X - min(X(:)); 
X = X/max(X(:)); 
X = bsxfun(@minus, X, mean(X, 1)); 

% Perform preprocessing using PCA 
if ~initial_solution 
    disp('Preprocessing data using PCA...'); 
    if size(X, 2) < size(X, 1) 
     C = X' * X; 
    else 
     C = (1/size(X, 1)) * (X * X'); 
    end 
    [M, lambda] = eig(C); 
    [lambda, ind] = sort(diag(lambda), 'descend'); 
    M = M(:,ind(1:initial_dims)); 
    lambda = lambda(1:initial_dims); 
    if ~(size(X, 2) < size(X, 1)) 
     M = bsxfun(@times, X' * M, (1 ./ sqrt(size(X, 1) .* lambda))'); 
    end 
    X = bsxfun(@minus, X, mean(X, 1)) * M; 
    clear M lambda ind 
end 

% Compute pairwise distance matrix 
sum_X = sum(X .^ 2, 2); 
D = bsxfun(@plus, sum_X, bsxfun(@plus, sum_X', -2 * (X * X'))); 

% Compute joint probabilities 
P = d2p(D, perplexity, 1e-5);           % compute affinities using fixed perplexity 
clear D 

% Run t-SNE 
if initial_solution 
    ydata = tsne_p(P, labels, ydata); 
else 
    ydata = tsne_p(P, labels, no_dims); 
end 

Я пытаюсь понять этот код, но я не могу понять, в какой части произошла ошибка.

if size(X, 2) < size(X, 1) 
    C = X' * X; 
else 
    C = (1/size(X, 1)) * (X * X'); 
end 

Почему это условие необходимо? Поскольку размер «X» равен (162x640), оператор else будет выполнен. Думаю, это проблема. В выражении else размер «C» будет (162x162). Однако в следующей строке

M = M(:,ind(1:initial_dims)); 

Используется «initial_dims», равный 640. Я использовал этот код неправильно? Или это просто недоступно для набора данных, который я использую?

ответ

1

В соответствии с документом: Данные предварительно обрабатываются с использованием PCA, уменьшая размерность до размеров initial_dims (по умолчанию = 30). Таким образом, вы должны оставить этот параметр неизменным в первый раз.

Условие if size(X, 2) < size(X, 1) используется для формулировки матрицы для экономии SVD, так что размер матрицы ковариации будет меньше, что приведет к более быстрому вычислению.

 Смежные вопросы

  • Нет связанных вопросов^_^