我正在使用以下命令对数据集进行规范化
X=bsxfun(@times,bsxfun(@minus,X,min(X,[],1)),1./max(X,[],1))我在两个不同的数据集上尝试了这个函数。其中一个也有负值。其他人没有。没有负值的数据集在0到1之间得到了完美的归一化。具有负值的那个没有正确归一化。这个问题能解决吗?有没有其他方法可以将数据集归一化为负值?
发布于 2013-03-12 21:12:40
罪魁祸首在于你的规范化。从X中减去min(X),然后除以max(X),而不是除以max(X - min(X))。
你应该做的是把它分成两个步骤:
Y = bsxfun(@minus, X, min(X));
X_normalized = bsxfun(@rdivide, Y, max(Y));请注意,无论对于正值还是负值,这都不能正常工作。
还有一些注意事项:
min(X, [], 1)可以缩写为min(X)。同样的道理也适用于在max.times乘以1 ./ max(Y),您可以使用rdivide.希望这能有所帮助!
发布于 2013-03-13 17:04:58
好吧,这篇文章真的让我很不安。
我从来没听说过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是小数据,所以我尝试使用更大的X (X = magic(100);),因此可能会发生arrayfun更快的情况。当然,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。然而,它在两种情况下都更快,并且需要更多的时间来计算集合的第一次。
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循环和bsxfun之外再次使用X=magic(3)进行计算,则总是比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.有什么提示吗?
https://stackoverflow.com/questions/15361988
复制相似问题