【发布时间】:2018-08-01 18:20:02
【问题描述】:
我有一个坐标列表coord,绘制时看起来像这样:
我想从数据集中删除完全从 0 到 1 的长串点,如图所示,从 (0, 11) 开始,到 (1, 11) 结束,另一个开始于(0, 24) 并在 (1, 28) 处结束。
到目前为止,我已经尝试使用 kmeans 使用以下代码按高度对数据进行分组:
jet = colormap('jet');
amount = 20;
step = floor(numel(jet(:,1))/amount);
idxOIarr = cell(numel(terp));
scale = 100;
for ii = 1:numel(terp)
figure;
hold on;
expandDat = [stretched{ii}(:,1), scale.*log(terp{ii}(:,2))];
[idx, cent] = kmeans(expandDat(:,1:2), amount, 'Distance', 'cityblock');
idxOIarr{ii} = idx;
for jj = 1:amount
scatter(stretched{ii}(idx == jj,1), FREQ(terp{ii}(idx == jj,2)), 10, jet(step*jj,:), 'filled');
end
end
导致此图像: 尽管它确实很好地分隔了较高的行,但它会将中间的行分成两部分,并将从 (0,20) 开始的行与其下方的一些数据点分组。
还有其他方法可以对这些点进行分组和删除吗?
【问题讨论】:
-
您想根据距离对点进行分组。使用 R-tree 找到每个点的最近邻居。这将为您提供一个图表,其中您认为“连接”的每两个点都由一条边连接。接下来,在图中找到从一侧延伸到另一侧的连通分量。
-
嗨@CrisLuengo,感谢您的回复。如果你有时间,你能在解释的地方回答吗?我以前从未听说过 R-trees,并且不确定如何实施您的建议。
标签: matlab scatter-plot