문제

내가 묻는 마지막 질문은 x 좌표로 데이터를 저장하는 방법에 관한 것입니다.해결책은 간단하고 우아했는데, 그것을 보지 못했다는 것이 부끄럽습니다.이 질문은 더 어려울 수도 있습니다(아니면 제가 눈이 먼 것일 수도 있습니다).

저는 약 140,000개의 데이터 포인트로 시작하여 이를 x축을 따라 동일한 간격으로 70개의 그룹으로 나눈 다음 각 그룹의 평균 위치(x_avg, y_avg)를 가져와 플롯했습니다.멋진 곡선이 나타났습니다.불행히도 두 가지 문제가 있습니다.우선, 가장자리는 그래프 중앙보다 인구가 훨씬 적습니다.둘째, 일부 영역은 다른 영역보다 더 많이 변화하므로 더 나은 해결이 필요합니다.

따라서 저는 두 가지 구체적인 질문과 제안을 던지라는 일반적인 초대를 받았습니다.

MATLAB에는 행렬을 고정된 수의 작은 행렬 또는 고정된 크기의 작은 행렬로 분할하는 기본 방법이 있습니까?

관심 영역을 더 세밀하게 비닝하는 데 필요한 경계를 결정하는 알고리즘(또는 matlab 함수이지만 가능성은 낮음)이 있습니까?

보다 일반적으로 수만 개의 데이터 포인트를 깔끔한 추세로 압축하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

x 값의 밀도에 따라 크기가 달라지는 저장소를 사용하려는 것 같습니다.이전 게시물에 대한 답변에서와 같이 HISTC 기능을 계속 사용할 수 있다고 생각하지만 다른 가장자리 세트를 제공해야 합니다.

이것이 정확히 당신이 원하는 것인지는 모르겠지만 여기에 한 가지 제안이 있습니다.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

나는 이것을 몇 가지 작은 샘플 데이터 세트에서 테스트했는데 예상대로 작동하는 것 같습니다.데이터 세트에 포함된 내용이 무엇이든 상관없이 작동할 수 있기를 바랍니다.=)

다른 팁

나는 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))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top