Đây là một câu hỏi khó vì chưa có nhiều, nếu có, thống kê quy trình không gian được phát triển cho các tính năng dòng. Không nghiêm túc đào sâu vào các phương trình và mã, thống kê quy trình điểm không dễ dàng áp dụng cho các tính năng tuyến tính và do đó, không hợp lệ về mặt thống kê. Điều này là do null, một mẫu đã cho được kiểm tra dựa trên các sự kiện điểm và không phụ thuộc tuyến tính trong trường ngẫu nhiên. Tôi phải nói rằng tôi thậm chí không biết null sẽ là gì khi cường độ và sự sắp xếp / định hướng sẽ còn khó khăn hơn nữa.
Tôi chỉ nhổ nước bọt ở đây, nhưng, tôi tự hỏi nếu một đánh giá đa quy mô về mật độ dòng kết hợp với khoảng cách Euclide (hoặc khoảng cách Hausdorff nếu các dòng phức tạp) sẽ không chỉ ra một biện pháp phân cụm liên tục. Dữ liệu này sau đó có thể được tóm tắt thành các vectơ dòng, sử dụng phương sai để tính chênh lệch độ dài (Thomas 2011) và gán giá trị cụm bằng cách sử dụng thống kê như phương tiện K. Tôi biết rằng bạn không theo cụm được gán mà giá trị cụm có thể phân vùng mức độ phân cụm. Điều này rõ ràng sẽ yêu cầu một sự phù hợp tối ưu của k vì vậy, các cụm tùy ý không được chỉ định. Tôi nghĩ rằng đây sẽ là một cách tiếp cận thú vị trong việc đánh giá cấu trúc cạnh trong các mô hình lý thuyết đồ thị.
Đây là một ví dụ hoạt động trong R, xin lỗi, nhưng nó nhanh hơn và có thể tái tạo nhiều hơn so với việc cung cấp một ví dụ QGIS, và nằm trong vùng thoải mái của tôi :)
Thêm thư viện và sử dụng đối tượng psp đồng từ spatstat làm ví dụ dòng
library(spatstat)
library(raster)
library(spatialEco)
data(copper)
l <- copper$Lines
l <- rotate.psp(l, pi/2)
Tính toán mật độ dòng thứ tự 1 và 2 được chuẩn hóa và sau đó ép buộc vào các đối tượng lớp raster
d1st <- density(l)
d1st <- d1st / max(d1st)
d1st <- raster(d1st)
d2nd <- density(l, sigma = 2)
d2nd <- d2nd / max(d2nd)
d2nd <- raster(d2nd)
Chuẩn hóa mật độ bậc 1 và bậc 2 thành mật độ tích hợp tỷ lệ
d <- d1st + d2nd
d <- d / cellStats(d, stat='max')
Tính toán khoảng cách euclide ngược được chuẩn hóa và ép buộc với lớp raster
euclidean <- distmap(l)
euclidean <- euclidean / max(euclidean)
euclidean <- raster.invert(raster(euclidean))
Ép psp spatstat psp vào một đối tượng sp SpatialLinesDataFrame để sử dụng trong 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)) )
Kết quả 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)
Trích xuất các giá trị raster và tính toán thống kê tóm tắt được liên kết với mỗi dòng
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)))
Sử dụng các giá trị hình bóng cụm để đánh giá k (số cụm) tối ưu, với hàm tối ưu.k, sau đó gán giá trị cụm cho các dòng. Sau đó chúng ta có thể gán màu cho từng cụm và vẽ trên đỉnh của raster mật độ.
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)
Tại thời điểm này, người ta có thể thực hiện ngẫu nhiên các dòng để kiểm tra xem cường độ và khoảng cách kết quả có ý nghĩa so với ngẫu nhiên hay không. Bạn có thể sử dụng chức năng "rshift.psp" để định hướng lại ngẫu nhiên các dòng của bạn. Bạn cũng có thể chỉ cần ngẫu nhiên các điểm bắt đầu và điểm dừng và tạo lại mỗi dòng.
Người ta cũng tự hỏi "nếu như" bạn chỉ thực hiện phân tích mẫu điểm bằng cách sử dụng thống kê phân tích đơn biến hoặc chéo trên điểm bắt đầu và điểm dừng, bất biến của các dòng. Trong một phân tích đơn biến, bạn sẽ so sánh kết quả của điểm bắt đầu và điểm dừng để xem liệu có sự thống nhất trong việc phân cụm giữa hai mẫu điểm hay không. Điều này có thể được thực hiện thông qua mũ f, mũ G hoặc mũ K của Ripley (đối với các quy trình điểm không được đánh dấu). Một cách tiếp cận khác sẽ là phân tích chéo (ví dụ: K chéo) trong đó hai quá trình điểm được kiểm tra đồng thời bằng cách đánh dấu chúng là [bắt đầu, dừng lại]. Điều này sẽ chỉ ra các mối quan hệ khoảng cách trong quá trình phân cụm giữa điểm bắt đầu và điểm dừng. Tuy nhiên, sự phụ thuộc không gian (không phụ thuộc) vào một quá trình cường độ cơ bản có thể là một vấn đề trong các loại mô hình này làm cho chúng không đồng nhất và đòi hỏi một mô hình khác. Trớ trêu thay, quá trình không đồng nhất được mô hình hóa bằng cách sử dụng hàm cường độ, đưa chúng ta trở lại vòng tròn đầy đủ về mật độ, do đó hỗ trợ ý tưởng sử dụng mật độ tích hợp tỷ lệ làm thước đo phân cụm.
Dưới đây là một ví dụ hoạt động nhanh về việc nếu thống kê Riplyys K (Besags L) cho tự động tương quan của một quá trình điểm không được đánh dấu bằng cách sử dụng bắt đầu, dừng các vị trí của lớp tính năng dòng. Mô hình cuối cùng là một chữ thập sử dụng cả hai vị trí bắt đầu và dừng như một quá trình được đánh dấu danh nghĩa.
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) ) )
Tài liệu tham khảo
Thomas JCR (2011) Thuật toán phân cụm mới dựa trên K-Means sử dụng phân đoạn dòng làm nguyên mẫu. Trong: San Martin C., Kim SW. (eds) Tiến bộ trong nhận dạng mẫu, phân tích hình ảnh, thị giác máy tính và ứng dụng. CIpeg 2011. Ghi chú bài giảng Khoa học máy tính, tập 7042. Springer, Berlin, Heidelberg