Eh bien, je ne poste pas seulement une idée mais je publie du code réel. J'espère que vous pouvez voir si cela fonctionne pour vous. Votre problème tombe essentiellement dans le domaine de l'analyse de cluster.
Vous souhaitez identifier les différents groupes de données présents dans votre ensemble de données et qui forment un cluster. Heureusement pour vous, ce problème a déjà quelques méthodes à résoudre, et il y a même un paquetage NPM qui vous permet d'exécuter certains des outils d'analyse de cluster bien connus.J'ai choisi DBSCAN pour résoudre votre ensemble de points, n'hésitez pas à essayer un autre algorithme si vous pensez avoir besoin d'autre chose. https://en.wikipedia.org/wiki/DBSCAN
J'ai utilisé la bibliothèque de clustering de densité de NPM. https://github.com/LukaszKrawczyk/density-clustering
Les paramètres arbitraires donnés à dbscan étaient pour le rayon de voisinage et pour le nombre minimum de points à être considéré comme un « cluster »
Et le code est une version modifiée de l'exemple donné dans la page github du paquetage NPM.
var sample = [ { x: 39, y: 28 },
{ x: 69, y: 33 },
{ x: 51, y: 51 },
{ x: 14, y: 63 },
{ x: 75, y: 140 },
{ x: 171, y: 68 },
{ x: 140, y: 53 },
{ x: 173, y: 150 },
{ x: 123, y: 179 },
{ x: 103, y: 150 },
{ x: 145, y: 119 },
{ x: 92, y: 85 },
{ x: 58, y: 49 },
{ x: 28, y: 65 },
{ x: 41, y: 39 },
{ x: 46, y: 41 },
{ x: 49, y: 51 },
{ x: 43, y: 55 },
{ x: 35, y: 48 },
{ x: 29, y: 31 },
{ x: 68, y: 22 },
{ x: 58, y: 39 } ];
/* Transform your dataset to the format expected by the library */
var dataset = [];
for(var i=0; i<sample.length; i++){
dataset.push([sample[i].x, sample[i].y]);
}
var clustering = require('density-clustering');
var dbscan = new clustering.DBSCAN();
/* parameters:
20 - neighborhood radius
5 - number of points in neighborhood to form a cluster
*/
var clusters = dbscan.run(dataset, 20, 5);
if(clusters.length > 0){
/* Find the biggest cluster */
var biggestCluster = clusters[0];
for(i=1;i<clusters.length;i++){
if(cluster[i].length > biggestCluster.length){
biggestCluster = cluster[i];
}
}
/* The output of the library contains the indexes of the points in the cluster, not the coordinates, so we need to get the point from the dataset */
var clusterPoints = [];
var sumx = 0;
var sumy = 0;
for(i=0;i<biggestCluster.length;i++){
var point = dataset[biggestCluster[i]];
clusterPoints.push(point);
/* It's also a good opportunity to cumulate x and y so we can get the average */
sumx+=point[0];
sumy+=point[1];
}
console.log('Cluster:', clusterPoints);
console.log('Center:', sumx/clusterPoints.length, sumy/clusterPoints.length);
}
else{
console.log('No clusters');
}
La sortie de ce programme sera:
Cluster: [ [ 51, 51 ], [ 58, 49 ], [ 41, 39 ], [ 46, 41 ], [ 49, 51 ], [ 43, 55 ], [ 35, 48 ], [ 58, 39 ], [ 69, 33 ], [ 39, 28 ], [ 29, 31 ], [ 28, 65 ], [ 68, 22 ] ]
Center: 47.23076923076923 42.46153846153846
@Igor ne traine pas seulement le gars si vous n'avez pas la question ... pour le reste d'entre nous est assez clair que il veut ... de la malédiction j'ai voté cette question. –