MATLAB: clustering basé sur la distance euclidienne avec un nombre prédéterminé de membres

Bonjour à tous
J’ai un point de données qui contient des points dans la coordonnée 2D et je souhaite regrouper ces points en fonction de la distance minimale entre eux et le groupe K. Chaque cluster aura un nombre prédéterminé de membres, par exemple cinq membres, comme l’image suivante. Notez que les points de données restants ne seront pas regroupés.
Y a-t-il une fonction chez Matlab qui m’aide?

Meilleure réponse

  • Vous pouvez facilement 😉 écrire votre propre boucle pour le faire. Commencez simplement par la paire de points la plus proche et continuez d’affecter des voisins proches à ce cluster jusqu’à ce que vous atteigniez le nombre requis de voisins dans le cluster. Incrémentez ensuite le numéro de cluster de répétition pour trouver le cluster suivant. Continuez jusqu’à ce que tous les points soient partis (épuisés).
     

    clc; % Clear the command window.
    fprintf('Beginning to run %s.m.\n', mfilename);
    close all; % Close all figures (except those of imtool.)
    clear; % Erase all existing variables. Or clearvars if you want.
    workspace; % Make sure the workspace panel is showing.
    format long g;
    format compact;
    fontSize = 22;
    numPoints = 200;
    pointsPerCluster = 5;
    numClusters = ceil(numPoints / pointsPerCluster)
    coordinates = zeros(pointsPerCluster, 2, numClusters);
    t = table(zeros(numPoints, 1), zeros(numPoints, 1), zeros(numPoints, 1), zeros(numPoints, 1), 'VariableNames', {'ClusterNumber', 'PointNumber', 'x', 'y'});
    xy = rand(numPoints, 2);
    x = xy(:, 1);
    y = xy(:, 2);
    subplot(1, 2, 1);
    plot(x, y, 'b.', 'MarkerSize', 14);
    grid on;
    % Get distances of every point to every other point

    distances = pdist2(xy, xy);
    minDistance = min(distances(distances~=0))
    [row, col] = find(distances == minDistance)
    currentRow = row(1) % Get first point.

    pointer = 1;
    for k = 1 : numClusters
    % Get distances of every point to every other point
    distances = pdist2(xy, xy(currentRow, :));
    % Find the closest points.
    minDistances = mink(distances, pointsPerCluster);
    [ia, ib] = ismember(distances, minDistances);
    rows = find(ib);
    % Store these coordinates as cluster #k
    for n = 1 : length(rows)
    t.ClusterNumber(pointer) = k;
    t.PointNumber(pointer) = n;
    t.x(pointer) = xy(rows(n), 1); % Store x value.
    t.y(pointer) = xy(rows(n), 2); % Store y value.
    pointer = pointer + 1;
    end
    if pointer >= numPoints
    break; % Quit when all points are used up
    end
    % Set the current row coordinates to infinity so we know not to consider (use) them again.
    xy(rows, :) = inf;
    % Get new cluster -- new starting point.
    % Get distances of every point to every other point
    distances = pdist2(xy, xy);
    minDistance = min(distances(distances~=0));
    [row, col] = find(distances == minDistance);
    currentRow = row(1); % Get first point.
    end
    % Show clusters in unique colors
    subplot(1, 2, 2);
    gscatter(t.x, t.y, t.ClusterNumber);