vlambda博客
学习文章列表

基于轮廓系数的高维数据K-Means聚类算法处理

基于轮廓系数的高维数据K-Means聚类算法处理

基于轮廓系数的高维数据K-Means聚类算法处理
基于轮廓系数的高维数据K-Means聚类算法处理
0 1

机器学习中有相当一部分的算法属于无监督学习算法,无监督学习往往是没有足够的先验知识,在训练的时候只需要根据特征矩阵X,往往不需要标签。聚类算法就是无监督学习算法的代表之一。

但是,现实中的很多实验,采集的数据经常是具有很多特征的高维数据,我们如何对高维数据进行聚类研究,首先,我们就可以通过PCA对高维数据进行降维,使其降低至2维数据,之后通过聚类K-Means算法对其进行聚类处理,这样我们就可以将高维数据进行二维可视化。具体实例如下。

基于轮廓系数的高维数据K-Means聚类算法处理
基于轮廓系数的高维数据K-Means聚类算法处理
基于轮廓系数的高维数据K-Means聚类算法处理
0 2

基于轮廓系数的高维数据K-Means聚类算法处理

一、导入我们所需的sklearn库

from sklearn.cluster import KMeans

from sklearn.metrics import 

silhouette_samples,silhouette_score

import matplotlib.cm as cm

import matplotlib.pyplot as plt

import numpy as np

基于轮廓系数的高维数据K-Means聚类算法处理
基于轮廓系数的高维数据K-Means聚类算法处理

二、创建自己所需要的数据集,这里的数据集样本为500,特征数目为7,聚类数目为4,随机数种子采用100;

from sklearn.datasets import make_blobs

from sklearn.decomposition import PCA

a,y =

make_blobs(n_samples=500,n_features=7,centers=4,random_state=100)

#对处理过的数据进行PCA降维处理;

x = PCA(n_components=2).fit_transform(a)

基于轮廓系数的高维数据K-Means聚类算法处理
基于轮廓系数的高维数据K-Means聚类算法处理

三、封装我们所需的聚类函数,并且设置我们的可视化图形

for s in list(np.arange(2,7)):

    #分成的簇的数目;

    n_clusters = s

    #一个画布,两个图;

    fig,(ax1,ax2) = plt.subplots(1,2)

    fig.set_size_inches(18,7)


    #第一个图是横向条形图;

    #横坐标是轮廓系数的取值;纵坐标是样本取值;

    ax1.set_xlim([-0.1,1])

    #纵坐标是使得每个簇可以排列在一起,不同的簇之间有一定的间隙;

    ax1.set_ylim([0,x.shape[0]+

    (n_clusters+1)*10])

    clusterer = 

KMeans(n_clusters=n_clusters,random_state=10).fit(x)

    cluster_labels = clusterer.labels_

    

#返回一个数据集中,所有样本的轮廓系数的均值

    silhouette_avg = 

    silhouette_score(x,cluster_labels)

    print("For n_clusters =",n_clusters,

    "The average silhouette_score 

    is :",silhouette_avg)


    #返回的是数据集中,每个样本自己的轮廓系数;

    sample_silhouette_values 

    =silhouette_samples(x,cluster_labels)

四、聚类结果可视化-横向柱状图

    y_lower = 10

    for i in range(n_clusters):

#从每个样本的轮廓系数结果中抽取第i个簇的轮廓系数;并进行排序;

    ith_cluster_silhouette_values = 

sample_silhouette_values[cluster_labels ==i]

                  ith_cluster_silhouette_values.sort()

#查看这一个簇中有多少个样本;

    size_cluster_i = 

ith_cluster_silhouette_values.shape[0]

#确定纵坐标中簇的连续间隔;

        y_upper = y_lower + size_cluster_i

#使用小数来调用颜色的函数;

        color =

 cm.nipy_spectral(float(i)/n_clusters)            ax1.fill_betweenx(np.arange(y_lower,y_upper),ith_cluster_silhouette_values,facecolor=color,alpha=0.7)

#显示文本text(横坐标,纵坐标,内容)

        ax1.text(-0.05,y_lower+0.5*size_cluster_i,str(i))

#循环往纵坐标上面走;

        y_lower = y_upper + 10 

#把整个数据集上的轮廓系数的均值以虚线的形式放入图中;

        ax1.axvline(x=silhouette_avg,color='red',

    linestyle='--')

    ax1.set_yticks([])     

基于轮廓系数的高维数据K-Means聚类算法处理
基于轮廓系数的高维数据K-Means聚类算法处理

五、聚类分布图可视化

    colors =

cm.nipy_spectral(cluster_labels.astype(float)/n_clusters)

    ax2.scatter(x[:,0],x[:,1],marker='o',s=8,c=colors)

    #画出聚类的中间点;

    centers = clusterer.cluster_centers_

    ax2.scatter(centers[:,0],centers[:,1],marker='x',c='red',alpha=1,s=200)


基于轮廓系数的高维数据K-Means聚类算法处理
基于轮廓系数的高维数据K-Means聚类算法处理
基于轮廓系数的高维数据K-Means聚类算法处理
0 3

     通过聚类结果可视化可以看出,当这组数据聚类数为3时,其返回的一个数据集中,所有样本的轮廓系数的均值最高,但是,聚类分析是没有办法给出那种聚类结果最好的,我们只能根据实际的项目分析,选取最合适的聚类数目进行研究。这种通过PCA对高维数据进行降维的方法,可以有效地帮助我们处理高维特征的数据集,并且通过轮廓系数来确定所需要的超参数。

基于轮廓系数的高维数据K-Means聚类算法处理
基于轮廓系数的高维数据K-Means聚类算法处理

基于轮廓系数的高维数据K-Means聚类算法处理

基于轮廓系数的高维数据K-Means聚类算法处理

基于轮廓系数的高维数据K-Means聚类算法处理

基于轮廓系数的高维数据K-Means聚类算法处理