在散点图中识别两个总体

3

我正在使用单元格逐个绘制的简单散点图比较两个栅格,并发现我有两个看起来不同的人群:

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行,因此解决方案需要支持大型数据框。 有没有办法隔离这些组的任何想法?
谢谢


1
我不明白你想做什么。你想要什么结果?在你的原始图片中,看起来有很多重叠。你会如何解决这个问题?你只是试图凭眼睛将它们分开吗?还是你有一个“孤立群体”的数学定义? - MrFlick
2个回答

5

谱聚类在识别具有清晰边界的点集簇时非常有用。一个巨大的优势是它是无监督的,即不会过多依赖人为判断,尽管该方法运行速度较慢,并且需要提供一些超参数(例如簇数)。

以下是聚类的代码。在您的情况下,该代码需要几分钟的时间。

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

结果是两组点的明显分布图。obviously two groups of points

谢谢raymkchow,但我的原始数据有大约100万行,所以这种解决方案在这种情况下似乎不可行。 - Ilik
哦,那我们还需要一些更好的答案。您能否将此要求添加到问题中? - raymkchow

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接