Python:scikitlearn isomap结果看起来是随机的,但不可能设置随机的

2024-04-29 10:20:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用scikit的Isomap学习流形。我将其简化为二维,并观察到在相同的数据集上每次运行该算法时,结果向量都会发生变化。我假设算法中使用了一些随机数,但是没有办法设置种子。Random_state不是要在Isomap中传递的变量。我错过什么了吗?在


Tags: 数据算法randomscikit种子向量流形集上
1条回答
网友
1楼 · 发布于 2024-04-29 10:20:34

你所看到的随机性是你结果的标志。在我看来,这个标志不是100%随机的。每个组成部分中的符号是一致的,因此相对关系在结果中是一致的。部件之间的符号是随机的。换句话说,哪个分量乘以-11是随机的。此行为来自使用Isomap内核时KernelPCA函数。在

要首先给出解决方案,可以在使用Isomap时使用eigen_solver='dense'。这可能会减慢你的算法,但应该消除这种随机性。我知道上面的解释可能会让人困惑。让我给你更多的细节,并按情节展示。在

首先,“符号随机性”的可视化结果是什么?使用下面的代码(从this official example)和eigen_solver = 'arpack'一起使用,您可以看到两个使用相同的Isomap类的{}可能(或可能不会)得到不同的结果。但是,正如您在图中看到的,相对位置保持不变。只是整个情节被颠覆了。如果使用eigen_solver='dense'并多次运行代码,则不会看到这种随机性:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import offsetbox
from sklearn import (manifold, datasets, decomposition, ensemble,
                     discriminant_analysis, random_projection)

digits = datasets.load_digits(n_class=6)
X = digits.data
y = digits.target
n_samples, n_features = X.shape
n_neighbors = 30

def plot_embedding(X, ax, title=None):
    x_min, x_max = np.min(X, 0), np.max(X, 0)
    X = (X - x_min) / (x_max - x_min)
    for i in range(X.shape[0]):
        ax.text(X[i, 0], X[i, 1], str(digits.target[i]),
                 color=plt.cm.Set1(y[i] / 10.),
                 fontdict={'weight': 'bold', 'size': 9})

eigen_solver = 'arpack'
#eigen_solver = 'dense'
iso = manifold.Isomap(n_neighbors, n_components=2, eigen_solver=eigen_solver)
X_iso1 = iso.fit_transform(X)
X_iso2 = iso.fit_transform(X)

fig = plt.figure(figsize=(16, 6))
ax1 = fig.add_subplot(121)
plot_embedding(X_iso1, ax1)
ax2 = fig.add_subplot(122)
plot_embedding(X_iso2, ax2)
plt.show()

enter image description here

其次,有没有办法设置种子来“稳定”随机状态?不,当前无法从IsomapKernelPCA设置种子。然而,对于^{},有一个kwarg random_state,它是“当特征解算器==‘arpack’”时用于初始化残差的伪随机数生成器。使用以下代码(修改自this official test code),您可以看到这种随机性消失了(蓝点覆盖红点),即使使用eigen_solver = 'arpack'

^{pr2}$

enter image description here

相关问题 更多 >