R: повторяемость результатов UMAP

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

Одно время я слегка примечал, что почему-то результаты UMAP различались. При этом, я знаю, что для повторяемости результатов в методах, использующих случайные точки, нужно устанавливать set.seed, и на одной платформе это всегда работает. Меня этот эффект сильно не цеплял, и я просто списывал это на то, что не обновил данные.

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

Решил проверить это на более простом и «стабильном» наборе данных. Что может быть стабильнее датасета по ирисам?

Итак, простой код программы:

library(umap)
library(dbscan)
iris.data <- iris[,-5]
iris.norm <- scale(iris.data)
set.seed(5)
iris.umap <- umap(as.matrix(iris.data))
iris.clus <- dbscan(iris.umap$layout, eps = 0.7, minPts = 5)
spec <- ifelse(iris$Species == 'setosa', 1,
ifelse(iris$Species == 'versicolor', 2,
ifelse(iris$Species == 'virginica', 3, -20)))
plot(iris.umap$layout, bg=iris.clus$cluster + 1L, pch=20 + spec , xlab = 'X', ylab = 'Y', cex=2)

На трёх разных компьютерах этот код дал такие результаты (дополнительно проверил работу датчика случайных чисел — везде работает одинаково) :


Ubuntu Linux
> version
platform       x86_64-pc-linux-gnu         
arch           x86_64    
os             linux-gnu     
system         x86_64, linux-gnu
status                  
major          3
minor          6.0
year           2019
month          04
day            26
svn rev        76424
language       R
version.string R version 3.6.0 (2019-04-26)
nickname       Planting of a Tree

Результат 1
Результат 1
> set.seed(5)
> rnorm(5)
[1] -0.84085548  1.38435934 -1.25549186  0.07014277 1.71144087
> set.seed(5)
> runif(5)
[1] 0.2002145 0.6852186 0.9168758 0.2843995 0.1046501



Windows 7
> version
platform       x86_64-w64-mingw32
arch           x86_64
os             mingw32
system         x86_64, mingw32
status             
major          3
minor          5.3  
year           2019  
month          03
day            11
svn rev        76217  
language       R
version.string R version 3.5.3 (2019-03-11)
nickname       Great Truth
Результат UMAP+DBSCAN на платформе 2
Результат 2
set.seed(5)
> rnorm(5)
[1] -0.84085548  1.38435934 -1.25549186  0.07014277 1.71144087
> set.seed(5)
> runif(5)
[1] 0.2002145 0.6852186 0.9168758 0.2843995 0.1046501


Ubuntu Linux
> version
platform       x86_64-pc-linux-gnu         
arch           x86_64
os             linux-gnu
system         x86_64, linux-gnu
status
major          3
minor          6.0
year           2019
month          04
day            26
svn rev        76424
language       R
version.string R version 3.6.0 (2019-04-26)
nickname       Planting of a Tree
Результат UMAP+DBSCAN на платформе 3
Результат 3
> set.seed(5)
> rnorm(5)
[1] -0.84085548  1.38435934 -1.25549186  0.07014277 1.71144087
> set.seed(5)
> runif(5)
[1] 0.2002145 0.6852186 0.9168758 0.2843995 0.1046501

В чём дело, пока не ясно. Пробовал добавлять параметр random_state функции umap:

umap(as.matrix(iris.data), random_state = 15)

Эффект от этого параметра такой же, как от функции set.seed(x), и на разных платформах всё по-прежнему.

Share

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *