有很多关于空间点图案的测试,可用于确定点是否随机分布,但是是否有针对空间线图案的既定测试? (我在考虑直线,只有起点和终点,没有中间节点。)

我要分析的数据是人和动物运动的OD(原点)线。 (类似于聚类无向线中的示例。)到目前为止,一个想法是像4D点一样对待线并使用点模式测试,但是我不确定是否合适。

理想的测试可以确定是否存在线簇。

本能上,我想说许多始于相同起点但具有各种不同目的地的线路不应被视为集群。另一方面,许多并行运行(接近)较长时间的线将是一个群集。


评论

如果一条线与另一条线平行但1)比第一条线短得多或2)在第一条线的方向上“相距较远”,您应该怎么做

@radouxju在这种情况下,我会说它们不属于同一个簇

#1 楼

这是一个困难的问题,因为针对线要素开发的空间过程统计数据很少(如果有的话)。如果不认真研究方程式和代码,则点过程统计信息将不易应用于线性特征,因此在统计上是无效的。这是因为测试给定模式的空值是基于点事件,而不是随机字段中的线性相关性。我不得不说,就强度和排列/方向而言,要变得更加困难,我什至不知道零值是什么。

我只是在这里吐口水,但是,我想知道是否线密度与欧几里得距离(如果线很复杂,则为Hausdorff距离)的多尺度评估不会表示连续的聚类度量。然后可以使用方差考虑长度差异来将此数据汇总为线向量(Thomas 2011),并使用统计数据(例如K均值)分配聚类值。我知道您不是在分配集群之后,但是集群值可能会划分集群的程度。显然,这将需要k的最佳拟合,因此不会分配任意簇。我认为这将是一种在图论模型中评估边缘结构的有趣方法。

很抱歉,这是R中的一个可行示例,但是比提供QGIS示例更快,更可重复,并且在我的舒适范围内还可以:)

添加库并使用spatstat中的铜psp对象作为线示例

library(spatstat)
library(raster)
library(spatialEco)

data(copper)
l <- copper$Lines
l <- rotate.psp(l, pi/2)

计算标准化的一阶和二阶线密度,然后强制转换为栅格类对象

d1st <- density(l)
  d1st <- d1st / max(d1st)
  d1st <- raster(d1st)  
d2nd <- density(l, sigma = 2)
  d2nd <- d2nd / max(d2nd)
  d2nd <- raster(d2nd)  


将一阶和二阶密度标准化为比例积分密度

d <- d1st + d2nd
d <- d / cellStats(d, stat='max')  


计算标准化的反欧氏距离并强制转换为栅格类

euclidean <- distmap(l)
euclidean <- euclidean / max(euclidean)
euclidean <- raster.invert(raster(euclidean))


将spatstat psp强制转换为sp的SpatialLinesDataFrame对象,以在raster :: extract

as.SpatialLines.psp <- local({
     ends2line <- function(x) Line(matrix(x, ncol=2, byrow=TRUE))
     munch <- function(z) { Lines(ends2line(as.numeric(z[1:4])), ID=z[5]) }
     convert <- function(x) {
        ends <- as.data.frame(x)[,1:4]
        ends[,5] <- row.names(ends)
        y <- apply(ends, 1, munch)
        SpatialLines(y)
     }
     convert
})
l <- as.SpatialLines.psp(l)
l <- SpatialLinesDataFrame(l, data.frame(ID=1:length(l)) )


绘图结果

par(mfrow=c(2,2))
  plot(d1st, main="1st order line density")
    plot(l, add=TRUE)
  plot(d2nd, main="2nd order line density")
    plot(l, add=TRUE) 
  plot(d, main="integrated line density")
    plot(l, add=TRUE)   
  plot(euclidean, main="euclidean distance")
    plot(l, add=TRUE) 


提取栅格值并计算与每条线相关的汇总统计量

l.dist <- extract(euclidean, l)
l.den <- extract(d, l)
l.stats <- data.frame(min.dist = unlist(lapply(l.dist, min)),
                      med.dist = unlist(lapply(l.dist, median)),
                      max.dist = unlist(lapply(l.dist, max)),
                      var.dist = unlist(lapply(l.dist, var)),
                      min.den = unlist(lapply(l.den, min)),
                      med.den = unlist(lapply(l.den, median)),
                      max.den = unlist(lapply(l.den, max)),
                      var.den = unlist(lapply(l.den, var)))


使用optimum.k函数,使用聚类轮廓值来评估最佳k(聚类数量),然后将簇值分配给行。然后,我们可以为每个聚类分配颜色,并在密度栅格的顶部进行绘制。

