特征缩放的矢量化

时间:2017-05-09 07:20:31

标签: octave vectorization

我想要将带有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

3 个答案:

答案 0 :(得分:3)

你可以这样做:

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

答案 1 :(得分:0)

在交叉验证过程中面临零分割问题。 这对我有用。

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;

答案 2 :(得分:0)

我认为您可以为 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