我想用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。
我不得不不使用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发布于 2017-05-09 23:30:57
你可以简单地做:
X_norm = (X .- mean(X,1)) ./ std(X,0,1);发布于 2017-12-27 22:52:20
在交叉验证过程中,面临着零分割问题。这对我有用。
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;发布于 2021-04-14 03:31:33
我认为您可以为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);
endhttps://stackoverflow.com/questions/43863576
复制相似问题