暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关于机器学习-基于2023年度各省统计数据的Kmean聚类

追梦IT人 2025-02-17
57

‌K-Means聚类算法是一种常用的聚类方法,具有简单、快速的特点,适用于处理大数据集。‌

基本原理

K-Means聚类算法的核心思想是将数据集分成K个簇,每个簇由其质心(中心点)代表。算法首先随机选择K个数据点作为初始质心,然后根据每个数据点到各个质心的距离,将其分配到最近的质心所代表的簇中。接着,重新计算每个簇的质心,如果新的质心与旧的质心变化很小,则算法收敛,聚类结束;否则继续迭代。‌

但看算法本身比较简单,也许sklearn和别人的例子我们都已经不太相信,我们可找一些真实的数据和案例,比如2023年度各省市自治区的相关统计数据,看看我们能聚类出什么效果。

数据来自国家统计局 https://www.stats.gov.cn/sj/#,地区数据-分省年度数据-2023年数据。

手工获取的数据已放到网盘,自行下载:

https://pan.baidu.com/s/1lSzDQc5A8EiRUon9UWX0Cg?pwd=2023
我们可以导入pandas和sklearn库,看一下数据的情况
  1. # 导入库
  2. import pandas as pd # panda
  3. from sklearn.cluster import KMeans  # 导入sklearn聚类模块
  4. from sklearn.metrics import silhouette_score   # 效果评估模块

  5. # 替换为你的文件路径
  6. data_path = r'E:\JetBrains\PythonProject\DeepLearning\provicedata.csv'
  7. df = pd.read_csv(data_path)
  8. # 相关数据来自国家统计局 https://www.stats.gov.cn/sj/
  9. # 地区数据-分省年度数据-2023年数据
  10. # GDP,第一产业,第二产业,第三产业,
  11. # 常驻居民人数,居民人口增长率,
  12. # 进出口额,出口额,进口额,
  13. # 一般预算收入、一般预算支出、
  14. # 人均可支配收入、人均消费支出、地区面积
  15. features = ['GDP', 'Primary industry', 'Primary industry','Primary industry',
  16.             'resident population','population growth rate',
  17.             'import and export','export value','import value',
  18.             'General budget revenue','General budget expenditure',
  19.             'Per capita disposable income','Per capita consumption expenditure','area']  # 替换为你的特征列名
  20. = df[features]
  21. n_samples, n_features = X.shape
  22. print('样本数:%d , 特征数:%d' % (n_samples, n_features))

sklearn.cluster.KMeans‌是scikit-learn库中的一个聚类算法,主要用于将数据集分成K个簇,使得每个簇内的数据点相似度最大,而簇间的数据点相似度最小。K-means算法的核心思想是通过迭代地更新簇中心来优化簇的划分

这里我们分别将聚类簇数设置为3、4、5

  1. # 导入库
  2. # sklearn.cluster.KMeans(n_clusters=K)
  3. # 1. n_cluster:聚类个数(即K),默认值是8
  4. # 2. init:初始化类中心的方法(即选择初始中心点的根据),默认“K-means++”,其他可选参数包括“random”。
  5. # 3. n_init:使用不同类中心运行的次数,默认值是10,即算法会初始化10次簇中心,然后返回最好的一次聚类结果。
  6. # 4. max_iter:单次运行KMeans算法的最大迭代次数,默认值是300
  7. # 5. tol:浮点型,两次迭代之间簇内平方和下降的容忍阈值,默认为0.0001,如果两次迭代之间下降的值小于tol所设定的值,迭代就会停下。
  8. # 6. verbose:是否输出详细信息,参数类型为整型,默认值为01表示每隔一段时间打印一次日志信息。
  9. # 7. random_state:控制每次类中心随机初始化的随机种子,作用相当于能够锁定和复现同一次随机结果,默认为none,也可以随机设置数字。
  10. # 8. copy_x:在预先计算距离时,首先将数据居中在数值上更准确。如果 copy_x  True(默认),则不修改原始数据。
  11. #   如果为 False,则修改原始数据,并在函数返回之前放回,但通过减去再添加数据均值可能会引入小的数值差异。
  12. #   请注意,如果原始数据不是C-contiguous,即使copy_x False,也会进行复制。如果原始数据是稀疏的,但不是 CSR 格式,即使 copy_x  False,也会进行复制。
  13. # 9. algorithm:有三种参数可选:auto”, full”, elkan”,默认为autoK-means 算法使用。
  14. #   经典的EM-style算法是“full”。通过使用三角不等式,“elkan 变体对具有明确定义的集群的数据更有效。
  15. #   然而,由于分配了一个额外的形状数组(n_samplesn_clusters),它更加占用内存。


  16. for k in range(3,6):
  17.     # 模型训练
  18.     KmeansModel = KMeans(n_clusters=k, random_state=42)
  19.     KmeansModel.fit(X)
  20.     # 计算轮轴系数:
  21.     # 轮廓系数用于计算每个样本的平均簇内距离a(样本i到同簇其他样本的平均距离,ai值越小说明该样本越应该被聚到该类,即簇内不相似度)和平均邻近簇距离b(样本i到其他相邻簇的所有样本的平均距离bibi越大说明样本i越不属于其他簇,即簇间不相似度)。
  22.     # 每个样本的轮廓系数计算公式为:(b-a)/Max(a,b),轮廓系数越接近1说明结果越好(聚类越准确),越接近-1说明结果越差,若值在0值附近,则说明样本在两个簇的边界上
  23.     score = silhouette_score(X, KmeansModel.labels_, metric='euclidean')
  24.     print("For n_clusters={}, The Silhouette Coefficient is {}".format(k, score))
  25.     # 合并数据和特征
  26.     kmeans_labels = pd.DataFrame(KmeansModel.labels_, columns=['kmean labels'+str(k)])
  27.     df = df.join(kmeans_labels)
  28. df.to_csv('provicedatav1.csv', index=False, header=True, encoding='utf-8')

关于聚类结果问题,很难说有一个明确的结论,每个人看待数据都有不同的结论,例如北京、上海基本为一类,浙江、江苏、山东基本为一类,广东有些另类,河南河北山西陕西为一类,内蒙新疆西藏可以为一类,基于不同的逻辑可以分为若干类,我们这里仅做比较,不做结论。后续通过可视化方式,可以看一下

最后欢迎关注公众号:python与大数据分析


文章转载自追梦IT人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论