clust <- optimal.k(scale(l.stats), nk = 10, plot = TRUE)                      
  l@data <- data.frame(l@data, cluster = clust$clustering) 

kcol <- ifelse(clust$clustering == 1, "red", "blue")
plot(d)
  plot(l, col=kcol, add=TRUE)


此时,可以对线进行随机化,以测试所产生的强度和距离是否显着。您可以使用“ rshift.psp”功能随机地调整行的方向。您还可以只是随机化起点和终点,然后重新创建每一行。

人们还想知道,如果您只是使用起点和终点的单变量或交叉分析统计信息执行了点模式分析,该怎么办? ,线条不变。在单变量分析中,您将比较起点和终点的结果,以查看两个点模式之间的聚类是否一致。这可以通过F型帽,G型帽或Ripley's K型帽来完成(对于未标记的点处理)。另一种方法是交叉分析(例如,cross-K),其中通过将两点过程标记为[start,stop]同时对其进行测试。这将指示聚类过程中起点和终点之间的距离关系。但是,在这些类型的模型中,对基础强度过程的空间依赖性(非静态性)可能是一个问题,这会使它们不均匀并需要其他模型。具有讽刺意味的是,使用强度函数对不均匀过程进行建模,该函数使我们将整个圆带回到密度,从而支持使用比例积分密度作为聚类度量的想法。

这是一个快速的示例,说明是否使用线要素类的起点,终点位置将Ripleys K(Besags L)统计信息用于未标记点过程的自相关。最后一个模型是一个将起始和终止位置都作为标有标记的过程的叉k。

library(spatstat)
  data(copper)
  l <- copper$Lines
  l <- rotate.psp(l, pi/2)

Lr <- function (...) {
 K <- Kest(...)
  nama <- colnames(K)
   K <- K[, !(nama %in% c("rip", "ls"))]
   L <- eval.fv(sqrt(K/pi)-bw)
  L <- rebadge.fv(L, substitute(L(r), NULL), "L")
 return(L)
}

### Ripley's K ( Besag L(r) ) for start locations
start <- endpoints.psp(l, which="first")
marks(start) <- factor("start")
W <- start$window
area <- area.owin(W)
lambda <- start$n / area
 ripley <- min(diff(W$xrange), diff(W$yrange))/4
   rlarge <- sqrt(1000/(pi * lambda))
     rmax <- min(rlarge, ripley)
( Lenv <- plot( envelope(start, fun="Lr", r=seq(0, rmax, by=1), nsim=199, nrank=5) ) )

### Ripley's K ( Besag L(r) ) for end locations
stop <- endpoints.psp(l, which="second")
  marks(stop) <- factor("stop")
W <- stop$window
area <- area.owin(W)
lambda <- stop$n / area
 ripley <- min(diff(W$xrange), diff(W$yrange))/4
   rlarge <- sqrt(1000/(pi * lambda))
     rmax <- min(rlarge, ripley)
( Lenv <- plot( envelope(start, fun="Lr", r=seq(0, rmax, by=1), nsim=199, nrank=5) ) )

### Ripley's Cross-K ( Besag L(r) ) for start/stop
sdata.ppp <- superimpose(start, stop)
( Lenv <- plot(envelope(sdata.ppp, fun="Kcross", r=bw, i="start", j="stop", nsim=199,nrank=5, 
                 transform=expression(sqrt(./pi)-bw), global=TRUE) ) )


参考文献

Thomas J.C.R. (2011)一种新的基于K均值的聚类算法,使用线段作为原型。在:圣马丁C.,金SW。 (eds)模式识别,图像分析,计算机视觉和应用程序方面的进展。 CIARP2011。计算机科学讲座,第7042卷。施普林格,柏林,海德堡

#2 楼

您可能需要研究弗雷谢特的距离。我是在最近一个寻找python实现的问题之后才才发现这个问题的。

这是用于查找线串的空间相似性的度量。这与Hausdorff距离类似,与多边形相似性度量等效,但是对于带有方向的线串来说是这样。


Fréchet距离定义为将狗拴在皮带上的皮带的最小长度一条轨迹,拥有者的轨迹在第二条轨迹上,两个轨迹都不会向后移动


此度量标准对于两条位置紧密,几乎平行,以相同方式对齐的曲线具有较小的值,并且长度相似。

但是,这并不能回答群集识别部分。

这里有一个全面的介绍。
您的情况听起来像是一些第46-49节中提到的用例

该指标具有很多非地理空间的用法,例如


检测基因测序中的常见子模式
手写识别
检测时间序列中的相关时段,例如股价历史记录

