0

我正在使用命令规范化数据集

X=bsxfun(@times,bsxfun(@minus,X,min(X,[],1)),1./max(X,[],1))

我在两个不同的数据集上尝试了这个函数。一个也有负值。其他人没有。没有负值的数据集在 0 和 1 之间完美归一化。并且具有负值的那个没有正确规范化。这可以解决吗?还有另一种方法可以用负值规范化数据集吗?

4

2 回答 2

3

罪魁祸首在于你的正常化。您减去然后除以min(X),而不是除以。Xmax(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. 您可以使用 ,而不是使用timesinbsxfun来乘以。1 ./ max(Y)rdivide

希望这可以帮助!

于 2013-03-12T13:12:40.203 回答
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 是要走的路。但它可能会发生 arrayfun 更快,因为 X 是小数据,所以我尝试使用更大的 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

这让我很困惑。如果您X=magic(3)在 for 循环之外再次计算,则更多,并且 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.

有什么提示吗?

于 2013-03-13T09:04:58.030 回答