1

次のデータセットがあります。

1列目から6列目

1.0000         0    0.9954   -0.0589    0.8524    0.0231
1.0000         0    1.0000   -0.1883    0.9304   -0.3616
1.0000         0    1.0000   -0.0336    1.0000    0.0049
1.0000         0    1.0000   -0.4516    1.0000    1.0000
1.0000         0    1.0000   -0.0240    0.9414    0.0653
1.0000         0    0.0234   -0.0059   -0.0992   -0.1195
1.0000         0    0.9759   -0.1060    0.9460   -0.2080
     0         0         0         0         0         0
1.0000         0    0.9636   -0.0720    1.0000   -0.1433

バイナリ分割を使用して決定木を構築しようとしています。問題の 1 つは、データが継続しており、現在の実装では、データをそのままにして分割を行うことで計算量が多くなることです。1 つの分類子を作成するだけの場合、これは非常に悪いことだと言わざるを得ません。

私の場合、10 倍にして分類器を 5 から 50 に増やしています (バギング)。データがバケットに 0.2 バケットになるような方法でビニングを行うことを考えていましたが、負の数があることに気付きました。実装にはmatlabを使用しています。私はMatlab NewBであり、このようなシナリオを処理するための事前定義メソッドがあるかどうかはわかりません.

4

1 に答える 1

1

これで質問が完全に解決するかどうかはわかりませんが、問題が「バケット」を動的に定義している場合は、これを実行できます。

% Find the minimum and maximum of the matrix
Mmin = min(M(:));
Mmax = max(M(:));

% Assume you have a matrix M with positive and negative values, and want it in bins of 0.2
buckets = Mmin:0.2:Mmax;

% OR assume you want to spread them equally over a fixed amount of bins, say 100
buckets = linspace(Mmin,100,Mmax);

編集:

1 つの列 (たとえば 3) の値に基づいて行列を分割したい場合、次のように行うことができます。

% Define the relevant column as a vector for easy handling
v = M(:,3);

% Assume you want to spread them equally over a fixed amount of bins, say 100
buckets = linspace(min(v),100,max(v));
% Now see which column belongs in each bucket
bucket_idx = ones(size(v));
for i = 2:length(buckets)
    bucket_idx(v>buckets(i-1)&(v<buckets(i)) = i;
end

これは、各行がどのバケットに属しているかを示します。これをベクトル化する方が良いでしょうが、現時点ではこれが私が考えることができる最も速い解決策です。すべてがどのバケットに属しているかがわかれば、残りの問題を解決できるはずです。

于 2012-11-19T17:07:10.167 に答える