Так вышло, хотя сейчас в этом нет ничего необычного, что мне приходится работать с одним 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
> 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
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
> 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), и на разных платформах всё по-прежнему.