ESDA in PySal (1) 利用 A-DBSCAN 聚类点并探索边界模糊性

这篇具有很好参考价值的文章主要介绍了ESDA in PySal (1) 利用 A-DBSCAN 聚类点并探索边界模糊性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ESDA in PySAL (1) 利用 A-DBSCAN 聚类点并探索边界模糊性

在本例中,我们将以柏林的 AirBnb 房源样本为例,说明如何使用 A-DBSCAN (Arribas-Bel et al., 2019)。A-DBSCAN 可以让我们做两件事:

  • 识别高密度 AirBnb 房源集群并划定其边界
  • 探索这些边界的稳定性
%matplotlib inline

import pandas
import geopandas
import numpy as np
import contextily as cx
import matplotlib.pyplot as plt
from shapely.geometry import Polygon
from libpysal.cg.alpha_shapes import alpha_shape_auto

import sys
sys.path.append("../")
try:
    from esda.adbscan import ADBSCAN, get_cluster_boundary, remap_lbls
# This below can be removed once A-DBSCAN is merged into `esda`
except:
    print("Import from local folder...")
    import sys
    sys.path.append("../esda")
    from adbscan import ADBSCAN, get_cluster_boundary, remap_lbls

数据

我们将使用 Inside Airbnb 中的柏林提取数据。这与 Scipy 2018 tutorial on Geospatial data analysis with Python中使用的数据集相同。

tab = pandas.read_csv("data/berlin-listings.csv")
tab.head(2)
Unnamed: 0 id listing_url scrape_id last_scraped name summary space description experiences_offered ... review_scores_value requires_license license jurisdiction_names instant_bookable cancellation_policy require_guest_profile_picture require_guest_phone_verification calculated_host_listings_count reviews_per_month
0 0 17260587 https://www.airbnb.com/rooms/17260587 20170507222235 2017-05-08 Kunterbuntes Zimmer mit eigenem Bad für jedermann Meine Unterkunft ist gut für paare, alleinreis... NaN Meine Unterkunft ist gut für paare, alleinreis... none ... 10.0 f NaN NaN t flexible f f 3 2.00
1 1 17227881 https://www.airbnb.com/rooms/17227881 20170507222235 2017-05-08 Modernes Zimmer in Berlin Pankow Es ist ein schönes gepflegtes und modernes Zim... Das Haus befindet sich direkt vor eine Tram Ha... Es ist ein schönes gepflegtes und modernes Zim... none ... 10.0 f NaN NaN t flexible f f 1 1.29

2 rows × 96 columns

原始数据集包括 20,000 多个观测值:

tab.shape
(20053, 96)

为了让图解在任何硬件上运行得更快一些,让我们随机抽取 10%的样本,即随机抽取 2,000 个属性:

tab = tab.sample(n=2000, random_state=1234)

为方便起见,我们将其转换为 “GeoDataFrame”,其中的几何图形是根据原始表格中的长/纬度列建立的:

db_ll = geopandas.GeoDataFrame(tab,
                               geometry=geopandas.points_from_xy(tab.longitude, tab.latitude),
                               crs={'init': 'epsg:4326'}
                              )
/home/serge/anaconda3/envs/analytical/lib/python3.7/site-packages/pyproj/crs/crs.py:53: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
  return _prepare_from_string(" ".join(pjargs))

因为我们要运行一个依赖于距离的算法,所以我们需要能够在投影平面上计算这些距离。我们使用为德国设计的ETRS89投影来代替原始的长/纬度坐标,并以米为单位:

db = db_ll.to_crs(epsg=5243)

*现在我们可以将数据集可视化了:

ax = db.plot(markersize=0.1, color='orange')
cx.add_basemap(ax, crs=db.crs.to_string());

ESDA in PySal (1) 利用 A-DBSCAN 聚类点并探索边界模糊性,GIS空间分析,聚类,数据挖掘,机器学习

在开始之前,我们还将把投影坐标分成不同的列:

db["X"] = db.geometry.x
db["Y"] = db.geometry.y

识别 AirBnb 的聚类

