机器学习+城市规划第十四期:利用半参数地理加权回归来实现区域带宽不同的规划任务

引言

在城市规划中,如何根据不同地区的地理特征来制定有效的规划方案是一个关键问题。不同区域的需求和规律是不同的,因此我们必须考虑到地理空间的差异性。本期博客将介绍如何结合机器学习方法,利用地理加权聚类(Geographically Weighted Clustering)和半参数地理加权回归(Semi-Parametric Geographically Weighted Regression, SPGWR)来实现城市规划中的区域带宽不同的任务。

我们将通过代码的形式一步步解构整个过程,结合真实的城市数据,帮助大家理解如何在规划过程中处理区域带宽差异问题,并最终实现个性化、优化的规划方案。

地理加权聚类:为什么要加权?

1. 为什么要加权聚类?

传统的聚类方法,如K-means等,通常会根据全局特征对数据进行聚类,而忽略了数据在地理空间上的异质性。而在城市规划中,地理位置对于各类变量的影响至关重要。例如,一个城市的东部和西部,经济发展水平、交通需求、环境污染等因素可能有显著差异。因此,直接应用全局聚类算法可能无法准确地反映不同区域的实际需求。

地理加权聚类能够更好地反映这些空间差异性。通过对每个数据点进行加权处理,我们可以根据每个点的实际因变量(如交通流量、空气污染等)来调整聚类结果,使得相同簇中的数据点具有更强的相似性,并且不同簇之间的差异更加明显。

2. 如何实现加权聚类?

我们使用了DBSCAN(密度基聚类算法),它能够根据每个点的邻域密度来进行聚类。在此基础上,我们根据每个数据点的因变量进行加权复制,以反映不同地区的实际需求。接下来是代码实现过程。

import pandas as pd
import numpy as np
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt# ========== 中文字体设置 ==========
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# ========== 读取数据 ==========
df = pd.read_csv('shuju bike.csv', header=None)
df.columns = ['latitude', 'longitude', 'dependent_var', 'independent_var']# 清洗数据
df['latitude'] = pd.to_numeric(df['latitude'], errors='coerce')
df['longitude'] = pd.to_numeric(df['longitude'], errors='coerce')
df['dependent_var'] = pd.to_numeric(df['dependent_var'], errors='coerce')
df['independent_var'] = pd.to_numeric(df['independent_var'], errors='coerce')
df.dropna(subset=['latitude', 'longitude', 'dependent_var', 'independent_var'], inplace=True)# ========== 权重复制(加权) ==========
df_weighted = df.loc[df.index.repeat(df['dependent_var'].astype(int))].reset_index(drop=True)# ========== 转换为弧度坐标 ==========
coords = df_weighted[['latitude', 'longitude']].to_numpy()
coords_rad = np.radians(coords)# ========== 设置 DBSCAN 参数 ==========
kms_per_radian = 6371.0088
base_eps_km = 5  # 可调:基础 eps,单位为 km
epsilon = base_eps_km / kms_per_radian# ========== 聚类 ==========
db = DBSCAN(eps=epsilon, min_samples=10, algorithm='ball_tree', metric='haversine')
cluster_labels = db.fit_predict(coords_rad)# ========== 聚类结果回填到原始 df ==========
df_weighted['cluster'] = cluster_labels# 按经纬度 + 因变量分组,避免数据重复
df_clustered = df_weighted.groupby(['latitude', 'longitude', 'dependent_var', 'independent_var'], as_index=False).agg({'cluster': 'first'})# ========== 合并回原始数据 ==========
df_result = pd.merge(df, df_clustered, on=['latitude', 'longitude', 'dependent_var', 'independent_var'], how='left')# ========== 保存 ==========
output_path = "加权聚类结果.csv"
df_result.to_csv(output_path, index=False, encoding='utf-8-sig')
print("✅ 加权聚类结果已保存至:", output_path)# ========== 可视化 ==========
plt.figure(figsize=(10, 6))
scatter = plt.scatter(df_result['longitude'],df_result['latitude'],c=df_result['cluster'],cmap='tab20',s=df_result['dependent_var'] * 10,  # 用大小体现因变量的严重程度alpha=0.7
)
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.title('地理加权 DBSCAN 聚类(考虑因变量)')
plt.colorbar(scatter, label='Cluster ID')
plt.grid(True)
plt.show()

半参数地理加权回归:引入带宽的原因

1. 为什么引入半参数地理加权回归?

