除了位置之外,我还可以将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)
答案 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,并简单地“破解”二进制距离矩阵:
速度相当快,但需要O(n ^ 2)内存。根据我的经验,如果你有更大的数据,ELKI的索引会产生很好的加速,如果你的内存或时间不足,值得一试。
答案 1 :(得分:0)
您需要扩展数据。 V3的范围远大于V1和V2的范围,因此DBSCAN目前大多忽略V3。