【K-Means】基于经纬度的城市聚类

文章目录

  • 问题导入
  • 一、K-Means算法
  • 二、实验数据集
  • 三、实验步骤
    • 1.导入模块
    • 2.读入数据
    • 3.数据预处理
    • 4.模型构建与训练
    • 5.数据可视化
  • 写在最后


问题导入

K-means聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。已知中国部分二级城市的经纬度,要求利用经纬度坐标进行K-Means聚类分析。


一、K-Means算法

  • K-Means算法的特点

K-Means聚类算法是一种基于向量距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为类簇是由距离靠近的对象组成的,因此它把得到紧凑且独立的类簇作为聚类的最终目标。
综上所述,K-Means算法划分的k个聚类具有以下特点:各聚类内部的元素尽可能的紧凑,而各聚类之间的元素尽可能的分开。

  • K-Means算法的流程

k-means算法的基础是最小误差平方和准则,k-means算法具体流程如下:
(1)从n个样本对象任意选择k个对象作为初始聚类中心;
(2)根据在步骤 (1) 中设置的k个聚类中心,计算每个对象与这k个中心的距离;
(3)经过步骤 (2) 的计算,所有对象与这个k个中心的距离就计算出来了,接着把所有对象与离它最近的中心归在一个类簇中;
(4)重新计算每个类簇的中心对象的位置;
(5)重复步骤 (3) 和 (4),直到类簇聚类方案中的对象归类几乎不发生变化为止。

  • K-Means算法的注意事项

需要事先给定“类簇的数量”以及“初始的类中心”。

  • K-Means算法的缺陷

(1)种子点的个数要事先确定,但是我们一般很难估计它的个数。
(2)K-Means算法需要初始种子点,并且随机种子会影响计算结果。
(3)需要不断地计算调整后的类簇中心,当数据量很大时,这个计算所需的时间就会很大。


二、实验数据集

本案例的数据集包含4列351行数据,每行数据包含一个城市,其中前两列为城市所在省和市,最后两列为城市的经纬度。

这是数据集的下载链接:中国主要城市经纬度数据集 - Baidu AI Studio


三、实验步骤

1.导入模块

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

2.读入数据

# ------ 1.导入数据 ------
df = pd.read_csv('China_cities.csv')  # 此处注意换成自己的数据集路径
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.数据预处理

# ------ 2.提取经纬度数据 ------
x = df.drop('省级行政区', axis=1)
x = x.drop("城市", axis=1)
x_np = np.array(x)        # 将x转化为numpy数组

4.模型构建与训练

本项目使用“KMeans聚类算法”来对城市的经纬度特征进行聚类。

# ------ 3.构造K-Means聚类器 ------
n_clusters = 7                  # 类簇的数量
estimator = KMeans(n_clusters)  # 构建聚类器

# ------ 4.训练K-Means聚类器 ------
estimator.fit(x)

5.数据可视化

# ------ 5.数据可视化 ------
markers = ['*', 'v', '+', '^', 's', 'x', 'o']      # 标记样式列表
colors = ['r', 'g', 'm', 'c', 'y', 'b', 'orange']  # 标记颜色列表
labels = estimator.labels_      # 获取聚类标签

plt.figure(figsize=(9, 6))
plt.title("Major Cities in China", fontsize=25)
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()

基于经纬度的城市聚类结果:
【K-Means】基于经纬度的城市聚类_第1张图片


写在最后

  • 如果您发现项目存在问题,或者如果您有更好的建议,欢迎在下方评论区中留言讨论~
  • 这是本项目的链接:实验项目 - Baidu AI Studio,点击fork可直接在AI Studio运行~
  • 这是我的个人主页:个人主页 - Baidu AI Studio,来AI Studio互粉吧,等你哦~

你可能感兴趣的:(机器学习,机器学习,聚类,kmeans算法,python)