0

コマンドを使用してデータセットを正規化しています

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

この関数を 2 つの異なるデータ セットで試しました。1 つは負の値も持っていました。他の人はしませんでした。負の値のないデータセットは、 0 と 1 の間で完全に正規化されました。また、負の値を持つものは適切に正規化されていませんでした。これは修正できますか? データセットを負の値で正規化する別の方法はありますか?

4

2 に答える 2

3

犯人はあなたの正規化にあります。で割るのではなく、から引いmin(X)てからで割ります。Xmax(X)max(X - min(X))

あなたがすべきことは、これを2つのステップに分割することです:

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

とにかく、正の値でも負の値でも、これは適切に機能しなかったことに注意してください。

さらにいくつかのメモ:

  1. min(X, [], 1)に短縮できますmin(X)。についても同様ですmax
  2. timesin を使用しbsxfunて を乗算する代わりに、 を使用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が進むべき道であることがわかりました。しかし、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.

ヒントはありますか?

于 2013-03-13T09:04:58.030 に答える