Python:scikit-learn isomap结果似乎是随机的,但没有设置random_state的可能性

时间:2017-06-30 17:56:37

标签: python scikit-learn

我正在使用来自scikit-learn流形学习的Isomap。我减少到二维,并观察在同一数据集上每次运行algorthm而没有任何改变时,结果向量发生变化。我假设算法中使用了一些随机数,但没有办法设置种子。 Random_state不是传递给Isomap的变量。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

您看到的随机内容是关于您的结果的标志。标志不是(在我看来)100%随机。每个组件内的符号是一致的,因此相对关系在结果中是一致的。组件之间的标志是随机的。换句话说,哪个组件乘以1KernelPCA是随机的。此行为来自Isomap使用arpack内核时eigen_solver='dense'使用的函数。

首先为您提供解决方案,您可以在使用Isomap时使用eigen_solver = 'arpack'。这可能会降低您的算法速度,但应删除此随机性。我知道上面这个解释可能会令人困惑。让我提供更多细节,并通过情节展示。

首先,"签署随机性"?的可视化结果是什么?使用以下代码(从this official example修改)与fit_transform,您可以看到使用相同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() 并多次运行代码,则无法看到此随机性:

KernelPCA

enter image description here

其次,有没有办法将种子设置为"稳定"随机状态?不,目前无法从Isomaprandom_state设置种子。然而,对于KernelPCA,存在一个kwarg eigen_solver = 'arpack',它是"伪随机数生成器,用于在eigen_solver =='arpack'"时初始化残差。使用以下代码进行播放(从this official test code修改),即使使用import matplotlib.pyplot as plt import numpy as np from sklearn.decomposition import KernelPCA X_fit = np.random.rand(100, 4) X = np.dot(X_fit, X_fit.T) eigen_solver = 'arpack' #eigen_solver = 'dense' #random_state = None random_state = 0 kpca = KernelPCA(n_components=2, kernel='precomputed', eigen_solver=eigen_solver, random_state=random_state) X_kpca1 = kpca.fit_transform(X) X_kpca2 = kpca.fit_transform(X) plt.plot(X_kpca1[:,0], X_kpca1[:,1], 'ro') plt.plot(X_kpca2[:,0], X_kpca2[:,1], 'bo') plt.show() ,您也可以看到此随机性消失(蓝点覆盖红点):

String str[] = {"aa", "55"};

byte b[] = new byte[str.length];

for (int i = 0; i < str.length; i++) {
    b[i] = (byte) Integer.parseInt(str[i], 16);
}

enter image description here