文章目录

  • 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】基于经纬度的城市聚类相关推荐

  1. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  2. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  3. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  4. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  5. 怎么确定K均值聚类中的K(基于matlab)

    k均值算法原理和优缺点 点击打开链接 定义 D=类内平均距离/类间平均距离 不同的K有不同的D,D越小越好,但k也不能过大,根据实际情况取. 数据集 96个维度的616条数据. matlab代码 cl ...

  6. 基于改进层次凝聚聚类算法的垃圾收运跨区域调度策略

    1引言: 垃圾收运的各个环节是控制垃圾回收成本的关键,当前分区域运营模式存在以下问题: 运营成本高:分区域运营模式限制了城市生活垃圾收集和运输的各个环节.从一个区域的特定街道收集的垃圾只能在该区域街道 ...

  7. Python实现经纬度空间点DBSCAN聚类

    写在前面 博主前期科研工作中,涉及到要对某个地区的一些空间点进行聚类分析,想到读研期间,曾经用DBSCAN聚类算法实现了四线激光雷达扫描的三维点云数据聚类(论文题目:基于改进DBSCAN算法的激光雷达 ...

  8. 基于图神经网络的聚类研究与应用

    Datawhale干货 本文编辑:Datawhale 用手机上网的时候,总有种感觉,推荐的视频是我爱看的,推荐的美食是我爱吃的,大家长的又好看,说话又好听. 有时候会对自己发出灵魂拷问:难道隐私被记录 ...

  9. 文献记录(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 ...

最新文章

  1. iOS通关书单,Android可入
  2. Python爬虫的终极必杀绝技
  3. [转帖]Linux中的15个基本‘ls’命令示例
  4. python样本不均衡_使用Python中的smote处理正负样本之间的不平衡,python,实现,失衡,问题...
  5. vue 外部方法调用内部_vue 的进阶之路
  6. 用python解决约瑟夫环
  7. 为什么说吉利博越定义了智能SUV
  8. 【案例】复制静止问题一则
  9. 网站的动静分离实践(动静分离)
  10. 凸包算法与JAVA求解的基本思路
  11. centos7字体颜色改变_CentOS7.3中设置Shell终端文本外观自定义字体
  12. php实现酒店客房管理系统,基于ssh/jsp/java/asp.net/php的酒店客房管理系统
  13. vocabulary
  14. 微信小程序地图定位当前位置
  15. BEC listen and translation exercise 39
  16. Canonical标签的作用及使用方法
  17. ubuntu18.04或20.04 安装显卡驱动
  18. python编写一个名为collatz()的函数,它有一个名为number的参数,如果参数是偶数,那么collatz()就打印出number//2,如果number是奇数,collatz()就打印3*
  19. 使用 js 将图片进行转Base64转码
  20. 计算机相关专业考研不考数学,2018考研不考数学的专业有哪些

热门文章

  1. 使用@Constraint配合自定义注解开发
  2. 智能电子中的自动化控制:流程优化、执行与决策
  3. Flask之多个应用接口
  4. 关于开源项目「基于ZigBee和STM32的智能家居控制系统」的使用说明
  5. 不妙,2023年浙大mpa的复试形势比想象的更严峻,又在突突突涨……
  6. 基于verlog语言的UART通信协议模块实现
  7. samba服务器的安全协议,配置与管理samba服务器
  8. 发光二极管pcb封装图画法_基础篇 -- 二极管
  9. XLM:Cross-lingual Language Model Pretraining(2019-1-22)
  10. 日本冲绳科学技术研究所启动新量子技术中心OQT