機器學習+城市規劃第十四期:利用半參數地理加權回歸來實現區域帶寬不同的規劃任務

機器學習+城市規劃第十四期:利用半參數地理加權回歸來實現區域帶寬不同的規劃任務

引言

在城市規劃中,如何根據不同地區的地理特征來制定有效的規劃方案是一個關鍵問題。不同區域的需求和規律是不同的,因此我們必須考慮到地理空間的差異性。本期博客將介紹如何結合機器學習方法,利用地理加權聚類(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天內容&…