2

私が尋ねた最後の質問は、データを x 座標でビン化する方法に関するものでした。解決策はシンプルかつエレガントでした。この質問は難しいかもしれません (または私が盲目なだけかもしれません)。

約 140000 のデータ ポイントから始めて、それらを x 軸に沿って等間隔の 70 のグループに分割し、次に各グループの平均位置 (x_avg、y_avg) を取得してプロットしました。素敵な曲線が現れました。残念ながら、2 つの問題があります。まず第一に、エッジはグラフの中心よりもはるかに少ないです。第二に、一部の領域は他の領域よりも大きく変化するため、より良い解像度が必要です。

したがって、私は 2 つの特定の質問と提案を投げるための一般的な招待状を持っています。

matlabには、行列を固定数の小さな行列または固定サイズの小さな行列に分割する組み込みの方法がありますか?

関心領域をより細かくビン化するために必要な境界を決定するためのアルゴリズム (または matlab 関数ですが、それはありそうにないと思います) はありますか?

より一般的に言えば、何万ものデータポイントをきちんとした傾向に凝縮するより良い方法はありますか?

4

2 に答える 2

2

x値の密度に応じてサイズが異なるビンを使用したいようです。以前の投稿への回答のように関数 HISTC を引き続き使用できると思いますが、別のエッジのセットを与えるだけで済みます。

これがまさにあなたが望むものかどうかはわかりませんが、ここに 1 つの提案があります。x 軸を 70 の等間隔のグループに分割する代わりに、並べ替えられた x データを 70 の等間隔のグループに分割し、エッジの値を決定します。このコードは機能するはずだと思います:

% Start by assuming x and y are vectors of data:

nBins = 70;
nValues = length(x);
[xsort,index] = sort(x);  % Sort x in ascending order
ysort = y(index);         % Sort y the same way as x
binEdges = [xsort(1:ceil(nValues/nBins):nValues) xsort(nValues)+1];

% Bin the data and get the averages as in previous post (using ysort instead of y):

[h,whichBin] = histc(xsort,binEdges);

for i = 1:nBins
    flagBinMembers = (whichBin == i);
    binMembers = ysort(flagBinMembers);
    binMean(i) = mean(binMembers);
end

これにより、データ密度に応じてサイズが異なるビンが得られます。


更新: 別のバージョン...

いくつかのコメントの後、私が思いついた別のアイデアがあります。このコードでは、x 内の隣接するデータ ポイント間の差のしきい値 (maxDelta) を設定します。maxDelta 以上の量でより大きな隣人と異なる x 値は、強制的に独自のビンに入れられます (すべて孤独によって)。nBins の値を引き続き選択しますが、展開されたポイントが独自のビンに追いやられると、ビンの最終的な数はこの値よりも大きくなります。

% Start by assuming x and y are vectors of data:

maxDelta = 10; % Or whatever suits your data set!
nBins = 70;
nValues = length(x);
[xsort,index] = sort(x);  % Sort x in ascending order
ysort = y(index);         % Sort y the same way as x

% Create bin edges:

edgeIndex = false(1,nValues);
edgeIndex(1:ceil(nValues/nBins):nValues) = true;
edgeIndex = edgeIndex | ([0 diff(xsort)] >= maxDelta);
nBins = sum(edgeIndex);
binEdges = [xsort(edgeIndex) xsort(nValues)+1];

% Bin the data and get the y averages:

[h,whichBin] = histc(xsort,binEdges);

for i = 1:nBins
    flagBinMembers = (whichBin == i);
    binMembers = ysort(flagBinMembers);
    binMean(i) = mean(binMembers);
end

いくつかの小さなサンプル データ セットでこれをテストしたところ、本来の動作をしているようです。うまくいけば、それが含まれているものは何でも、あなたのデータセットでもうまくいくでしょう! =)

于 2009-01-09T15:30:55.433 に答える
1

私は matlab を使用したことがありませんが、以前の質問を見ると、Kdtreeまたはバリエーションに沿ったものを探しているのではないかと思われます。

明確化:これについて混乱があるように思われるので、疑似コードの例が適切であると思います。

// Some of this shamelessly borrowed from the wikipedia article
function kdtree(points, lower_bound, upper_bound) {
    // lower_bound and upper_bound are the boundaries of your bucket
    if(points is empty) {
        return nil
    }
    // It's a trivial exercise to control the minimum size of a partition as well
    else {
        // Sort the points list and choose the median element
        select median from points.x

        node.location = median;

        node.left = kdtree(select from points where lower_bound < points.x <= median, lower_bound, median);
        node.right = kdtree(select from points where median < points.x <= upper_bound, median, upper_bound);

        return node
    }
}

kdtree(points, -inf, inf)

// or alternatively

kdtree(points, min(points.x), max(points.x))
于 2009-01-09T06:31:57.027 に答える