我正在使用来自scikit-learn流形学习的Isomap。我减少到二维,并观察在同一数据集上每次运行algorthm而没有任何改变时,结果向量发生变化。我假设算法中使用了一些随机数,但没有办法设置种子。 Random_state不是传递给Isomap的变量。我错过了什么吗?
答案 0 :(得分:0)
您看到的随机内容是关于您的结果的标志。标志不是(在我看来)100%随机。每个组件内的符号是一致的,因此相对关系在结果中是一致的。组件之间的标志是随机的。换句话说,哪个组件乘以1
或KernelPCA
是随机的。此行为来自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
其次,有没有办法将种子设置为"稳定"随机状态?不,目前无法从Isomap
为random_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);
}