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