def cross_validate(network_shape, epochs_num, learn_rate, _groups_x,
                   _groups_y):
    k = _groups_x.shape[0]
    _sum = 0
    results = np.zeros(k)
    for i in range(k):

        train_x = None
        train_y = None
        valid_x = np.copy(
            _groups_x[i])  # the validation set for th i'th iteration.
        valid_y = np.copy(_groups_y[i])

        net = NeuralNetwork(network_shape, epochs_num, learn_rate)

        for j in range(k):
            if j != i:
                # arrange the train set for the i'th iteration.
                if train_x is None:
                    train_x = np.copy(_groups_x[j])
                    train_y = np.copy(_groups_y[j])
                else:
                    train_x = np.concatenate((train_x, _groups_x[j]), axis=0)
                    train_y = np.concatenate((train_y, _groups_y[j]), axis=0)

        old_mins, denoms = norm.minmax_params(train_x)
        train_x = norm.minmax(train_x, 0, 1)
        valid_x = norm.minmax(valid_x, 0, 1, old_mins, denoms)

        net.train(train_x, train_y)
        results[i] = net.accuracy(valid_x, valid_y)

        old_mins, denoms = norm.minmax_params(train_x)
        train_x = norm.minmax(train_x, 0, 1)
        valid_x = norm.minmax(valid_x, 0, 1, old_mins, denoms)

    print(results)
    return np.average(results)