【K-Means】基于经纬度的城市聚类
文章目录
- 1. 项目准备
- 1.1. 问题导入
- 1.2. 数据集简介
- 2. K-Means算法
- 2.1. 算法特点
- 2.2. 算法流程
- 2.3. 算法缺陷
- 2.4. 算法改进
- 3. 实验步骤
- 3.1. 前期准备
- 3.2. 读入数据
- 3.3. 数据预处理
- 3.4. 模型构建与训练
- 3.5. 导出类簇信息
- 3.6. 类簇可视化
- 写在最后
1. 项目准备
1.1. 问题导入
KMeans聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。已知中国部分二级城市的经纬度,要求利用经纬度坐标进行KMeans聚类分析。
1.2. 数据集简介
本案例的数据集包含4列351行数据,每行数据包含一个城市,其中前两列为城市所在省和市,最后两列为城市的经纬度。
这是数据集的下载链接:中国主要城市经纬度数据集 - AI Studio
2. K-Means算法
2.1. 算法特点
K-Means聚类算法是一种基于向量距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为类簇是由距离靠近的对象组成的,因此它把得到紧凑且独立的类簇作为聚类的最终目标。
综上所述,K-Means算法划分的k个聚类具有以下特点:各聚类内部的元素尽可能的紧凑,而各聚类之间的元素尽可能的分开。
2.2. 算法流程
K-Means算法的基础是最小误差平方和准则,K-Means算法具体流程如下:
(1)从n个样本对象任意选择k个对象作为初始聚类中心;
(2)根据在步骤 (1) 中设置的k个聚类中心,计算每个对象与这k个中心的距离;
(3)经过步骤 (2) 的计算,所有对象与这个k个中心的距离就计算出来了,接着把所有对象与离它最近的中心归在一个类簇中;
(4)重新计算每个类簇的中心对象的位置;
(5)重复步骤 (3) 和 (4),直到类簇聚类方案中的对象归类几乎不发生变化为止。
2.3. 算法缺陷
(1)种子点的个数要事先确定,但是我们一般很难估计它的个数。
(2)K-Means算法需要初始种子点,并且随机种子会影响计算结果。
(3)需要不断地计算调整后的类簇中心,当数据量很大时,这个计算所需的时间就会很大。
2.4. 算法改进
K-Means++算法是改进后的K-Means算法,具体算法流程如下:
(1)从数据集的点中随机选择一个点作为种子点;
(2)计算数据集中的每一个点到种子点的距离D(x);
(3)选择D(x)较大的点作为新的种子点;
(4)重复步骤 (2) 和 (3)直到新的种子被选出来。
3. 实验步骤
3.1. 前期准备
- 导入模块
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score, silhouette_samples
- 设置超参数
N_CLUSTERS = 7 # 类簇的数量
MARKERS = ['*', 'v', '+', '^', 's', 'x', 'o'] # 标记样式(绘图)
COLORS = ['r', 'g', 'm', 'c', 'y', 'b', 'orange'] # 标记颜色(绘图)
DATA_PATH = './data/China_cities.csv' # 数据集路径
3.2. 读入数据
df = pd.read_csv(DATA_PATH)
print(df.head()) # 展示前5行数据
前5行数据的输出结果:
省级行政区 城市 北纬 东经
0 北京 北京市 39.904690 116.40717
1 天津 天津市 39.085100 117.19937
2 上海 上海市 31.230370 121.47370
3 重庆 重庆市 29.564710 106.55073
4 香港特别行政区 九龙 22.327115 114.17495
3.3. 数据预处理
我们需要将各城市的经纬度数据单独提取出来。
x = df.drop('省级行政区', axis=1)
x = x.drop("城市", axis=1)
x_np = np.array(x) # 将x转化为numpy数组
3.4. 模型构建与训练
本项目使用K-Means聚类算法来对城市的经纬度特征进行聚类。
model = KMeans(N_CLUSTERS) # 构建聚类器
model.fit(x) # 训练聚类器
- 计算轮廓系数
轮廓系数(Silhouette Coefficient)是一种评价聚类效果的方法,其值介于 [ − 1 , 1 ] [-1, 1] [−1,1]之间,值越趋近于 1 1 1代表同簇点的内聚度和异簇点的分离度都相对较优。
假设我们用K-Means算法将数据划分成 K K K个类簇,对于某簇中任意一个向量 i i i而言,其轮廓系数 S i = B i − A i m a x ( A i , B i ) S_i = \frac{B_i-A_i}{max(A_i, B_i)} Si=max(Ai,Bi)Bi−Ai。其中, A i A_i Ai是 i i i到同簇中其它所有点距离的平均值,它是 i i i与同簇内其他点不相似程度的平均值; B i B_i Bi是 i i i到其他簇内所有点平均距离的最小值,它是 i i i与其他簇的点平均不相似程度的最小值。
将所有点的轮廓系数求平均,就能得到该聚类结果总的轮廓系数。
labels = model.labels_ # 获取聚类标签# print(silhouette_samples(x, labels)) # 获取所有样本的轮廓系数
print(silhouette_score(x, labels)) # 获取聚类结果总的轮廓系数
模型的轮廓系数如下:
0.40034267246878397
3.5. 导出类簇信息
- 导出类簇中心
print(model.cluster_centers_) # 输出类簇中心
最终的类簇中心如下:
[[ 36.30742841 105.21526409][ 27.85671809 102.12971362][ 41.34384438 84.09634 ][ 44.01411423 124.90852352][ 24.3572954 111.87362376][ 29.06106948 118.51486687][ 36.22217001 115.34626425]]
- 导出类簇元素
for i in range(N_CLUSTERS):print(f" CLUSTER-{i+1} ".center(60, '='))print(df[labels == i])
各类簇包含的元素如下:
======================== CLUSTER-1 =========================省级行政区 城市 北纬 东经
2 上海 上海市 31.230370 121.473700
10 台湾省 台中市 24.138620 120.679510
11 台湾省 台北市 25.037798 121.565170
.. ... ... ... ...
======================== CLUSTER-2 =========================省级行政区 城市 北纬 东经
3 重庆 重庆市 29.56471 106.55073
221 四川省 成都市 30.57020 104.06476
222 四川省 自贡市 29.33920 104.77844
.. ... ... ... ...
======================== CLUSTER-3 =========================省级行政区 城市 北纬 东经
0 北京 北京市 39.90469 116.40717
1 天津 天津市 39.08510 117.19937
17 河北省 石家庄市 38.04276 114.51430
.. ... ... ... ...
======================== CLUSTER-4 =========================省级行政区 城市 北纬 东经
336 西藏自治区 阿里地区 30.40051 81.14540
337 新疆维吾尔自治区 乌鲁木齐市 43.82663 87.61688
338 新疆维吾尔自治区 克拉玛依市 45.57999 84.88927
.. ... ... ... ...
======================== CLUSTER-5 =========================省级行政区 城市 北纬 东经
4 香港特别行政区 九龙 22.327115 114.174950
5 香港特别行政区 新界 22.341766 114.202408
6 香港特别行政区 香港岛 22.266416 114.177314
.. ... ... ... ...
======================== CLUSTER-6 =========================省级行政区 城市 北纬 东经
73 辽宁省 沈阳市 41.677180 123.463100
74 辽宁省 大连市 38.913690 121.614760
75 辽宁省 鞍山市 41.107770 122.994600
.. ... ... ... ...
======================== CLUSTER-7 =========================省级行政区 城市 北纬 东经
267 陕西省 西安市 34.34127 108.93984
268 陕西省 铜川市 34.89673 108.94515
269 陕西省 宝鸡市 34.36194 107.23732
.. ... ... ... ...
3.6. 类簇可视化
plt.figure(figsize=(9, 6))
plt.title("Major Cities in China", fontsize=22)
plt.xlabel('East Longitude', fontsize=18)
plt.ylabel('North Latitude', fontsize=18)for i in range(N_CLUSTERS):members = labels == i # members是一个布尔型数组plt.scatter(x_np[members, 1], # 城市经度数组x_np[members, 0], # 城市纬度数组marker = MARKERS[i], # 标记样式c = COLORS[i] # 标记颜色) # 绘制散点图plt.grid()
plt.show()
基于经纬度的城市聚类结果:
写在最后
- 如果您发现项目存在问题,或者如果您有更好的建议,欢迎在下方评论区中留言讨论~
- 这是本项目的链接:实验项目 - AI Studio,点击
fork
可直接在AI Studio运行~- 这是我的个人主页:个人主页 - AI Studio,来AI Studio互粉吧,等你哦~
- 【友链滴滴】欢迎大家随时访问我的个人博客~
【K-Means】基于经纬度的城市聚类相关推荐
- kmeans改进 matlab,基于距离函数的改进k―means 算法
摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...
- OpenCV的k - means聚类 -对图片进行颜色量化
OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...
- OpenCV官方文档 理解k - means聚类
理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...
- k均值聚类算法(K Means)及其实战案例
算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...
- 怎么确定K均值聚类中的K(基于matlab)
k均值算法原理和优缺点 点击打开链接 定义 D=类内平均距离/类间平均距离 不同的K有不同的D,D越小越好,但k也不能过大,根据实际情况取. 数据集 96个维度的616条数据. matlab代码 cl ...
- 基于改进层次凝聚聚类算法的垃圾收运跨区域调度策略
1引言: 垃圾收运的各个环节是控制垃圾回收成本的关键,当前分区域运营模式存在以下问题: 运营成本高:分区域运营模式限制了城市生活垃圾收集和运输的各个环节.从一个区域的特定街道收集的垃圾只能在该区域街道 ...
- Python实现经纬度空间点DBSCAN聚类
写在前面 博主前期科研工作中,涉及到要对某个地区的一些空间点进行聚类分析,想到读研期间,曾经用DBSCAN聚类算法实现了四线激光雷达扫描的三维点云数据聚类(论文题目:基于改进DBSCAN算法的激光雷达 ...
- 基于图神经网络的聚类研究与应用
Datawhale干货 本文编辑:Datawhale 用手机上网的时候,总有种感觉,推荐的视频是我爱看的,推荐的美食是我爱吃的,大家长的又好看,说话又好听. 有时候会对自己发出灵魂拷问:难道隐私被记录 ...
- 文献记录(part89)--I-k-means-+:An iterative clustering algorithm based on an enhanced k -means
学习笔记,仅供参考,有错必究 关键词:k均值:解决方案改进:准确的k均值:迭代改进 I-k-means-+:An iterative clustering algorithm based on an ...
最新文章
- iOS通关书单,Android可入
- Python爬虫的终极必杀绝技
- [转帖]Linux中的15个基本‘ls’命令示例
- python样本不均衡_使用Python中的smote处理正负样本之间的不平衡,python,实现,失衡,问题...
- vue 外部方法调用内部_vue 的进阶之路
- 用python解决约瑟夫环
- 为什么说吉利博越定义了智能SUV
- 【案例】复制静止问题一则
- 网站的动静分离实践(动静分离)
- 凸包算法与JAVA求解的基本思路
- centos7字体颜色改变_CentOS7.3中设置Shell终端文本外观自定义字体
- php实现酒店客房管理系统,基于ssh/jsp/java/asp.net/php的酒店客房管理系统
- vocabulary
- 微信小程序地图定位当前位置
- BEC listen and translation exercise 39
- Canonical标签的作用及使用方法
- ubuntu18.04或20.04 安装显卡驱动
- python编写一个名为collatz()的函数,它有一个名为number的参数,如果参数是偶数,那么collatz()就打印出number//2,如果number是奇数,collatz()就打印3*
- 使用 js 将图片进行转Base64转码
- 计算机相关专业考研不考数学,2018考研不考数学的专业有哪些
热门文章
- 使用@Constraint配合自定义注解开发
- 智能电子中的自动化控制:流程优化、执行与决策
- Flask之多个应用接口
- 关于开源项目「基于ZigBee和STM32的智能家居控制系统」的使用说明
- 不妙,2023年浙大mpa的复试形势比想象的更严峻,又在突突突涨……
- 基于verlog语言的UART通信协议模块实现
- samba服务器的安全协议,配置与管理samba服务器
- 发光二极管pcb封装图画法_基础篇 -- 二极管
- XLM:Cross-lingual Language Model Pretraining(2019-1-22)
- 日本冲绳科学技术研究所启动新量子技术中心OQT