,因此书目中有很多论文都涉及该主题,但大多数其中不是地理空间。同样,这些论文中的大多数都属于算法学/数学/计算机科学而不是地理空间科学/地球科学,因此是针对的。

然而,本文看上去很有希望:-

Buchin,K. ,Buchin,M.和Wang,Y.(2009)。
通过Fréchet距离进行部分曲线匹配的精确算法。
在第20届ACM-SIAM离散算法研讨会论文集,第645页– 654

其他一些论文听起来更接近您的意图-聚类识别和将轨迹分配给聚类-但它们使用时间序列数据或其他非地球空间示例进行了说明。但是他们可能会指出有趣的方向。

评论


我认为使用Frechet或Hausdorff距离而不是Euclidean距离的最小链接(或DBSCAN)聚类将是一个不错的解决方案。

–dbaston
17年6月14日在15:17

我喜欢存在Frechet距离,也喜欢演示文稿将“豆形软糖”和“肚脐”进行比较。

– Fezter♦
17年6月15日在6:23

#3 楼

我建议使用与此处说明的方法类似的方法。

算法和命名:

a)命名线层NODES。计算轴承

b)使用距离公差在空间上彼此连接(一对多)。名称层LINKS

c)从LINKS连接自身中删除,即NAME = NAME_1


def theSame(aList,tol):
    maxB=max(aList);minB=min(aList)
    if abs(maxB-minB)<tol:return 1
    if abs(maxB-minB-180)<tol:return 1
    return 0
#-----------
theSame( [!BEARING!, !BEARING_1!],15)


即假定在相反方向上行的线在方向上是相似的
d)从LINKS中删除非相似的(0)对。

e)计算通过NODES和将组号传输到NODES表:



不幸的是:



然而,轴承内的简单统计组,例如标准偏差:

abs(tan(bearing))


在第一种情况下没有显示偏差,在第二种情况下显示出很大的偏差。类似地,长度统计可以帮助“长时间并行运行”。

如果上面的内容令人感兴趣,我可以使用计算连接的链接组的脚本更新答案。它使用的是arcpy和networkx模块。

不知道如何处理从同一点向相反方向的一对线...

评论


我会对看脚本感兴趣。

– alphabetasoup
17年6月19日在20:57

@RichardLaw按照解决方案第一行的链接向下滚动以查看它。我有一个稍微更好的抛光版本,但是可以。逻辑非常简单:1.使用链接和与其相连的节点制作图2.选择第一个节点并找到祖先(第0组)3)从图中删除节点并重复直到没有节点。我反复使用它来查找高质量的理事会/ LINZ数据集的断开连接的管道组(河流等)

– FelixIP
17年6月19日在23:49



#4 楼

在我看来,线条的定义存在问题,这将决定使用哪种方法(上面提到的一些方法)。如果这些是OD对,并且几何结构不起作用,那么我将基于网络集群进行处理。您说网络并没有形成网络-就是这样,但是起源和目的地可能会落入有意义的区域,因此您可以将其视为网络。

如果几何有话要说(这些是GPS轨迹,并且您要考虑几何),那么您将需要在(x,y,t)空间中真正工作-类似运动足迹的几何形状,但在不同时间可能不会被评估为相同-在问题中未指定。

您可以看到的一些可能性:


最接近您需要的是Dodge,Weibel,Forootan(2009),在这里
http:/ /orca.cf.ac.uk/94865/1/PhysicsMovement.pdf
如果可以简化几何图形,也许此处提到的参数可能有用:http://www.tandfonline.com/doi/full/ 10.1080 / 17445647.2017.1313788


但是最后,再次阅读您的最初问题,可能会更简单:您可以成对计算(线段之间)线性交点之间的距离吗?段的扩展及其最近的点,以某种方式归一化(可能基于段本身的长度),并使用矩阵聚类算法?推理:相交远的段比相交近的段更相似(平行)。在附图中,您没有说出如何处理偏移(长frechet距离)中的共线或平行线段。我认为这会给上面的解决方案带来麻烦。 (为清晰起见,通过在上面明确声明“线性扩展”进行了编辑)

注意(2018年1月):我最近偶然发现了这一点:


蔡雨涵和吴瑞星。 “用切比雪夫多项式索引时空轨迹。” 2004 ACM SIGMOD国际数据管理国际会议论文集。 ACM,2004年。

与轨迹相似性有关,因此可以在某种程度上进行相似性量化。这基于曲线的多项式逼近并计算切比雪夫距离。

#5 楼

