r在散点图中识别两个群体

时间:2017-07-07 16:48:52

标签: r subset scatter-plot raster

我将两个栅格与逐个细胞图的简单散点图进行比较,发现我有两个看似不同的人群:

true scatterplot

现在我正在尝试提取每个群体的位置(通过隔离行ID,例如),这样我就可以看到它们落入栅格的位置,也许可以理解为什么我会得到这种行为。这是一个可重复的例子:
X <- seq(1,1000,1)
Z <- runif(1000, 1, 2)
A = c(1.2 * X * Z + 100)
B = c(0.6 * X * Z )
df = data.frame(X = c(X,X), Y = c(A,B))
plot(df$X,df$Y)
sample scatter
此外,我的原始数据有大约1,000,000行,因此解决方案也需要支持大型数据帧。 关于如何隔离这些群体的任何想法? 感谢

2 个答案:

答案 0 :(得分:5)

光谱聚类可用于识别具有清晰边界的点群。一个很大的优点是它是无人监督的,即不依赖于人类判断,尽管该方法很慢并且需要提供一些超参数(例如,簇的数量)。

以下是群集的代码。在您的情况下,代码大约需要几分钟。

library(kernlab)
specc_df <- specc(as.matrix(df),centers = 2)
plot(df, col = specc_df)

结果是两个点集的明显情节。 obviously two groups of points

答案 1 :(得分:3)

您的数据具有线性分隔线。你可以找到它:

plot(df$X,df$Y)
Pts = locator(2)

您需要点击两个组之间的一个点,然后是最右侧(组之间)。有你的数据

Pts
$x
[1]   0.8066296 994.9723687
$y
[1]   48.56932 1255.32870

## Slope
(Pts$y[2] - Pts$y[1]) / (Pts$x[2] - Pts$x[1])
[1] 1.213841

## Draw the line to confirm 
abline(48,1.2, col="red")

## use the line to distinguish the groups
Group = rep(1, nrow(df))
Group[df$X*1.2 + 48 < df$Y] = 2
plot(df, pch=20, col=Group)

Plot