An alternative to using a clustering method would be to try one of the nonlinear filters. In this case, the MeanShiftFilter
might be useful:
ListPlot[MeanShiftFilter[Flatten[cloudList, 1], 500, 0.5]]
This uses a sliding window approach and finds all the points in the neighborhood and then averages only those within the 0.5 radius. While this doesn't give you exact values, presumably you could quantize the resulting small blobs without too much trouble. You can get qualitatively the same results using the BilateralFilter
as well:
BilateralFilter[Flatten[cloudList, 1], 200, 0.2]