Jas*_*lns 13 r cluster-analysis
我想将一些基本的聚类技术应用于某些纬度和经度坐标.沿着聚类(或一些无监督学习)的线条,通过它们的大圆距离或它们的测地距离确定坐标. 注意:这可能是一个非常糟糕的方法,所以请指教.
理想情况下,我想解决这个问题R.
我做了一些搜索,但也许我错过了一个坚实的方法?我所遇到的包:flexclust和pam-不过,我还没有碰到过一个明确的例子(S)相对于下面来:
flexclut(通过kcca或cclust)或pam考虑随机重启?jlh*_*ard 17
关于你的第一个问题:由于数据是long/lat,一种方法是earth.dist(...)在包中使用fossil(计算大圆圈):
library(fossil)
d = earth.dist(df) # distance object
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用distHaversine(...)在geosphere包装:
geo.dist = function(df) {
require(geosphere)
d <- function(i,z){ # z[1:2] contain long, lat
dist <- rep(0,nrow(z))
dist[i:nrow(z)] <- distHaversine(z[i:nrow(z),1:2],z[i,1:2])
return(dist)
}
dm <- do.call(cbind,lapply(1:nrow(df),d,df))
return(as.dist(dm))
}
Run Code Online (Sandbox Code Playgroud)
这里的优点是您可以使用任何其他距离算法geosphere,或者您可以定义自己的距离函数并使用它代替distHaversine(...).然后应用任何基本R聚类技术(例如,kmeans,hclust):
km <- kmeans(geo.dist(df),centers=3) # k-means, 3 clusters
hc <- hclust(geo.dist(df)) # hierarchical clustering, dendrogram
clust <- cutree(hc, k=3) # cut the dendrogram to generate 3 clusters
Run Code Online (Sandbox Code Playgroud)
最后,一个真实的例子:
setwd("<directory with all files...>")
cities <- read.csv("GeoLiteCity-Location.csv",header=T,skip=1)
set.seed(123)
CA <- cities[cities$country=="US" & cities$region=="CA",]
CA <- CA[sample(1:nrow(CA),100),] # 100 random cities in California
df <- data.frame(long=CA$long, lat=CA$lat, city=CA$city)
d <- geo.dist(df) # distance matrix
hc <- hclust(d) # hierarchical clustering
plot(hc) # dendrogram suggests 4 clusters
df$clust <- cutree(hc,k=4)
library(ggplot2)
library(rgdal)
map.US <- readOGR(dsn=".", layer="tl_2013_us_state")
map.CA <- map.US[map.US$NAME=="California",]
map.df <- fortify(map.CA)
ggplot(map.df)+
geom_path(aes(x=long, y=lat, group=group))+
geom_point(data=df, aes(x=long, y=lat, color=factor(clust)), size=4)+
scale_color_discrete("Cluster")+
coord_fixed()
Run Code Online (Sandbox Code Playgroud)

城市数据来自GeoLite.美国各州的shapefile来自人口普查局.
编辑以回应@ Anony-Mousse评论:
"LA"在两个集群之间划分似乎很奇怪,但是,扩展地图表明,对于这个随机选择的城市,集群3和集群4之间存在差距.集群4基本上是Santa Monica和Burbank; 第3组是帕萨迪纳,南洛杉矶,长滩以及南部的一切.
K-means聚类(4个聚类)确实将LA/Santa Monica/Burbank/Long Beach周围的区域保持在一个集群中(见下文).这仅归结为kmeans(...)和使用的不同算法hclust(...).
km <- kmeans(d, centers=4)
df$clust <- km$cluster
Run Code Online (Sandbox Code Playgroud)

值得注意的是,这些方法要求所有点都必须进入某个集群.如果您只是询问哪些点靠近在一起,并允许某些城市不进入任何群集,则会得到截然不同的结果.