2012-02-01 31 views
12
  • Ho una matrice numpy con forma di (4601, 58).
  • Voglio dividere la matrice in modo casuale come per il 60%, 20%, 20% diviso in base al numero di righe
  • Questo è per compito l'apprendimento automatico ho bisogno
  • C'è una funzione NumPy che seleziona casualmente le righe?

risposta

17

è possibile utilizzare numpy.random.shuffle

import numpy as np 

N = 4601 
data = np.arange(N*58).reshape(-1, 58) 
np.random.shuffle(data) 

a = data[:int(N*0.6)] 
b = data[int(N*0.6):int(N*0.8)] 
c = data[int(N*0.8):] 
3

Se si desidera selezionare in modo casuale le righe, si potrebbe utilizzare random.sample dalla libreria standard di Python:

import random 

population = range(4601) # Your number of rows 
choice = random.sample(population, k) # k being the number of samples you require 

random.sample campioni senza sostituzione, in modo da non è necessario preoccuparsi di righe ripetute finire in choice. Dato un array numpy chiamato matrix, è possibile selezionare le righe tagliando, in questo modo: matrix[choice].

Di, naturalmente, k può essere uguale al numero di elementi totali nella popolazione e quindi choice conterrà un ordinamento casuale degli indici per le righe. Quindi puoi dividere choice come preferisci, se è tutto ciò di cui hai bisogno.

7

Un complemento alla risposta di HYRY se si vuole mescolare costantemente più array x, y, z con lo stesso prima dimensione: x.shape[0] == y.shape[0] == z.shape[0] == n_samples.

Si può fare:

rng = np.random.RandomState(42) # reproducible results with a fixed seed 
indices = np.arange(n_samples) 
rng.shuffle(indices) 
x_shuffled = x[indices] 
y_shuffled = y[indices] 
z_shuffled = z[indices] 

E quindi procedere con la scissione di ciascun array mescolate come in risposta di HYRY.

1

Poiché è necessario per l'apprendimento automatico, ecco un metodo che ho scritto:

import numpy as np 

def split_random(matrix, percent_train=70, percent_test=15): 
    """ 
    Splits matrix data into randomly ordered sets 
    grouped by provided percentages. 

    Usage: 
    rows = 100 
    columns = 2 
    matrix = np.random.rand(rows, columns) 
    training, testing, validation = \ 
    split_random(matrix, percent_train=80, percent_test=10) 

    percent_validation 10 
    training (80, 2) 
    testing (10, 2) 
    validation (10, 2) 

    Returns: 
    - training_data: percentage_train e.g. 70% 
    - testing_data: percent_test e.g. 15% 
    - validation_data: reminder from 100% e.g. 15% 
    Created by Uki D. Lucas on Feb. 4, 2017 
    """ 

    percent_validation = 100 - percent_train - percent_test 

    if percent_validation < 0: 
     print("Make sure that the provided sum of " + \ 
     "training and testing percentages is equal, " + \ 
     "or less than 100%.") 
     percent_validation = 0 
    else: 
     print("percent_validation", percent_validation) 

    #print(matrix) 
    rows = matrix.shape[0] 
    np.random.shuffle(matrix) 

    end_training = int(rows*percent_train/100)  
    end_testing = end_training + int((rows * percent_test/100)) 

    training = matrix[:end_training] 
    testing = matrix[end_training:end_testing] 
    validation = matrix[end_testing:] 
    return training, testing, validation 

# TEST: 
rows = 100 
columns = 2 
matrix = np.random.rand(rows, columns) 
training, testing, validation = split_random(matrix, percent_train=80, percent_test=10) 

print("training",training.shape) 
print("testing",testing.shape) 
print("validation",validation.shape) 

print(split_random.__doc__) 
  • formazione (80, 2)
  • test (10, 2)
  • convalida (10, 2)
Problemi correlati