A-DBSCAN 与最初的 DBSCAN 算法类似,运行前需要两个参数:

  1. eps`:从每个地点寻找邻居的最大距离
  2. min_samples`:一个点被视为聚类的一部分所需的最小相邻点数

在本例中,我们将选取总体样本量的 1% 作为 min_samples 参数:

db.shape[0] * 0.01
20.0

我们将使用 500 米的最大弧度作为 eps 参数。这隐含着我们正在寻找的是每平方千米 K m 2 Km^2 Km2 至少约 25 个属性的密度( d e n s = 20 p i   ×   0. 5 2 dens = \frac{20}{pi\, \times\, 0.5^2} dens=pi×0.5220)。

知道要使用的参数后,我们就可以继续运行 A-DBSCAN:

%%time
# Get clusters
adbs = ADBSCAN(500, 20, pct_exact=0.5, reps=10, keep_solus=True)
np.random.seed(1234)
adbs.fit(db)
CPU times: user 755 ms, sys: 3.36 ms, total: 758 ms
Wall time: 752 ms





ADBSCAN(eps=500, keep_solus=True, min_samples=20, pct_exact=0.5, reps=10)

一旦 "fit() "成功,我们就能以类似于 "scikit-learn "的方式提取标签,然后绘制地图:

ax = db.assign(lbls=adbs.votes["lbls"])\
       .plot(column="lbls", 
             categorical=True,
             markersize=2.5,
             figsize=(12, 12)
            )
cx.add_basemap(ax, crs=db.crs.to_string());

ESDA in PySal (1) 利用 A-DBSCAN 聚类点并探索边界模糊性,GIS空间分析,聚类,数据挖掘,机器学习

这只会显示根据标签分配的每个属性的颜色。除此以外,我们还可以创建多边形,表示特定聚类中所有点的紧密边界。为此,我们通过辅助函数 get_cluster_boundary 使用 α \alpha α-shapes 算法:

%time polys = get_cluster_boundary(adbs.votes["lbls"], db, crs=db.crs)
CPU times: user 1.76 s, sys: 15.2 ms, total: 1.78 s
Wall time: 1.77 s

这些多边形也可以像其他 "地理系列 "对象一样绘制:

ax = polys.plot(alpha=0.5, color="red")
cx.add_basemap(ax, crs=polys.crs.to_string());

ESDA in PySal (1) 利用 A-DBSCAN 聚类点并探索边界模糊性,GIS空间分析,聚类,数据挖掘,机器学习

为了好玩,我们还可以创建更多的放大视图,将每个星团外的区域调暗:

f, axs = plt.subplots(1, 3, figsize=(18, 6))
for i, ax in enumerate(axs):
    # Plot the boundary of the cluster found
    ax = polys[[i]].plot(ax=ax, 
                         edgecolor="red",
                         facecolor="none"
                        )
    # Add basemap
    cx.add_basemap(ax, 
                   crs=polys.crs.to_string(), 
                   url=cx.providers.CartoDB.Voyager,
                   zoom=13
                  )
    # Extra to dim non-cluster areas
    (minX, maxX), (minY, maxY) = ax.get_xlim(), ax.get_ylim()
    bb = Polygon([(minX, minY),
                  (maxX, minY),
                  (maxX, maxY),
                  (minX, maxY),
                  (minX, minY)
                 ])
    geopandas.GeoSeries([bb.difference(polys[i])],
                        crs=polys.crs
                       ).plot(ax=ax, 
                              color='k', 
                              alpha=0.5
                             )
    ax.set_axis_off()
    ax.set_title(f"Cluster {polys[[i]].index[0]}")
plt.show()
/home/serge/anaconda3/envs/analytical/lib/python3.7/site-packages/ipykernel_launcher.py:12: FutureWarning: The "url" option is deprecated. Please use the "source" argument instead.
  if sys.path[0] == '':
/home/serge/anaconda3/envs/analytical/lib/python3.7/site-packages/ipykernel_launcher.py:12: FutureWarning: The "url" option is deprecated. Please use the "source" argument instead.
  if sys.path[0] == '':
