R:聚类算法的特殊要求

时间:2018-10-11 18:28:41

标签: 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)
                  ,date_value=c(0.07820023,.08092014,.04058449,.08755208,.04478588))

我的基本需求是找到观察点,这些观察点组成的点在空间和时间上紧密相连,并与绝大多数数据分开查看。

这是我想要的东西和已经找到的东西之间的两个区别:

  1. 我不在乎99%的数据。相反,我只想获得整体数据中很小的子空间,这些子空间是最紧密的集群。我最初设想的是一种算法,该算法会进行部分聚类,将所有数据点贪婪地合并到聚类中,直到完成一定数量的迭代或达到一定数量的子类为止,但是我不知道一个具体能够做到这一点的程序包(交叉-clustering是一种应该进行跨集群的算法,但是运气不好让我无法运行代码)。我一直在寻找的另一种方法是运行像HClust这样的分层聚类算法,仅从树中获取最低的分支,但是我在恢复想要的数据时遇到了麻烦,即观察值(或它们的某些标识符)组成簇,并通过尺寸/密度类型度量将“紧密”簇与“松散”簇分开。

  2. 我从现有软件包中获得的聚类类型输出非常适合在绘图中向我显示聚类,但是我想将其合并到我的原始数据框中,以便我可以分离出一起观察的数据进入一个紧密的集群,而不是其余的数据。

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

1 个答案:

答案 0 :(得分:1)

当然,我们不能对五个数据点进行任何聚类 您提供的内容,所以我将举例说明如何使用人工 数据。我只是要使用x和y坐标,类似 到您的经纬仪,然后跳过时间部分,但是相同 事情将在您的三维情况下起作用。我的人造 数据有50个背景噪声点和两个聚类,一个聚类 20分,另外30分。 30点群集是 比20点群集要宽松一些。

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

人工数据

set.seed(123)
x = c(runif(50, -10,10), rnorm(20, 1, 0.5), rnorm(30, -3,1))
y = c(runif(50, -10,10), rnorm(20, 1, 0.5), rnorm(30, -3,1))
df = data.frame(x,y)
plot(df, pch=20)

Original Data

时髦

使用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)

hclust clustering

当然,您可以将“紧身1”存储为点在其中的标签 两个集群和噪音。

DBSCAN

DBSCAN是一种很好的群集方法。你不需要选择 集群的数量,它专门模拟了一些 点作为噪音。您确实需要选择一个参数eps 本质上决定了将用于确定的局部密度 点是集群的一部分还是噪声的一部分。

library(dbscan)
DBS = dbscan(dist(df), eps=0.9)
table(DBS$cluster)
 0  1  2 
49 29 22 

“簇0”中的点是噪声点。所以我们看到 DBSCAN发现了两个大型星团和49个噪声点。

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

DBScan clustering

您可以将Tight2存储为分组(2个群集或杂音)。