对自定义数据进行谱系聚类分析

文章目录

  • 数据准备
  • 聚类
  • 结果展示

数据准备

首先都是生成一些数据用来进行聚类,老师给出的这个程序是生成1000个6维的数据集,可以分为5类。接着将这些生成的数据点显示在matplotlib上,颜色设置为黑色,这里展示的是一开始并没有进行聚类操作的数据的分布。

# 生成1000个6维的数据集,分为5个簇
X, y = make_blobs(n_samples=1000, n_features=6, centers=5, cluster_std=[
                  1.4, 0.4, 0.3, 0.3, 0.4], random_state=666)

聚类

谱聚类使用到的函数为SpectralClustering,其参数包含gamma,这是一个代表核函数的系数,默认值为1.0,当使用 k近邻法聚类时,这个参数不起作用。还有一个参数为affinity,这个参数的默认值为rbf,也就是使用高斯核函数。SpectralClustering(n_clusters=k, gamma=gamma),表示使用高斯核函数进行谱聚类,gamma是核函数系数,通过调整gamma和n_clusters可以实现不同的聚类效果。
接着创建变量用来保存最好的聚类指标best_score,以及最好的聚类数best_k,以及最好的best_gamma,这些参数通过谱聚类过程中,选择不同的参数,最后根据best_score的最大值选择出最好的聚类数和最好的gamma,最后记录下相应最大聚类指标下的其他参数的值。然后将花费的时间和最好的参数值输出到控制台,并且在matplotlib上显示出聚类情况,每个聚类采用一种颜色。
本文采用了 Caliski Harabasz 指标衡量聚类情况,也就是类内类间参数衡量聚类情况,公式为s(k)= (tr(Bk)(m-k))/(tr(Wk)(k-1)),其中m为训练集样本数,k为类别数,Bk为类别之间的协方差矩阵,Wk为类别内部数据的协方差矩阵,tr为矩阵的迹。
使用calinski_harabasz_score函数来产生这个衡量指标,参数传入的是之前生成的数据和针对不同的K值预测样本的聚类情况,这个值越大聚类的效果越好

# 使用Spectral clustering进行聚类: 使用高斯核对n_cluster和gamma进行调参
start = time.process_time()
best_score, best_k, best_gamma = 0, 0, 0

for i in range(1, 16):
# for gamma in (0.01, 0.1, 0.15):
    for k in (3, 4, 5, 6):
        gamma = i * 0.01
        y_pre = SpectralClustering(n_clusters=k, gamma=gamma).fit_predict(X)
        score = calinski_harabasz_score(X, y_pre)
        print('score={:.3f},k={}, gamma={:.4f}'.format(score, k, gamma))
        if score > best_score:
            best_score = score
            best_gamma = gamma
            best_k = k

结果展示

把gamma的值设定在了0.01到0.15之间,使用到range函数,i in range(1,16)让i可以取1到15间的整数,然后gamma = i * 0.01, 这样gamma就可以取到0.01到0.15之间的以0.01为整数倍的数了。最后的结果为下图,在控制台中输出为best_score=16479.188, best_k=5, best_gamma=0.0600
spending time: 47.562s虽然best_gamma发生了变化但是best_score并没有发送变化,并且由于gamma的可选值变多了,所以需要运行的时间会相应的变长。只要best_k的值不变,最后的score的值就不会发生变化。

对自定义数据进行谱系聚类分析_第1张图片


你可能感兴趣的:(计算机视觉,python,聚类,sklearn,算法)