取 shuffle 的过程其实可看做从全排列中随机选择一个的过程。
稍微比较麻烦的是实现特征向量与类别标签的同步shuffle。
如果这里数据集既包含特征向量又包括标签值,可直接调用np.random.shuffle()
方法:
>>> np.random.shuffle(training_data)
>>> X = training_data[:, :-1]
>>> y = trianing_data[:, -1]
如果已对数据集的特征向量与类别标签列进行分离,这里提供两种方式进行同步shuffle:
1. 使用 np.random.shuffle()
-
X, y 同时进行 shuffle
>>> training_data = np.hstack(X, y) >>> np.random.shuffle(training_data) >>> X = training_data[:, :-1] >>> y = training_data[:, -1]
-
根据 indices 进行shuffle
indices = np.arange(X.shape[0]) np.random.shuffle(indices) X = X[indices] y = y[indices]
2. np.random.permutation() 对行索引进行一次全排列
>>> r = np.random.permutation(len(y))
# 随机地从全排列中选取一个,实现 shuffle
>>> X = X[r, :]
>>> y = [r]
3. shuffle
上文所述皆是对矩阵的行(样本矩阵的每一个样本)进行 shuffle,那么该如何 shuffle 矩阵的列呢(也即样本矩阵的每一个属性)。
仍然存在两种方案,
-
np.random.shuffle()
因为 np.random.shuffle() 直接对原始矩阵进行修改(返回值为NoneType),且不接受另外的参数,我们可对原始矩阵的转置 shuffle 之后,再转置
>>> training_data = np.hstack(X, y) >>> training_data = training_data.T >>> np.random.shuffle(training_data) >>> training_data = training_data.T >>> X = training_data[:, :-1] >>> y = training_data[:, -1]
-
np.random.permutation() 对列索引进行一次全排列
# 此时 y 参与 shuffle >>> r = np.random.permutation(X.shape[1]) >>> X[:, r]