R:集群算法的特殊要求

R:集群算法的特殊要求,r,cluster-analysis,R,Cluster Analysis,我正在研究R中的一个聚类问题,但我的需求与迄今为止在文献或语言中找到的任何东西都大不相同。我的数据并不复杂:它基本上是一个包含纬度、经度和时间值的三列数据框。以下是前几行: myDF <- data.frame(latitude=c(34.11119,34.11148,34.11119,34.11119,34.11148) ,longitude=c(-84.34192,-84.34192,-84.34234,-84.34192,-84.34234)

我正在研究R中的一个聚类问题,但我的需求与迄今为止在文献或语言中找到的任何东西都大不相同。我的数据并不复杂:它基本上是一个包含纬度、经度和时间值的三列数据框。以下是前几行:

myDF <- data.frame(latitude=c(34.11119,34.11148,34.11119,34.11119,34.11148)
                  ,longitude=c(-84.34192,-84.34192,-84.34234,-84.34192,-84.34234)
                  ,date_value=c(0.07820023,.08092014,.04058449,.08755208,.04478588))
我的基本需要是找到由空间和时间上紧密相连的点组成的小簇,并从绝大多数数据中分别观察这些点

以下是我想要的东西和我能找到的东西之间的两个区别:

我不在乎99%的数据。更确切地说,我只想得到总体数据的一个子空间,即最紧密的集群。我最初设想了一种进行部分聚类的算法,该算法贪婪地将数据点合并到集群中,直到完成了一定数量的迭代,或者达到了一定数量的子集群,但我不知道有哪一个包能够专门做到这一点:交叉聚类是一种假定可以进行交叉聚类的算法,但是我没有太多的运气让代码运行。我一直在研究的另一种方法是运行像HClust这样的分层聚类算法,只从树中获取最低的分支,但我在恢复我想要的数据时遇到了问题,即,观察值或组成聚类的它们的某个标识符,还有一种尺寸/密度类型的测量方法,可以让我把紧密的星团和松散的星团分开

我从现有软件包中获得的集群类型输出非常适合在绘图上显示集群,但我想将其合并到原始数据帧中,这样我就可以将合并到紧密集群中的观察结果与其他数据进行比较


有人能帮忙吗?我精通R编程和数据科学,但到目前为止我还不太熟悉聚类技术。

当然,我们无法对五个数据点进行任何聚类 您提供的,所以我将使用一些人工 数据我将简单地使用x和y坐标,类似的 到你的lat lon,跳过时间部分,但相同 这件事在你的三维案例中会起作用。我的人造 数据有50个背景噪声点和两个簇,其中一个具有 20分,另一个30分。30点集群是 比20点群集稍微松一点

我们可以使用各种集群获得您想要的分组 算法。你提到了hclust所以我会用它 还将演示如何使用dbscan。两者都需要一些调整

人工数据

hclust

用盐酸处理。我选择使用单一链接 确定距离的方法。还有,我有点武断 要求它分成47个集群。其中大部分应该是 我们将消除一个点簇作为噪声。我们 希望得到两个重要的集群。你需要 对数据进行实验,以找到大量可用的集群

HCS = hclust(dist(df), method='single')
HC47 = cutree(HCS, 47)
table(HC47)

HC47
 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
 2  1 28  2  1  1 22  1  1  1  1  2  2  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  2  1  1  1 
我们看到集群3和集群7很大,其他所有集群都很小。 我们可以重新标记集群,以便所有小集群 作为噪音分组在一起

Tight1 =rep(1,100)
Tight1[HC47 == 7]  = 2
Tight1[HC47 == 3] = 3
plot(df, pch=20, col=Tight1)
当然,可以将Tight 1存储为点所在位置的标签 两个集群和噪音

DBSCAN

DBSCAN是一种很好的聚类方法。你不需要选择 集群的数量,它专门为一些 点作为噪音。您确实需要选择一个参数 基本上确定了将用于确定的局部密度 如果点是簇的一部分或噪波的一部分

library(dbscan)
DBS = dbscan(dist(df), eps=0.9)
table(DBS$cluster)
 0  1  2 
49 29 22 
Clust 0中的点是噪波点。所以我们看到了 DBS可以发现两个大簇和49个噪声点

Tight2 = DBS$cluster+1
plot(df, pch=20, col=Tight2)

您可以将Tight2存储为groupings 2 Cluster或noise。

您的问题不是关于代码,我认为它会很适合。然而,您如何定义……整个数据的一个子空间,即最紧密的集群?
Tight2 = DBS$cluster+1
plot(df, pch=20, col=Tight2)