سؤال

السؤال الأخير الذي طرحته يتعلق بكيفية تجميع البيانات بواسطة تنسيق x.وكان الحل بسيطًا وأنيقًا، وأشعر بالخجل لأنني لم أره.قد يكون هذا السؤال أصعب (أو ربما أكون أعمى فقط).

لقد بدأت بحوالي 140000 نقطة بيانات وقسمتها إلى 70 مجموعة متباعدة بشكل متساوٍ على طول المحور x ثم أخذت الموضع المتوسط ​​(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

من المفترض أن يمنحك هذا صناديق تختلف في الحجم مع كثافة البيانات.


تحديث:نسخة أخرى...

إليك فكرة أخرى خطرت ببالي بعد بعض التعليقات.باستخدام هذا الرمز، يمكنك تعيين عتبة (maxDelta) للفرق بين نقاط البيانات المجاورة في x.أي قيم x تختلف عن جارتها الأكبر بمقدار أكبر من أو تساوي maxDelta يجب أن تكون في سلة المهملات الخاصة بها (كل ذلك بمفردها).لا يزال بإمكانك اختيار قيمة لـ 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 أبدًا ولكن من خلال النظر إلى سؤالك السابق أظن أنك تبحث عن شيء على غرار ملف كيدتري أو الاختلاف.

إيضاح: نظرًا لوجود بعض الالتباس حول هذا الأمر، أعتقد أن مثال الكود الكاذب مناسب.

// 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