2014-10-30 12 views
5

Ho una matrice di dati X (60x208) e una matrice di etichette Y (1x208). Voglio dividere la mia matrice dati X in due sottoinsiemi casuali di vettori di colonne: formazione (che sarà il 70% dei dati) e test (che sarà il 30% dei dati), ma devo ancora essere in grado di identificare quale l'etichetta da Y corrisponde al vettore di ciascuna colonna. Non sono riuscito a trovare alcuna funzione per fare questo, qualche idea?Matlab: Come posso dividere la mia matrice di dati in due sottoinsiemi casuali di vettori di colonne mantenendo le informazioni sull'etichetta?

EDIT: Ho pensato che dovrei aggiungere, ci sono solo due etichette in Y: 1 e 2 (non so se questo fa la differenza)

+0

Cosa significano quei '1' e' 2' in 'Y'? – Divakar

+0

Solo etichette diverse. L'idea è di tracciarli con colori diversi, ad es. tutti gli 1 sono rossi e 2 sono blu. – user3457834

+0

@Divakar - Questo è molto probabilmente un problema di apprendimento automatico in cui si hanno dati di allenamento con un'etichetta di classificazione assegnata a ciascun punto di dati. Questo è un algoritmo supervisionato in cui fornisci un punto dati e il sistema dovrebbe classificare quel punto dati in modo che appartenga a quella particolare etichetta. I dati di addestramento vengono utilizzati per addestrare il sistema al fine di garantire che i dati vengano classificati nelle etichette corrispondenti. Il set di test viene utilizzato per valutare l'accuratezza, per verificare se il sistema addestrato è in grado di classificare i dati in modo accurato in base agli input che non ha mai visto prima .... quindi un set di test. – rayryeng

risposta

10

che è abbastanza facile da fare. Utilizzare randperm per generare una permutazione casuale di indici da 1 fino a un numero di punti pari a ... che è 208 nel tuo caso.

Una volta generata questa sequenza, utilizzare semplicemente questo e il sottoinsieme nel numero X e Y per estrarre i dati di addestramento e di prova e le etichette. Come tale, fare qualcosa di simile:

num_points = size(X,2); 
split_point = round(num_points*0.7); 
seq = randperm(num_points); 
X_train = X(:,seq(1:split_point)); 
Y_train = Y(seq(1:split_point)); 
X_test = X(:,seq(split_point+1:end)); 
Y_test = Y(seq(split_point+1:end)); 

Il split_point determina quanti punti abbiamo bisogno di inserire nel nostro training set, e avremo bisogno di arrotondare in caso questo calcolo si ottiene tutti i punti decimali. Inoltre non ho inserito il codice hard 208 perché il set di dati potrebbe aumentare e quindi funzionerà con qualsiasi set di dati di dimensioni che scegli. X_train e Y_train conterranno i dati e le etichette per il set di allenamento mentre X_test e Y_test conterranno i dati e le etichette per il set di test.

Come tale, la prima colonna di X_train è il vostro punto di dati per il primo elemento del training set, con il primo elemento di Y_train servire come etichetta per quel particolare punto ... e così via e così via!

+1

Stavo pensando sulle stesse linee! +1 – Divakar

+0

@Divakar - Grazie :) Scusa se ti ho battuto su di esso! – rayryeng

+1

Dovevi punirti con +1 per quella haha;) – Divakar