A tsne
функция вывода - это функция, которая выполняется после каждого NumPrint итерации оптимизации алгоритма t-SNE. Функция вывода может создавать графики или регистрировать данные в файле или переменной рабочей области. Функция не может изменить ход выполнения алгоритма, но может остановить итерации.
Установка функций вывода с помощью Options аргумент пары имя-значение для tsne функция. Набор Options в структуру, созданную с помощью statset или struct. Установите 'OutputFcn' области Options структура к дескриптору функции или массиву ячеек дескрипторов функции.
Например, для установки функции вывода с именем outfun.mиспользуйте следующие команды.
opts = statset('OutputFcn',@outfun); Y = tsne(X,'Options',opts);
Запишите функцию вывода, используя следующий синтаксис.
function stop = outfun(optimValues,state) stop = false; % do not stop by default switch state case 'init' % Set up plots or open files case 'iter' % Draw plots or update variables case 'done' % Clean up plots or files end
tsne проходит state и optimValues переменных в свою функцию. state принимает значения 'init', 'iter', или 'done' как показано в фрагменте кода.
tsne optimValues СтруктураoptimValues Область | Описание |
|---|---|
'iteration' | Номер итерации |
'fval' | Дивергенция Куллбэка-Лейблера, модифицированная преувеличением в течение первых 99 итераций |
'grad' | Градиент расхождения Куллбэка-Лейблера, измененный путем преувеличения в течение первых 99 итераций |
'Exaggeration' | Значение параметра преувеличения, используемого в текущей итерации |
'Y' | Текущее встраивание |
В этом примере показано, как использовать функцию вывода в tsne.
Пользовательская функция вывода
Следующий код является функцией вывода, выполняющей эти задачи:
Храните историю расхождения Куллбэка-Лейблера и норму его градиента в переменной рабочего пространства.
Постройте график решения и истории по мере выполнения итераций.
Отображение Stop кнопка на графике, чтобы остановить итерации на ранней стадии без потери информации.
Функция вывода имеет дополнительную входную переменную, species, что позволяет его графикам показывать правильную классификацию данных. Для получения информации о включении дополнительных параметров, таких как species в функции см. раздел Параметризация функций.
function stop = KLLogging(optimValues,state,species) persistent h kllog iters stopnow switch state case 'init' stopnow = false; kllog = []; iters = []; h = figure; c = uicontrol('Style','pushbutton','String','Stop','Position', ... [10 10 50 20],'Callback',@stopme); case 'iter' kllog = [kllog; optimValues.fval,log(norm(optimValues.grad))]; assignin('base','history',kllog) iters = [iters; optimValues.iteration]; if length(iters) > 1 figure(h) subplot(2,1,2) plot(iters,kllog); xlabel('Iterations') ylabel('Loss and Gradient') legend('Divergence','log(norm(gradient))') title('Divergence and log(norm(gradient))') subplot(2,1,1) gscatter(optimValues.Y(:,1),optimValues.Y(:,2),species) title('Embedding') drawnow end case 'done' % Nothing here end stop = stopnow; function stopme(~,~) stopnow = true; end end
Использование пользовательской функции вывода
Постройте график данных радужки Фишера, набора данных 4-D, в двух измерениях с помощью tsne. Происходит падение значения дивергенции в итерации 100, потому что дивергенция масштабируется на величину преувеличения для более ранних итераций. Вложение остается в значительной степени неизменным в течение последних нескольких сотен итераций, поэтому можно сэкономить время, нажав кнопку Stop во время итераций.
load fisheriris rng default % for reproducibility opts = statset('OutputFcn',@(optimValues,state) KLLogging(optimValues,state,species)); Y = tsne(meas,'Options',opts,'Algorithm','exact');
