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

关于机器学习-基于2023年度各省统计数据的十一种聚类方法(DBSCAN、GaussianMixture、Birch等)和可视化

追梦IT人 2025-02-21
14
scikit-learn库中使用10种不同的聚类算法,包括AP聚类、聚合聚类、BIRCH、DBSCAN、K-均值、Mini-BatchK-均值、MeanShift、OPTICS、谱聚类和高斯混合模型。其中例如Kmean聚类、谱聚类、高斯混合模型等需要指定聚类数量,其他一些不需要。如前文所述,聚类的结果虽然有一些量化标准,但更多的取决于个人的主观判断

cluster.MeanShift是一种基于核密度估计,通过不断移动样本点到其局部密度最大点来发现数据簇的无监督学习聚类算法。

cluster.MiniBatchKMeans是 K-Means 算法的变体,利用小批量数据来更新聚类中心,以减少计算量并提高聚类速度。

cluster.AgglomerativeClustering是一种层次聚类算法,它从每个数据点作为一个单独的类开始,逐步合并相似的类以形成聚类层次结构。

cluster.SpectralClustering基于给定数据点的相似性矩阵构建图,利用图的谱性质,如拉普拉斯矩阵的特征值和特征向量来进行聚类。

cluster.DBSCAN是一种基于密度的空间聚类算法,能够发现任意形状的簇,将密度相连的数据点划分为一个聚类,并识别出噪声点。

cluster.HDBSCAN是 DBSCAN 的扩展,它通过基于层次密度的方法,能够更有效地处理密度变化较大的数据,并能发现不同密度下的聚类结构。

cluster.OPTICS也是一种基于密度的聚类算法,它为数据点生成一个排序,表示数据点的密度可达性,从而可以根据不同的密度阈值提取出不同的聚类结果。

cluster.AffinityPropagation通过数据点之间传递消息,根据数据点之间的相似度来寻找聚类中心,并将数据点分配到相应的聚类中。

cluster.Birch是一种基于树结构的聚类算法,它通过构建聚类特征树来对数据进行聚类,能够处理大规模数据并具有较好的可扩展性。

mixture.GaussianMixture是一种基于概率模型的聚类方法,假设数据是由多个高斯分布混合而成,通过估计每个高斯分布的参数来确定聚类。

废话少叙,开始代码,第一部分不用看。
  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. from sklearn import cluster, datasets, mixture
  10. from sklearn.neighbors import kneighbors_graph
  11. import time
  12. import warnings
  13. import numpy as np
  14. from itertools import cycle, islice


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

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

  41. # 数据归一化
  42. scaler = StandardScaler()
  43. scalerX = scaler.fit_transform(X)

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

  60. pca = PCA(n_components=2)
  61. pcaX = pca.fit_transform(scalerX)

这部分代码主要是各类聚类算法之前的参数定义工作。

  1. # 导入库

  2. default_base = {
  3.     "quantile": 0.3,
  4.     "eps": 0.3,
  5.     "damping": 0.9,
  6.     "preference": -200,
  7.     "n_neighbors": 3,
  8.     "n_clusters": 3,
  9.     "min_samples": 7,
  10.     "xi": 0.05,
  11.     "min_cluster_size": 0.1,
  12.     "allow_single_cluster": True,
  13.     "hdbscan_min_cluster_size": 15,
  14.     "hdbscan_min_samples": 3,
  15.     "random_state": 42,
  16. }
  17. params = default_base.copy()

  18. # estimate bandwidth for mean shift
  19. bandwidth = cluster.estimate_bandwidth(pcaX, quantile=params["quantile"])
  20. # connectivity matrix for structured Ward
  21. connectivity = kneighbors_graph(
  22.     pcaX, n_neighbors=params["n_neighbors"], include_self=False
  23. )
  24. # make connectivity symmetric
  25. connectivity = 0.5 * (connectivity + connectivity.T)


  26. # cluster.MeanShift是一种基于核密度估计,通过不断移动样本点到其局部密度最大点来发现数据簇的无监督学习聚类算法。
  27. # cluster.MiniBatchKMeans K-Means 算法的变体,利用小批量数据来更新聚类中心,以减少计算量并提高聚类速度。
  28. # cluster.AgglomerativeClustering是一种层次聚类算法,它从每个数据点作为一个单独的类开始,逐步合并相似的类以形成聚类层次结构。
  29. # cluster.SpectralClustering基于给定数据点的相似性矩阵构建图,利用图的谱性质,如拉普拉斯矩阵的特征值和特征向量来进行聚类。
  30. # cluster.DBSCAN是一种基于密度的空间聚类算法,能够发现任意形状的簇,将密度相连的数据点划分为一个聚类,并识别出噪声点。
  31. # cluster.HDBSCAN DBSCAN 的扩展,它通过基于层次密度的方法,能够更有效地处理密度变化较大的数据,并能发现不同密度下的聚类结构。
  32. # cluster.OPTICS也是一种基于密度的聚类算法,它为数据点生成一个排序,表示数据点的密度可达性,从而可以根据不同的密度阈值提取出不同的聚类结果。
  33. # cluster.AffinityPropagation通过数据点之间传递消息,根据数据点之间的相似度来寻找聚类中心,并将数据点分配到相应的聚类中。
  34. # cluster.Birch是一种基于树结构的聚类算法,它通过构建聚类特征树来对数据进行聚类,能够处理大规模数据并具有较好的可扩展性。
  35. # mixture.GaussianMixture是一种基于概率模型的聚类方法,假设数据是由多个高斯分布混合而成,通过估计每个高斯分布的参数来确定聚类。
  36. ms = cluster.MeanShift(bandwidth=bandwidth, bin_seeding=True)
  37. two_means = cluster.MiniBatchKMeans(n_clusters=params["n_clusters"],random_state=params["random_state"],)
  38. ward = cluster.AgglomerativeClustering(n_clusters=params["n_clusters"], linkage="ward", connectivity=connectivity)
  39. spectral = cluster.SpectralClustering(
  40.     n_clusters=params["n_clusters"],
  41.     eigen_solver="arpack",
  42.     affinity="nearest_neighbors",
  43.     random_state=params["random_state"],
  44. )
  45. dbscan = cluster.DBSCAN(eps=params["eps"])
  46. hdbscan = cluster.HDBSCAN(
  47.     min_samples=params["hdbscan_min_samples"],
  48.     min_cluster_size=params["hdbscan_min_cluster_size"],
  49.     allow_single_cluster=params["allow_single_cluster"],
  50. )
  51. optics = cluster.OPTICS(
  52.     min_samples=params["min_samples"],
  53.     xi=params["xi"],
  54.     min_cluster_size=params["min_cluster_size"],
  55. )
  56. affinity_propagation = cluster.AffinityPropagation(
  57.     damping=params["damping"],
  58.     preference=params["preference"],
  59.     random_state=params["random_state"],
  60. )
  61. average_linkage = cluster.AgglomerativeClustering(
  62.     linkage="average",
  63.     metric="cityblock",
  64.     n_clusters=params["n_clusters"],
  65.     connectivity=connectivity,
  66. )
  67. birch = cluster.Birch(n_clusters=params["n_clusters"])
  68. gmm = mixture.GaussianMixture(
  69.     n_components=params["n_clusters"],
  70.     covariance_type="full",
  71.     random_state=params["random_state"],
  72. )

  73. clustering_algorithms = (
  74.     ("MiniBatch\nKMeans", two_means),
  75.     ("Affinity\nPropagation", affinity_propagation),
  76.     ("MeanShift", ms),
  77.     ("Spectral\nClustering", spectral),
  78.     ("Ward", ward),
  79.     ("Agglomerative\nClustering", average_linkage),
  80.     ("DBSCAN", dbscan),
  81.     ("HDBSCAN", hdbscan),
  82.     ("OPTICS", optics),
  83.     ("BIRCH", birch),
  84.     ("Gaussian\nMixture", gmm),
  85. )