/home/serge/anaconda3/envs/analytical/lib/python3.7/site-packages/ipykernel_launcher.py:12: FutureWarning: The "url" option is deprecated. Please use the "source" argument instead.
  if sys.path[0] == '':

ESDA in PySal (1) 利用 A-DBSCAN 聚类点并探索边界模糊性,GIS空间分析,聚类,数据挖掘,机器学习

探索边界的模糊性

A-DBSCAN 的主要优点之一是,由于它依赖于生成多个候选解的集合方法,因此我们可以探索边界在多大程度上是稳定、清晰或模糊的。为此,我们需要从 ADBSCAN 对象中提取每个候选解,并将其转化为边界线(这可能需要运行一段时间):

%%time
solus_rl = remap_lbls(adbs.solus, db, n_jobs=-1)
lines = []
for rep in solus_rl:
    line = get_cluster_boundary(solus_rl[rep], 
                                db, 
                                crs=db.crs,
                                n_jobs=-1
                               )
    line = line.boundary
    line = line.reset_index()\
               .rename(columns={0: "geometry", 
                                "index": "cluster_id"}
                      )\
               .assign(rep=rep)
    lines.append(line)
lines = pandas.concat(lines)
lines = geopandas.GeoDataFrame(lines, crs=db.crs)
CPU times: user 665 ms, sys: 1.45 s, total: 2.12 s
Wall time: 4.83 s

下面是模拟得出的所有解决方案的初探:

ax = lines.plot(color="#FFDB58",
                linewidth=0.5
               )
cx.add_basemap(ax,
               alpha=0.5,
               url=cx.providers.Stamen.TonerHybrid,
               crs=lines.crs.to_string()
              )
/home/serge/anaconda3/envs/analytical/lib/python3.7/site-packages/ipykernel_launcher.py:7: FutureWarning: The "url" option is deprecated. Please use the "source" argument instead.
  import sys

ESDA in PySal (1) 利用 A-DBSCAN 聚类点并探索边界模糊性,GIS空间分析,聚类,数据挖掘,机器学习

将每个候选边界存储和标记到一个表中,我们就可以进行多次查询。例如,以下是第一次复制产生的所有解决方案:

lines.query("rep == 'rep-00'").plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7fc0003522d0>

ESDA in PySal (1) 利用 A-DBSCAN 聚类点并探索边界模糊性,GIS空间分析,聚类,数据挖掘,机器学习

这就是第 2 组标签的所有候选方案:

lines.query("cluster_id == '2'").plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7fc000452e90>

ESDA in PySal (1) 利用 A-DBSCAN 聚类点并探索边界模糊性,GIS空间分析,聚类,数据挖掘,机器学习

最后,我们还可以将这一想法应用到交互式环境中,通过构建小工具来刷新复制:

from ipywidgets import interact, IntSlider
def plot_rep(rep):
    f, ax = plt.subplots(1, figsize=(9, 9))
    ax.set_facecolor("k")
    # Background points
    db[["X", "Y"]].plot.scatter("X", "Y", ax=ax, color="0.25", s=0.5)
    # Boundaries
    cs = lines.query(f"rep == 'rep-{str(rep).zfill(2)}'")
    cs.plot(ax=ax, color="red")
    # Cluster IDs
    for s, row in cs.iterrows():
        ax.text(row.geometry.centroid.x, 
                row.geometry.centroid.y, 
                s,
                size=20,
                c="w"
               )
    return None
