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

关于机器学习-基于2023年度各省统计数据的降维后再Kmean聚类后的另一种可视化

追梦IT人 2025-02-20
13
本文和前文在数据标准化、降维和聚类方法上是一致的,在可视化上略有不同,前文仅限于地理数据的可视化,本文可拓展到各类数据,理论上2维数据、三维数据等更高维度的数据,均可实现可视化。
此处代码和前文是一致的,因此不再赘述。
  1. # 导入库
  2. import pandas as pd # panda
  3. import matplotlib.pyplot as plt
  4. from sklearn.preprocessing import StandardScaler # 标准化库
  5. from sklearn.cluster import KMeans  # 导入sklearn聚类模块
  6. from sklearn.metrics import silhouette_score   # 效果评估模块
  7. from sklearn.decomposition import PCA
  8. import matplotlib

  9. # 替换为你的文件路径
  10. data_path = r'E:\JetBrains\PythonProject\DeepLearning\provicedata.csv'
  11. df = pd.read_csv(data_path)
  12. # 选择特征列
  13. features = ['GDP', 'Primary industry', 'Primary industry','Primary industry',
  14.             'resident population','population growth rate',
  15.             'import and export','export value','import value',
  16.             'General budget revenue','General budget expenditure',
  17.             'Per capita disposable income','Per capita consumption expenditure','area']  # 替换为你的特征列名
  18. = df[features]
  19. n_samples, n_features = X.shape
  20. print('样本数:%d , 特征数:%d' % (n_samples, n_features))

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

  35. # 数据归一化
  36. scaler = StandardScaler()
  37. scalerX = scaler.fit_transform(X)

  38. for i in range(2,5):
  39.     # 1.components:特征空间中的主轴,表示数据中最大方差的方向。组件按排序 explained_variance_
  40.     # 2.explained_variance_:它代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分
  41.     # 3.explained_variance_ratio_:它代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分
  42.     # 4.singular_values_:每个特征的奇异值,奇异值等于n_components 低维空间中变量的2范数
  43.     # 5.mean_:每个特征的均值
  44.     # 6.n_components_:即是上面输入的参数值
  45.     # 7.n_features_:训练数据中的特征数量
  46.     # 8.n_samples_:训练数据中的样本数
  47.     # 9.noise_variance_:等于X协方差矩阵的(minn_featuresn_samples)-n_components)个最小特征值的平均值
  48.     pca = PCA(n_components=i)
  49.     pcaX = pca.fit_transform(scalerX)
  50.     print("For n_components={}, The PCA explained_variance_ratio_ is {}".format(i, pca.explained_variance_ratio_))
  51.     # For n_components=2, The PCA explained_variance_ratio_ is [0.54113074 0.30908829]
  52.     # For n_components=3, The PCA explained_variance_ratio_ is [0.54113074 0.30908829 0.06978044]
  53.     # For n_components=4, The PCA explained_variance_ratio_ is [0.54113074 0.30908829 0.06978044 0.04070103]

  54. pca = PCA(n_components=2)
  55. pcaX = pca.fit_transform(scalerX)

以下代码主要是在不同聚类类别聚类过程中,同时基于PCA的主成分进行特征可视化展示。

  1. # 设置matplotlib正常显示中文和负号
  2. matplotlib.rcParams['font.family'] = 'SimHei'  # 设置字体为黑体
  3. matplotlib.rcParams['axes.unicode_minus'] = False  # 正确显示负号
  4. for k in range(3,6):
  5.     # 模型训练
  6.     KmeansModel = KMeans(n_clusters=k, random_state=42)
  7.     KmeansModel.fit(pcaX)
  8.     kmeansY = KmeansModel.predict(pcaX)
  9.     # 计算轮轴系数:
  10.     # 轮廓系数用于计算每个样本的平均簇内距离a(样本i到同簇其他样本的平均距离,ai值越小说明该样本越应该被聚到该类,即簇内不相似度)和平均邻近簇距离b(样本i到其他相邻簇的所有样本的平均距离bibi越大说明样本i越不属于其他簇,即簇间不相似度)。
  11.     # 每个样本的轮廓系数计算公式为:(b-a)/Max(a,b),轮廓系数越接近1说明结果越好(聚类越准确),越接近-1说明结果越差,若值在0值附近,则说明样本在两个簇的边界上
  12.     score = silhouette_score(pcaX, KmeansModel.labels_, metric='euclidean')
  13.     print("For n_clusters={}, The Silhouette Coefficient is {}".format(k, score))
  14.     # 合并数据和特征
  15.     kmeans_labels = pd.DataFrame(KmeansModel.labels_, columns=['scaler pca kmean labels'+str(k)])
  16.     df = df.join(kmeans_labels)

  17.     # 绘制结果
  18.     plt.figure(figsize=(14, 8))
  19.     plt.scatter(pcaX[:, 0], pcaX[:, 1], c=KmeansModel.labels_, cmap='viridis', marker='o', edgecolor='k', s=50)  # 绘制聚类结果
  20.     for i, txt in enumerate(df['city']):
  21.         plt.text(pcaX[:, 0][i], pcaX[:, 1][i], txt)
  22.     plt.xlabel('第一特征')
  23.     plt.ylabel('第二特征 Component 2')
  24.     plt.title('PCA and KMeans Clustering '+str(k))
  25.     plt.colorbar(label='Cluster')  # 显示颜色条表示不同的聚类中心
  26.     plt.show()

三个聚类簇时的可视化展现效果

四个聚类簇时的可视化展现效果
五个聚类簇时的可视化展现效果
最后欢迎关注公众号:python与大数据分析

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

评论