第三部分代码,根据聚类算法字典开始迭代,按照统计各类算法的整体时长、开展预测、将预测结果pandas数据列、可视化聚类结果等步骤执行。

  1. # 设置matplotlib正常显示中文和负号
  2. matplotlib.rcParams['font.family'] = 'SimHei'  # 设置字体为黑体
  3. matplotlib.rcParams['axes.unicode_minus'] = False  # 正确显示负号

  4. for name, algorithm in clustering_algorithms:
  5.     t0 = time.time()
  6.     # catch warnings related to kneighbors_graph
  7.     with warnings.catch_warnings():
  8.         warnings.filterwarnings(
  9.                 "ignore",
  10.                 message="the number of connected components of the "
  11.                 + "connectivity matrix is [0-9]{1,2}"
  12.                 + " > 1. Completing it to avoid stopping the tree early.",
  13.                 category=UserWarning,
  14.             )
  15.         warnings.filterwarnings(
  16.                 "ignore",
  17.                 message="Graph is not fully connected, spectral embedding"
  18.                 + " may not work as expected.",
  19.                 category=UserWarning,
  20.             )
  21.         algorithm.fit(pcaX)
  22.     t1 = time.time()
  23.     if hasattr(algorithm, "labels_"):
  24.         y_pred = algorithm.labels_.astype(int)
  25.     else:
  26.         y_pred = algorithm.predict(pcaX)

  27.     # 合并数据和特征
  28.     kmeans_labels = pd.DataFrame(y_pred, columns=[name])
  29.     df = df.join(kmeans_labels)

  30.     colors = np.array(
  31.         list(
  32.             islice(
  33.                 cycle(
  34.                     [
  35.                         "#377eb8",
  36.                         "#ff7f00",
  37.                         "#4daf4a",
  38.                         "#f781bf",
  39.                         "#a65628",
  40.                         "#984ea3",
  41.                         "#999999",
  42.                         "#e41a1c",
  43.                         "#dede00",
  44.                     ]
  45.                 ),
  46.                 int(max(y_pred) + 1),
  47.             )
  48.         )
  49.     )
  50.     # add black color for outliers (if any)
  51.     colors = np.append(colors, ["#000000"])
  52.     plt.figure(figsize=(14, 8))
  53.     plt.scatter(pcaX[:, 0], pcaX[:, 1], s=20, color=colors[y_pred] , marker='o', edgecolor='k',)
  54.     for i, txt in enumerate(df['city']):
  55.         plt.text(pcaX[:, 0][i], pcaX[:, 1][i], txt)
  56.     plt.xlabel('第一特征')
  57.     plt.ylabel('第二特征 Component 2')
  58.     plt.colorbar(label='Cluster')  # 显示颜色条表示不同的聚类中心

  59.     plt.show()

  60. df.to_csv('provicedatav5.csv', index=False, header=True, encoding='utf-8')

接下来是生成的结果文件情况,大家可以看到多出十一列,即各算法的预测结果,当然并不是每个预测结果都有实际意义。



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

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

评论