umap结果不能复现
umap-learn结果就是固定不住哈,怎么都固定不住,不纠结了,希望后面有人能告诉我怎么解决这个问题
https://datarock.com.au/blog/whats-the-uncertainty-on-your-umap/
测试案例如下
import umap
import numpy as np
import random
print(umap.__version__)
print(np.__version__)# 你的代码,UMAP 或其他使用 Numba 的函数
random.seed(42)
np.random.seed(42)din= [[39.715797424316406, 5.328598499298096],[40.119140625, 6.10653018951416],[39.6290283203125, 6.134637832641602],[39.19687271118164, 5.85951566696167],[9.60939884185791, 9.586419105529785],[-6.015710353851318, -11.25406265258789],[9.012431144714355, 8.989534378051758],[9.283456802368164, 9.261088371276855],[-5.681527614593506, -10.919998168945312],[-5.479494571685791, -10.71765422821045]]a = umap.UMAP(random_state=42, n_neighbors=2,n_jobs=1, n_components=2).fit_transform(din).tolist()
b = umap.UMAP(random_state=42, n_neighbors=2,n_jobs=1, n_components=2).fit_transform(din).tolist()print(a)
print("*"*50)
print(b)assert a == b
注意这个结果不是固定的,有时重启内核,能得到一样的结果,但是大部分情况下是不一样的,但是画图来看的话,其实结构是差不大多
example2
import numpy as np
from umap import UMAPseed = np.random.RandomState(42)
x1 = seed.normal(0, 100, (1000, 50))
print(x1.shape)
embedding1 = UMAP(random_state=np.random.RandomState(42)).fit_transform(x1)
embedding2 = UMAP(random_state=np.random.RandomState(42)).fit_transform(x1)np.testing.assert_equal(embedding1, embedding2)
# AssertionError:
# Arrays are not equal# (mismatch 100.0%)
# x: array([ 0.295949, 2.511852, -0.848451, ..., 2.265384, -0.997055,
# 2.001218], dtype=float32)
# y: array([ 0.685097, -2.574292, 2.627948, ..., -0.650334, 1.900896,
# 0.803105], dtype=float32)
我去人家的package里面看了,很奇怪的一个问题在于初始的embedding使用spetral
参数来初始化,两次运行的结果有个很奇怪的区别,这个初始embeding的第二维是相反数的关系,所以最终的embedding事不同的,就很神奇
所以对于该测试数据集,如果使用init = "pca"
, 那么结果就是唯一的,神奇吧,但是换到别的数据集,使用init = "pca"
的结果仍然不能保持稳定,就很bug.