DBSCAN具有附加功能的群集

时间:2016-08-31 11:53:28

标签: r apache-spark cluster-analysis dbscan

除了位置之外,我还可以将DBSCAN应用于其他功能吗?如果它可用,怎么可以通过R或Spark完成?

我尝试准备一个3列的R表,用于纬度,经度和分数(除了空间特征之外我想要聚类的特征),当尝试使用以下R代码运行DBSCAN时,我得到以下情节告诉该算法在每对列(长,纬),(长,得分),(纬度,分数),......上制作聚类。

我的R代码:

df = read.table("/home/ahmedelgamal/Desktop/preparedData")
var = dbscan(df, eps = .013)
plot(x = var, data = df)

我得到的情节: enter image description here

2 个答案:

答案 0 :(得分:2)

你误解了情节。

每个绘图没有得到一个结果,但所有绘图都显示相同的群集,只有不同的属性。

但你也有一个问题,即R版本(据我所知)只能快速 Euclidean 距离。

在您当前的代码中,如果(lat[i]-lat[j])^2+(lon[i]-lon[j])^2+(score[i]-score[j])^2 <= eps^2,则点是邻居。这很糟糕,因为:1。纬度和经度不是欧几里得,你应该使用半径,2。你的附加属性大得多,因此你几乎只有得分接近零的聚类点 ,3)你的分数属性是偏斜的。

对于这个问题,您应该使用广义DBSCAN 。如果它们的半径距离小于例如,则点是相似的。 1英里(你想在这里测量地理距离,而不是坐标,因为失真),如果他们的得分相差 factor 最多为1.1(即比较score[y] / score[x]或在logspace中工作? )。由于您希望两个 conditipns保持不变,通常的Euclidean DBSCAN实现还不够,但您需要一个允许多个条件的通用DBSCAN。寻找广义DBSCAN的实现(我相信ELKI中有一个你可以从Spark访问的id),或者自己实现它。这不是很难。

如果二次运行时没问题,你可以使用任何基于距离矩阵的DBSCAN,并简单地“破解”二进制距离矩阵:

  1. 计算Haversine距离
  2. 计算得分差异
  3. distance = 0如果是hasrsine&lt;距离阈值和得分差异&lt;得分阈值,否则为1。
  4. 使用预先计算的距离矩阵和eps = 0.5运行DBSCAN(因为它是二进制矩阵,不要更改eps!)
  5. 速度相当快,但需要O(n ^ 2)内存。根据我的经验,如果你有更大的数据,ELKI的索引会产生很好的加速,如果你的内存或时间不足,值得一试。

答案 1 :(得分:0)

您需要扩展数据。 V3的范围远大于V1和V2的范围,因此DBSCAN目前大多忽略V3。