在地理空间中,不同地区的数据特征之间可能存在显著差异。例如,在城市的东部地区,温度、湿度等环境变量可能与西部地区的关系完全不同。因此,采用全局回归模型(例如普通最小二乘回归)进行预测可能会忽略这些差异,导致不准确的结果。

半参数地理加权回归(SPGWR)结合了传统回归和地理加权的优势,通过在回归中引入带宽,使得每个区域内的数据点能够根据其空间距离进行加权,从而有效捕捉区域差异。

2. 如何实现半参数地理加权回归?

通过计算每个点与其周围点的地理距离,并根据距离计算权重,我们能够在每个簇内应用不同的回归参数。这使得我们能够根据不同区域的特征,制定个性化的规划方案。

以下是半参数地理加权回归的实现代码:

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
from scipy.spatial.distance import cdist
from sklearn.linear_model import LinearRegression
import geopandas as gpd
from shapely.geometry import Point# 读取加权聚类数据
df = pd.read_csv('加权聚类结果.csv')  # 假设加权聚类结果文件路径# 处理数据:取出经纬度、因变量和自变量
df['latitude'] = pd.to_numeric(df['latitude'], errors='coerce')
df['longitude'] = pd.to_numeric(df['longitude'], errors='coerce')
df['dependent_var'] = pd.to_numeric(df['dependent_var'], errors='coerce')
df['independent_var'] = pd.to_numeric(df['independent_var'], errors='coerce')
df.dropna(subset=['latitude', 'longitude', 'dependent_var', 'independent_var'], inplace=True)# 标准化数据
scaler = StandardScaler()
df['dependent_var_scaled'] = scaler.fit_transform(df[['dependent_var']])
df['independent_var_scaled'] = scaler.fit_transform(df[['independent_var']])# Haversine距离函数
def haversine(lat1, lon1, lat2, lon2):R = 6371  # 地球半径(公里)phi1, phi2 = np.radians(lat1), np.radians(lat2)delta_phi = np.radians(lat2 - lat1)delta_lambda = np.radians(lon2 - lon1)a = np.sin(delta_phi / 2) ** 2 + np.cos(phi1) * np.cos(phi2) * np.sin(delta_lambda / 2) ** 2c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1 - a))return R * c# 计算地理坐标之间的距离矩阵
def compute_distance_matrix(coords):return cdist(coords, coords, metric='euclidean')  # 使用欧几里得距离计算地理距离# 半参数化地理加权回归
def spgwr(coords, X, y, bandwidth):dist_matrix = compute_distance_matrix(coords)weights = np.exp(-dist_matrix ** 2 / (2 * bandwidth ** 2))  # 高斯权重weights = np.diagonal(weights)  # 只选择对角线元素model = LinearRegression()model.fit(X, y, sample_weight=weights)y_pred = model.predict(X)residuals = y - y_predRSS = np.sum(residuals ** 2)n = len(y)k = len(model.coef_)log_likelihood = -0.5 * np.sum(np.log(np.maximum(np.abs(residuals), 1e-10)) ** 2)AIC = 2 * k - 2 * log_likelihoodBIC = np.log(n) * k - 2 * log_likelihoodR2 = model.score(X, y)adj_R2 = 1 - (1 - R2) * (n - 1) / (n - k - 1)return {'RSS': RSS,'AIC': AIC,'BIC': BIC,'R2': R2,'Adj_R2': adj_R2,'params': model.coef_,'intercept': model.intercept_,'residuals': residuals}, model# 选择带宽(示例为平均距离)
clusters = df['cluster'].unique()
results = []for cluster in clusters:cluster_data = df[df['cluster'] == cluster]coords = cluster_data[['latitude', 'longitude']].to_numpy()X = cluster_data[['independent_var_scaled']].to_numpy()y = cluster_data['dependent_var_scaled'].to_numpy()dist_matrix = compute_distance_matrix(coords)bandwidth = np.mean(dist_matrix)model_results, model = spgwr(coords, X, y, bandwidth)df.loc[df['cluster'] == cluster, 'MGWR_coef_Temperature'] = model_results['params'][0]df.loc[df['cluster'] == cluster, 'MGWR_residuals'] = model_results['residuals']cluster_results = {'cluster': cluster,'bandwidth': bandwidth,'RSS': model_results['RSS'],'AIC': model_results['AIC'],'BIC': model_results['BIC'],'R2': model_results['R2'],'Adj_R2': model_results['Adj_R2'],'params': model_results['params'],'intercept': model_results['intercept'],'mse': mean_squared_error(y, model.predict(X))}results.append(cluster_results)# 输出结果
results_df = pd.DataFrame([{'Cluster': result['cluster'],'Bandwidth': result['bandwidth'],'RSS': result['RSS'],'AIC': result['AIC'],'BIC': result['BIC'],'R2': result['R2'],'Adj_R2': result['Adj_R2'],'MSE': result['mse']
} for result in results])# 创建 GeoDataFrame
geometry = [Point(xy[1], xy[0]) for xy in zip(df['longitude'], df['latitude'])]
geo_df = gpd.GeoDataFrame(df, geometry=geometry, crs="EPSG:4326")# 可视化聚类结果
plt.figure(figsize=(12, 6))
geo_df.plot(column='cluster', cmap='tab20', legend=True, markersize=30, alpha=0.7, edgecolor='k')
plt.title('Cluster Map with Correct Coordinates', fontsize=16)
plt.xlabel('Longitude', fontsize=14)
plt.ylabel('Latitude', fontsize=14)
plt.show()# 保存为 GeoJSON 文件
output_geojson_path = 'spgwr_clusters_corrected.geojson'
geo_df.to_file(output_geojson_path, driver='GeoJSON')print(f"GeoJSON 文件已保存:{output_geojson_path}")
print(results_df)

