特征缩放向量化

Vectorization of feature scaling

我想对具有 2 列的矩阵 (X) 进行特征缩放。我正在使用均值归一化,并在 Octave 中写了以下几行:

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); 

你能告诉我一种更简洁的向量化这些计算的方法吗?

我通过与 zscore(X) 的结果进行比较来检查我的代码,它们匹配 - 即 sum(X_norm - zscore(X)) 返回 0 0。

我被迫不使用 zscore(),因此出现了这个问题。

示例数据如下:

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

你可以简单地做:

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

在交叉验证期间面临零除法问题。 这对我有用。

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;

我想你可以为 N 个特征应用一个 for 循环。

X_norm = X;
mu = zeros(1, size(X, 2));
sigma = zeros(1, size(X, 2));

for iter = 1:num_iters;
  mu(1,iter) = mean(X_norm(:,iter)); 
  X_norm(:,iter) = X_norm(:,iter) .- mu(1,iter);
  
  sigma(1,iter) = std(X_norm(:,iter));  
  X_norm(:,iter) = X_norm(:,iter) ./ mu(1,iter); 
end