MATLAB - 负值的bsxfun

时间:2013-03-12 13:01:14

标签: matlab normalization bsxfun

我正在使用命令

规范化数据集
X=bsxfun(@times,bsxfun(@minus,X,min(X,[],1)),1./max(X,[],1))

我在两个不同的数据集上尝试了这个功能。一个人也有负面价值观。其他人没有。没有负值的数据集在0和1之间完全归一化。负值的那个没有正确归一化。这可以修复吗?还有另一种方法可以用负值对数据集进行标准化吗?

2 个答案:

答案 0 :(得分:3)

罪魁祸首在于你的正常化。您从min(X)中减去X,然后除以max(X),而不是除以max(X - min(X))

您应该做的是将其分为两个步骤:

Y = bsxfun(@minus, X, min(X));
X_normalized = bsxfun(@rdivide, Y, max(Y));

请注意,无论如何,无论是正面还是负面,这都无法正常工作。

还有一些说明:

  1. min(X, [], 1)可缩短为min(X)max也是如此。
  2. 您可以使用times,而不是bsxfun中的1 ./ max(Y)乘以rdivide,而不是{{1}}。
  3. 希望这有帮助!

答案 1 :(得分:0)

好的,这篇文章真让我感到不安。

我从未听说过bsxfun。我使用的是arrayfun,cellfun,structfun。所以我徘徊为什么要使用它,我认为在速度上我会找到答案。所以我做了一个愚蠢的测试:

X = magic(3);
tic
Y = bsxfun(@minus, X, min(X(:)));
X_normalized = bsxfun(@rdivide, Y, max(Y(:)));
toc

tic
arrayfun(@(x) x-min(X(:))./(max(X(:))-min(X(:))),X);
toc

我得到了答案:

Elapsed time is 0.004130 seconds.
Elapsed time is 0.002468 seconds.

,这让我觉得arrayfun是最好的选择。但是由于X是小数据这一事实,arrayfun只会更快,所以我尝试使用更大的X(X = magic(100);)。当然,bsxfun要快得多,这意味着我需要重新编写一些东西。

Elapsed time is 0.003342 seconds.
Elapsed time is 0.395347 seconds.

然而,对于调查结果不够满意,我决定多次进行测试,以确保它不是偶然性。这就是它开始变得令人不安的时候。

test= repmat({zeros(2,10)},2,1);
Xsizes = [3 100];
for ii=1:2,for jj=1:10
X = magic(Xsizes(ii));
tic
Y = bsxfun(@minus, X, min(X(:)));
X_normalized = bsxfun(@rdivide, Y, max(Y(:)));
test{ii}(1,jj)=toc;


tic
arrayfun(@(x) x-min(X(:))./(max(X(:))-min(X(:))),X);
test{ii}(2,jj)=toc;

end;end

display('small Size data')
test{1}
display('Big Size data')
test{2}

对于小数据而言,答案预计会更快地使用arrayfun,而对于大数据而言,更快的bsxfun会更快。然而,在两种情况下它都是更快的bsxfun,并且需要更多时间来计算集合的第一次。

small Size data

ans =

   1.0e-03 *

    0.4900    0.0470    0.0430    0.0410    0.0410    0.0420    0.0420    0.0410    0.0420    0.0410
    0.6600    0.4200    0.4040    0.3890    0.3920    0.3900    0.3920    0.3890    0.3960    0.3900

Big Size data

ans =

    0.0003    0.0001    0.0001    0.0001    0.0001    0.0001    0.0002    0.0001    0.0001    0.0001
    0.3853    0.3871    0.3846    0.3855    0.3874    0.3844    0.3863    0.3840    0.3860    0.3853

这让我感到困惑。如果你在for循环之外再次使用X=magic(3)进行计算,那么更多,而bsxfun总是需要超过arrayfun。

Elapsed time is 0.004891 seconds.
Elapsed time is 0.002008 seconds.



Elapsed time is 0.003181 seconds.
Elapsed time is 0.001994 seconds.



Elapsed time is 0.003109 seconds.
Elapsed time is 0.002008 seconds.

任何提示?