семя, которое контролирует порядок случайной функции в Matlab - PullRequest
0 голосов
/ 13 февраля 2019

Я использовал функцию Matlab Kmeans для кластеризации двух наборов данных: data1 и data2.У меня есть три основных файла, содержащие следующие коды соответственно:

result1 = kmeans(data1, 4);
result2 = kmeans(data2, 4);

r1 = kmeans(data1,4);

r2 = kmeans(data2,4);

Я заметил, что result1 и r1 одинаковы, но result2 и r2 немного отличаются.Я считаю, что это вызвано случайностью в алгоритме kmeans.В 1-м и 2-м файлах данные1 выполняются первыми, и, таким образом, kmeans использует одно и то же «семя».В первом и третьем файлах data2 выполняется на разных этапах.Kmeans, использованное для result1, влияет на следующие kmeans.

Мой вопрос: можем ли мы установить seed таким образом, чтобы r2 и result2 были одинаковыми?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Другой альтернативой является использование неслучайной инициализации:

start = data1(1:4,:); % This is not necessarily a good initialization!
result1 = kmeans(data1, 4, 'Start',start);

Не копируйте и не вставляйте код выше, это только для иллюстрации.Но у вас может быть хорошая стратегия, чтобы инициализировать ваши средства неслучайно, это зависит от ваших данных.Например, для 2D-данных в прямоугольном домене вы можете выбрать четыре угла домена.

0 голосов
/ 13 февраля 2019

Вы можете управлять генерацией случайных чисел в MATLAB, используя функцию rng.С его помощью вы можете зафиксировать состояние генератора случайных чисел перед запуском вашего кода, а затем снова установить генератор случайных чисел в это состояние, прежде чем запускать его снова, гарантируя, что вы получите те же результаты.Например:

rngState1 = rng;  % Capture state before processing data1
result1 = kmeans(data1, 4);
rngState2 = rng;  % Capture state before processing data2
result2 = kmeans(data2, 4);

...

rng(rngState1);  % Restore state previously used for processing data1
r1 = kmeans(data1,4);

...

rng(rngState2);  % Restore state previously used for processing data2
r2 = kmeans(data2,4);

Поскольку вы обрабатываете данные в отдельных файлах, это может означать сохранение и загрузку переменных состояния в и из MAT-файла для выполнения того, чтообрисовано в общих чертах выше.Другой вариант - просто установить начальное значение для заданного значения перед обработкой каждого набора данных:

rng(1);  % Set seed to 1 for data1
result1 = kmeans(data1, 4);
rng(2);  % Set seed to 2 for data2
result2 = kmeans(data2, 4);

...

rng(1);
r1 = kmeans(data1,4);

...

rng(2);
r2 = kmeans(data2,4);
...