reps = range(len(lines["rep"].unique()))
slider = IntSlider(min=min(reps), max=max(reps), step=1)
interact(plot_rep, rep=slider);
interactive(children=(IntSlider(value=0, description='rep', max=9), Output()), _dom_classes=('widget-interact'…

或者为给定的集群 ID 调出所有解决方案:文章来源地址https://www.toymoban.com/news/detail-681508.html

def plot_cluster(cluster_id):
    f, ax = plt.subplots(1, figsize=(9, 9))
    ax.set_facecolor("k")
    # Background points
    db[["X", "Y"]].plot.scatter("X", 
                                "Y", 
                                ax=ax, 
                                color="0.25", 
                                s=0.5, 
                                alpha=0.5
                               )
    # Boundaries
    lines.query(f"cluster_id == '{cluster_id}'").plot(ax=ax, 
                                                      linewidth=1, 
                                                      alpha=0.5
                                                     )
    return None
interact(plot_cluster, cluster_id=lines["cluster_id"].unique());

到了这里,关于ESDA in PySal (1) 利用 A-DBSCAN 聚类点并探索边界模糊性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DBSCAN聚类算法——MATLAB实现

        声明:本文修改自《 数学建模清风 》老师的代码    DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪

    2024年02月11日
    浏览(44)
  • 密度聚类算法(DBSCAN)实验案例

    DBSCAN是一种强大的基于密度的聚类算法,从直观效果上看,DBSCAN算法可以找到样本点的全部密集区域,并把这些密集区域当做一个一个的聚类簇。DBSCAN的一个巨大优势是可以对任意形状的数据集进行聚类。 本任务的主要内容: 1、 环形数据集聚类 2、 新月形数据集聚类 3、

    2024年02月08日
    浏览(46)
  • KMeans+DBSCAN密度聚类+层次聚类的使用(附案例实战)

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 1.KMeans聚类算法 2.DBSCAN密度聚类算法 3.层次聚类 4.实战案例 4.1数据集介绍 4.2加载数据

    2024年02月08日
    浏览(44)
  • KMeans+DBSCAN密度聚类+层次聚类的使用(文末送书)

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 1.KMeans聚类算法 2.DBSCAN密度聚类算法 3.层次聚类 4.实战案例 4.1数据集介绍 4.2加载数据

    2024年02月07日
    浏览(46)
  • 聚类分析-K-means、层次聚类、DBSCAN、簇评估

    聚类分析是一种数据分析技术,对大量未知标注的数据集,通过将具有相似数据特性的数据对象分组到一起,使得类别内的数据相似度较大而类别间的数据相似度较小,以便对这些数据对象进行更好的理解和分析。总的来说,聚类分析就是将数据划分成有意义或有用的组(簇

    2024年02月03日
    浏览(35)
  • 基于密度的聚类算法(1)——DBSCAN详解

    基于密度的聚类算法(1)——DBSCAN详解 基于密度的聚类算法(2)——OPTICS详解 基于密度的聚类算法(3)——DPC详解 1. DBSCAN简介 DBSCAN(Density-Based Spatial Clustering of Applications with Noise, 具有噪声的基于密度的聚类方法 )是一种典型的基于密度的空间聚类算法。和K-Means,BIR

    2024年01月24日
    浏览(47)
  • 毫米波雷达点云 DBSCAN聚类算法

    聚类的目的是将一组数据点划分为具有相似特征或属性的组或簇。通过聚类分析,我们可以识别出数据中的内在模式、结构和关联关系,从而获得对数据的更深入理解。 具体来说,聚类的目的可以分为以下三部分: 发现数据的内在结构: 聚类可以将数据分成簇,这些簇可能

    2024年02月06日
    浏览(46)
  • 【机器学习】DBSCAN聚类算法(含Python实现)

    DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,可以将数据点分成不同的簇,并且能够识别噪声点(不属于任何簇的点)。 DBSCAN聚类算法的基本思想是: 在给定的数据集中,根据每个数据点周围其他数据点的密度情况,将数据点分为核心点

    2023年04月23日
    浏览(52)
  • 深度解读DBSCAN聚类算法:技术与实战全解析

    探索DBSCAN算法的内涵与应用,本文详述其理论基础、关键参数、实战案例及最佳实践,揭示如何有效利用DBSCAN处理复杂数据集,突破传统聚类限制。 关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智

    2024年02月05日
    浏览(47)
  • 【机器学习】聚类算法-DBSCAN基础认识与实战案例

    在机器学习中,聚类是一种常见的无监督学习方法,它的目标是将数据集中的数据点分成不同的组,每个组之间具有相似的特征。聚类可以用于各种应用程序,如图像分割,社交媒体分析,医疗数据分析等。DBSCAN是一种聚类算法,它被广泛应用于各种领域。 DBSCAN(Density-Bas

    2024年04月15日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包