2017-05-09 1 views
1

Je veux mettre à l'échelle une matrice (X) avec 2 colonnes. J'utilise la normalisation moyenne, et je l'ai écrit les lignes suivantes dans Octave:Vectorisation de l'échelle de caractéristiques

X_norm = X 
mu = mean(X); 
sigma = std(X); 
X_norm(:,1) = (X_norm(:,1) .- mu(:,1)) ./ sigma(:,1); 
X_norm(:,2) = (X_norm(:,2) .- mu(:,2)) ./ sigma(:,2); 

Pouvez-vous s'il vous plaît laissez-moi savoir d'une manière plus propre à vectoriser ce calcul?

j'ai vérifié mon code en comparant avec le résultat de zscore(X) et leur correspondance - à savoir un sum(X_norm - zscore(X)) me a renvoyé 0 0.

Je suis contraint de ne pas utiliser zscore(), et par conséquent la question.

Exemple de données comme suit:

2104  3 
1600  3 
2400  3 
1416  2 
3000  4 
1985  4 
1534  3 
1427  3 
1380  3 
1494  3 
1940  4 
2000  3 
1890  3 
4478  5 
1268  3 
2300  4 
1320  2 
1236  3 
2609  4 
3031  4 
1767  3 
1888  2 
1604  3 
1962  4 
3890  3 
1100  3 
1458  3 
2526  3 
2200  3 
2637  3 

Répondre

2

vous pouvez simplement faire:

X_norm = (X .- mean(X,1)) ./ std(X,0,1); 
+0

Très appréciée. –

0

Au cours de validation croisée face problème de la division zéro. Cela a fonctionné pour moi.

mu = mean(X); 
X_norm = X - mu; 
sigma = std(X); 

% Skip zero div 
sigmaZeroIdx = sigma == 0; 
sigma(1,sigmaZeroIdx) = 1; 

X_norm = X_norm ./ sigma;