洗牌算法

目的:将排列好的数据重新以随机的方式排列

原理:从数组中随机选出一个元素,放入目标数组中后从原数组中删除这个元素。反复进行这个过程,直到原数组中所有的元素都进入了新的数组。此时目标数组中的元素为随机排列,达到了“洗牌”的效果。

使用Python描述:

1
2
3
4
5
6
7
8
import random
def shuffle(list):
targetlist=[]
while list:
i=random.randrange(0,len(list))
targetlist.append(list[i])
list.pop(i)
return targetlist

random.randrange(0,len(list))为从0到list长度中随机生成一个整数。

targetlist.append(list[i])为将list[i]元素放入targetlist数组中。

list.pop(i)为从list中删除这个元素。

可以通过这个算法实现对训练集与测试集的分配。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import random

def shuffle_split_data(X, y):
""" Shuffles and splits data into 70% training and 30% testing subsets,
then returns the training and testing subsets. """
# Shuffle and split the data
split_num = int(0.7 * len(X))
X_t = []
y_t = []
X = list(X)
while X:
p = random.randrange(0, len(X))
X_t.append(X[p])
y_t.append(y[p])
X.pop(p)

X_train = X_t[:split_num]
y_train = y_t[:split_num]
X_test = X_t[split_num:]
y_test = y_t[split_num:]

# Return the training and testing data subsets
return X_train, y_train, X_test, y_test

X为输入值,y为输出值,将70%的数据放入训练集,将30%的数据放入测试集