2013-03-12 91 views
0

我使用的命令MATLAB - bsxfun负值

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

进行归一化数据集我试了两个不同的数据集此功能。一个也有负面的价值。其他人没有。没有负值的数据集在0和1之间完美归一化。具有负值的那个没有正确标准化。这可以解决吗?有没有另一种方法我可以正常化数据集与负值?

回答

3

罪魁祸首在于你的正常化。你从X减去min(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

希望这会有所帮助!

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是小数据,所以我尝试使用更大的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。然而,在这两种情况下,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. 

任何提示?