总结

通过使用地理加权聚类半参数地理加权回归,我们可以有效地考虑到地理空间上的差异性。在城市规划中,这意味着我们可以为不同区域制定更为精准的规划方案,充分利用地理特征来优化资源分配和决策支持。通过这种方法,我们实现了具有不同区域带宽的个性化规划任务,让城市规划更加科学和合理。

希望大家通过本篇博客,能够深入理解并掌握这些技术,运用在实际的城市规划任务中,提升规划的精准度与效果!

原创声明:本教程由课题组内部教学使用,利用CSDN平台记录,不进行任何商业盈利。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/84614.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/84614.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/84614.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kivy的ButtonBehavior学习

Kivy的ButtonBehavior学习 ButtonBehavior 简介1、主要特点2、基本用法3、主要事件4、常用属性5、方法代码示例 文档:https://kivy.org/doc/stable/api-kivy.uix.behaviors.button.html#kivy.uix.behaviors.button.ButtonBehavior ButtonBehavior 简介 ButtonBeha…

WPS中将在线链接转为图片

WPS中将在线链接转为图片 文章目录 WPS中将在线链接转为图片一:解决方案1、下载图片,精确匹配(会员功能)2、将在线链接直接转为图片 一:解决方案 1、下载图片,精确匹配(会员功能) …

API:解锁数字化协作的钥匙及开放实现路径深度剖析

API:解锁数字化协作的钥匙及开放实现路径深度剖析 一、API 的概念与本质 (一)定义与基本原理 API(Application Programming Interface,应用程序编程接口)是一组定义、协议和工具,用于构建和集成软件应用程序。它如同一个精心设计的合约,详细规定了软件组件之间相互交…

Azure 虚拟机端口资源:专用 IP 和公共 IP Azure Machine Learning 计算实例BUG

## 报错无解 找不到Azure ML 计算实例关联的 NSG .env 文件和 ufw status: .env 文件中 EXPOSE_NGINX_PORT8080 是正确的,它告诉 docker-compose.yaml 将 Nginx 暴露在宿主机的 8080 端口。 sudo ufw status 显示 Status: inactive,意味着宿…

深入理解Python协程:async def、async for、await、yield详解

前言 在现代编程中,异步编程已成为提高程序效率和性能的重要方式。 Python 作为一种流行的编程语言,自然也提供了强大的异步编程支持。 本文将详细介绍 Python 中的协程,以及 async def、async for、await 和 yield 等关键字的使用。 协程简介…

基于功能基团的3D分子生成扩散模型 - D3FG 评测

D3FG 是一个在口袋中基于功能团的3D分子生成扩散模型。与通常分子生成模型直接生成分子坐标和原子类型不同,D3FG 将分子分解为两类组成部分:官能团和连接体,然后使用扩散生成模型学习这些组成部分的类型和几何分布。 一、背景介绍 D3FG 来源…

写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里

写一个shell脚本&#xff0c;把局域网内&#xff0c;把能ping通的IP和不能ping通的IP分类&#xff0c;并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…

如何提升企微CRM系统数据的准确性?5大核心策略详解

在数字化客户管理时代&#xff0c;企微CRM管理系统已成为企业连接客户的核心平台。但据统计&#xff0c;73%的企业因数据质量问题导致客户分析失真、营销效果下降。本文将深入解析影响数据准确性的关键因素&#xff0c;并提供可落地的优化方案&#xff0c;帮助企业在企微CRM软件…