您能否详细说明正在使用的数据类型?这些仅仅是一系列分离的线还是它们形成一个网络?您是否使用过任何ArcGIS工具进行空间模式分析?当用于非点数据时,许多ArcGIS方法(Ripley的K,NN索引,Morans I)仅使用线/多边形的质心。但是,在这里您可能需要考虑将每条线分成相等的部分,以避免由于它们的质心距离太远而导致不考虑很长的线。

要考虑的另一件事是,从概念上讲,什么是线簇?您可能有许多直线彼此靠近,但是它们的端点可能会分散。同样,您可能会得到许多起点和终点彼此非常接近的线,但随后却变得非常分散在起点/终点之间。

但是,一种方法可能是简单地进行线密度分析因此,具有更多线的区域(在某种意义上可以看作是聚类的)将具有较高的网格值,而具有低密度的区域将具有较低的值。这样您会得到一些热点输出;但是,这不能像Morans I或NNI那样提供单一的统计信息。它也无法区分由于一条非常不规则的线(即一条紧密的螺旋线)与许多线而导致的密度。

抱歉,这不是您问题的完整答案,但我认为要钉牢您想要达到的目标的完整概念可能会提供一些更好的解决方案。

UPDATE

基于您给出的示例,我认为FelixlP建议创建具有线方位属性的点与点模式测量一起使用可能是一个好方法。除了将点分成相等的段,并在每个线的顶点处都有一个与线的方位角相同的点。
然后,您需要查看一些度量方法,以查看各个点的接近度以及方位角之间的相似性(因此您可以检测到更接近垂直线)。

因此,使用Getis-Ord GI(热点分析)将是一个很好的工具,用于可视化群集的位置;然后是全球Moran's I,以评估全球集群水平。

分割线的距离将影响发现的聚类程度。如果您正在寻找1 km规模的集群,则需要将线分段到该距离附近。同样,如果您正在寻找100m规模的群集,则需要相应地对线进行分段。这样一来,您就不会错过任何行,也不会将每一行都检测为一个集群。

评论


这些线代表旅行的起点和终点。他们没有形成网络。到目前为止,我已经将R方法用于起点和终点的空间点模式。我不太喜欢使用线质心的想法,但是值得一试来使线致密并分析结果节点,谢谢!

– Underdark♦
17年6月11日在17:46



如果我找不到更合适的方法,则线密度分析可能是一个后备解决方案。

– Underdark♦
17年6月11日在17:53

解决方案是将主线缓冲一定距离,然后查询缓冲区未完全包围的线是否是解决方案?过去,我已经做了很多工作来找到最可能的行进路线,但是数据由多节点折线组成,而不是简单的线段。

– jbgramm
17年6月11日在18:00

@jbgramm我可以想到许多可以计算出某种东西的方法,但是我不是统计学家,因此我在寻找既定方法-如果存在的话

– Underdark♦
17年6月12日在7:33

使用线中心点(或多个顶点)来表示点过程不是一种统计有效的方法。此外,您还将深刻地改变空间过程的表示形式。我将发布一些建议,但老实说,唯一提供了某种有效方法的建议是@underdark建议的行密度。跨比例尺加上自相关统计量将指示线性特征中的聚类程度。

–杰弗里·埃文斯(Jeffrey Evans)
17年6月13日在18:47

#6 楼

感谢您的示例。

我没有看到任何确定的方法来计算您要寻找的内容,但这将是我的方法。这是一种蛮力解决方案。

计算最小边界矩形,然后将其任意扩展,但在四个角的每个角上均等量扩展。

找到创建矩形的质心,计算每条线的OD点的方位角和距离分布,并使用边界矩形的角进行同样的操作,同时比较线的方位角。

测试从四个角到每个射线末端的平行度。
从质量中心到每个射线末端进行平行度。

通过这样做,您可以比较偏差从拐角到两端。
在示例(a)中,您将从两条拐角到三个线簇中的每条都有近平行的线。从质心到线的远端之间也将具有近平行线。

示例(b)从角到端点的计算中将没有近平行线每一行,但这些行似乎不是随机的,它们导致彼此之间略有偏差。

示例(c)似乎是随机的

示例(d)并非如此

更多地了解这一点,我将运行上面描述的测试,以及从所创建的封闭矩形的角到射线的两端创建三角解测试。 。相似的内角和面积将有助于验证聚类,除非聚类中的一条线比其他线明显短。

以上只是一个愚人的见解,我可能是错误的。

#7 楼

按照您的直觉描述,两条直线平行的标准是什么?

您基本上可以对它们的起点或终点进行测试:
让Sx =(start_x_line_1-start_x_line_2),
和Ex,Ey相同,只是终点不同。

因此,如果sqrt(Sx²+Sy²)和sqrt(Ex²+Ey²)处于某个阈值以下,则可以将这些行视为平行。