Based on the data you provide, it seems that hierarchical clustering (see [wiki][1] here) with type "agglomerate" (bottom up) solves your problem, i.e.: out = FindClusters[data, 6, Method -> "Agglomerate"]; ListPointPlot3D[out] and get: ![enter image description here][2] Based on how your full dataset looks like (e.g. if you know how many clusters there are etc.), you might need to adapt the code a bit (possibly also with distance function or matrix) - but for the sample you are providing, it seems to work nicely. Also, performance **could** be an issue, as noted in the wiki article. [1]: http://en.wikipedia.org/wiki/Hierarchical_clustering [2]: https://i.sstatic.net/GMEwl.jpg