Unity轻松实现麦克风录音与播放

文章目录 概要录音&#xff0c;播放音频注意事项参考 概要 之前有想写一个音乐播放的器的音频功能&#xff0c;一直没做&#xff0c;最近突然想写&#xff0c;就写了 录音&#xff0c;播放 在语言模型中&#xff0c;编码器和解码器都是由一个个的 Transformer 组件拼接在一起…

七牛云图片上传 前后端全过程

相关网址&#xff1a;七牛开发者中心 相关网站&#xff1a; 七牛开发者中心 上传流程概述 后端生成上传凭证&#xff1a;服务器端使用七牛云 SDK 生成上传凭证&#xff08;uptoken&#xff09;前端获取凭证&#xff1a;前端通过 API 向后端请求上传凭证前端上传图片&#xff1…

2025年AI生成PPT平台推荐榜单:五大智能工具革新演示创作体验

在数字化办公飞速发展的当下&#xff0c;AI生成PPT平台已成为职场人士、教育工作者和创意人群提升效率的利器。这些平台凭借先进的人工智能技术&#xff0c;打破传统PPT制作的局限&#xff0c;为用户带来便捷、高效且充满创意的制作体验。经过多维度测评&#xff0c;2025年AI生…

PHP框架在内容管理系统开发中的优势:效率、安全与扩展性!

在当今快节奏的Web开发环境中&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为企业和个人建立动态网站的核心工具。传统的手工编码开发方式在面对复杂业务逻辑、频繁迭代和安全要求时往往力不从心。而PHP框架&#xff08;如Laravel、ThinkPHP、Symfony&#xff09;的…

云原生安全实践:CI/CD流水线集成DAST工具

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 ——从零掌握DevSecOps中的动态安全测试 一、基础概念 1. DevSecOps DevSecOps 是将安全性&#xff08;Security&#xff09;融入开发&#xff08;Dev&am…

【C语言】基础知识框架补充

前文主要介绍了C语言从零开始学习的基本框架与基础知识导览&#xff0c;本文主要补充此前未提及的学习内容&#xff0c;给有意精进C语言者指明一条可供参考的学习路径。 补充一&#xff1a;动态内存管理 核心函数&#xff08;需#include <stdlib.h>&#xff09;&#xf…

垃圾识别检测与分类数据集(猫脸码客第244期)

目标检测与垃圾&#xff1a;技术革新与环境管理的交汇点 在当今社会&#xff0c;城市化进程不断加速&#xff0c;人口持续增长&#xff0c;垃圾处理问题愈发凸显其重要性。有效管理垃圾&#xff0c;不仅关乎环境卫生状况&#xff0c;更直接影响到城市的可持续发展以及居民的生…

【调研报告】2025年与2030年AI及AI智能体 (Agent) 市场份额分析报告

2025年与2030年AI及AI智能体 (Agent) 市场份额分析报告 摘要 本报告旨在深入分析全球人工智能&#xff08;AI&#xff09;市场及其子领域AI智能体的未来发展轨迹&#xff0c;重点关注其在2025年和2030年的市场规模及其占全球GDP和整体AI市场的比例。分析表明&#xff0c;AI市…

台式机电脑CPU天梯图2025年6月份更新:CPU选购指南及推荐

组装电脑选硬件的过程中,CPU的选择无疑是最关键的,因为它是最核心的硬件,关乎着一台电脑的性能好坏。对于小白来说,CPU天梯图方便直接判断两款CPU性能高低,准确的说,是多核性能。下面给大家分享一下台式机电脑CPU天梯图2025年6月版,来看看吧。 桌面CPU性能排行榜2025 台…

小白学Pinia状态管理

目录 1. 什么是 Pinia&#xff1f; 2. 为什么需要 Pinia&#xff1f; 3. Pinia 的三个核心概念 State&#xff08;状态&#xff09;- 存储数据 Getters&#xff08;计算属性&#xff09;- 处理数据 Actions&#xff08;方法&#xff09;- 修改数据 4. 创建一个简单的 St…

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…

SQL进阶之旅 Day 26:分库分表环境中的SQL策略

【SQL进阶之旅 Day 26】分库分表环境中的SQL策略 文章简述 随着业务规模的扩大&#xff0c;单一数据库难以承载海量数据与高并发访问。分库分表成为解决这一问题的关键手段&#xff0c;但同时也带来了 SQL 查询复杂度的显著提升。本文作为“SQL进阶之旅”系列的第26天内容&…