机器学习聚类分析算法——python详细代码解析(sklearn)

聚类分析算法是一种非监督式学习算法,它旨在将数据集中的样本划分为若干个组或“簇”,使得同一个簇内的样本相似度较高,而不同簇之间的样本相似度较低。针对的是没有响应变量而仅有特征变量的数据集,其主要作用就是快速分类。虽然是非监督式学习算法,但聚类分析也有很多应用场景,比如电商平台系统对具有相似购买行为的用户进行聚类,针对划分好的客户类别,将某用户购买的产品在同一类别用户内进行推荐,实现精准促销;或者根据以往销售记录及其他特征对产品进行聚类,若某用户购买了一款产品,则继续向他推送同一类别的其他产品。我们讲解聚类分析算法的基本原理,并结合具体实例讲解该算法在Python中的实现与应用。

聚类分析方法:

划分聚类分析是一种将数据样本分配到预定义的、不重叠的组中的方法。它主要有两种形式:K均值聚类和K中位数聚类。

K均值聚类是一种流行的方法,它通过以下步骤实现:

  • K中位数聚类与K均值类似,但使用中位数作为聚类中心,这使得它对异常值更加鲁棒。
  • 在进行K均值聚类时,用户需要指定聚类的数量(K值)和参与聚类的特征变量(x维特征空间)。系统会根据这些特征变量将样本点分配到最近的聚类中心,形成初始的聚类。然后,通过迭代过程不断优化聚类中心的位置,直至满足停止条件。
  • K均值聚类的优势在于其计算效率高,适合处理大规模数据集。然而,它要求用户预先指定聚类的数量,这可能限制了其在探索性数据分析中的应用。此外,K均值聚类对初始聚类中心的选择敏感,可能需要多次运行以找到稳定的聚类结果。
  • 为了克服这些限制,可以采用一些策略,如使用K-Means++算法来初始化聚类中心,或者使用如肘部法则等方法来确定最佳的聚类数量。此外,对数据进行标准化处理也是提高聚类质量的重要步骤。
  • 层次聚类分析也称为系统聚类分析。与划分聚类分析方法的原理不同,层次聚类分析的基本原理是根据选定的特征来识别相对均一的个案(变量)组,使用的算法是首先将每个个案(或变量)都视为一类,然后根据类与类之间的距离或相似程度将最近的类加以合并,再计算新类与其他类之间的相似程度,并选择最相似的加以合并,这样每合并一次就减少一类,不断继续这一过程,最终实现完全聚类,即把所有的观测样本汇集到一个组中。

    在实际分析中常用到的一个层次聚类分析工具是树状图,那么,到底分成了多少类呢?这取决于研究的需要和实际的情况,需要用户加入自己的判断,确定好分类需求后,从聚类分析树状图最上面使用分割框往下进行分割。例如需要把所有样本观测值分成两类时。与划分聚类分析方法相比,层次聚类分析方法的计算过程更为复杂,计算速度相对较慢,但是它不要求事先指定需要分类的数量,这一点是符合聚类分析探索性的本质特点的,所以这种聚类分析方法应用也非常广泛。

    样本距离的测度

    无论是划分聚类分析还是层次聚类分析,本质都是按照一定的距离对样本进行分割,在一定标准距离范围以内的样本被划分为一个类别,所以如何测度样本数据之间的距离就变得非常重要。现就常用的距离测度方法介绍如下:

    1.针对连续特征变量数据的距离标准

    25afe7e6e66b4dee883e5fe3eea2834e.png

    2.针对分类特征变量数据的距离标准

    91ce537a0bcb4245a8ee4f157d21dbdd.png

    针对聚类分析算法,同样要求首先对特征变量数据进行标准化,之所以这么做,是因为如果不进行标准化,少数变量可能会对距离影响过大,使得分析结果严重失真。

    案例

    1 载入分析所需要的库和模块

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    from sklearn.cluster import KMeans
    from sklearn.cluster import AgglomerativeClustering
    from sklearn.preprocessing import StandardScaler
    from scipy.cluster.hierarchy import linkage, dendrogram, fcluster

    2  变量设置及数据处理

    data=pd.read_csv(r"数据12.1.csv")
    X = data.iloc[:,[2,5,6,7]]#设置分析所需要的特征变量
    X.info()
    len(X.columns) 
    X.columns 
    X.shape
    X.dtypes
    X.isnull().values.any() 
    X.isnull().sum() 
    X.head(10)
    scaler = StandardScaler()
    scaler.fit(X)
    X_s = scaler.transform(X)
    X_s = pd.DataFrame(X_s, columns=X.columns)
    #相关性分析
    print(X_s.corr(method='pearson'))  
    plt.subplot(1,1,1)
    sns.heatmap(X_s.corr(), annot=True)
    plt.title('相关性热力图')
    plt.show()
    plt.savefig('相关性热力图.png')

    7a9789c543cb466cad8683f53d7eb17c.png

     

    3 划分聚类分析算法

    #1使用K均值聚类分析方法对样本示例进行聚类(K=2)
    model = KMeans(n_clusters=2, random_state=2)
    model.fit(X_s)
    model.labels_
    pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])
    print(model.cluster_centers_)
    print(model.inertia_)

     

    
    
    #2使用K均值聚类分析方法对样本示例进行聚类(K=3)
    model = KMeans(n_clusters=3, random_state=2)
    model.fit(X_s)
    model.labels_
    pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])
    np.set_printoptions(suppress=True)#不以科学计数法显示,而是直接显示数字
    print(model.cluster_centers_)
    print(model.inertia_)
    #绘图
    plt.scatter(X_s.iloc[:,0],X_s.iloc[:,1],c=model.labels_)
    plt.scatter(model.cluster_centers_[:,0],model.cluster_centers_[:,1],marker='x',color='red')
    plt.xlabel('V5')
    plt.ylabel('V6')
    plt.title('K=2均值聚类分析结果')
    plt.show()
    plt.savefig('K均值聚类分析结果.png')
    #3使用K均值聚类分析方法对样本示例进行聚类(K=4)
    model = KMeans(n_clusters=4, random_state=3)
    model.fit(X_s)
    model.labels_
    pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])
    print(model.cluster_centers_)
    print(model.inertia_)

    6339e726a1bc4c17b5e0f3b7f745d516.png

    4  层次聚类方法

    
    #1最短联结法聚类分析
    linkage_matrix = linkage(X_s, 'single')
    plt.rcParams['font.sans-serif'] = ['SimHei']#解决图表中中文显示问题
    dendrogram(linkage_matrix)
    plt.title('最短联结法聚类分析树状图')
    plt.show()
    plt.savefig('最短联结法聚类分析树状图.png')
    
    model = AgglomerativeClustering(n_clusters=3, linkage='single')
    model.fit(X_s)
    model.labels_
    pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])

    a03e532abadd4930aa737c163de59a7a.png

    
    #2最长联结法聚类分析
    linkage_matrix = linkage(X_s , 'complete')
    dendrogram(linkage_matrix)
    plt.title('最长联结法聚类分析树状图')
    plt.show()
    plt.savefig('最长联结法聚类分析树状图.png')
    
    model = AgglomerativeClustering(n_clusters=3, linkage='complete')
    model.fit(X_s )
    model.labels_
    pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])

    ee43416932a1436cab62b20ce5bfa3bb.png

    #3平均联结法聚类分析
    linkage_matrix = linkage(X_s, 'average')
    dendrogram(linkage_matrix)
    plt.title('平均联结法聚类分析树状图')
    plt.show()
    plt.savefig('平均联结法聚类分析树状图.png')
    
    model = AgglomerativeClustering(n_clusters=3, linkage='average')
    model.fit(X_s)
    model.labels_
    pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])

    ab8d1fcce1f64d3c934cde94cefa0777.png

    
    #4 ward联结法聚类分析
    linkage_matrix = linkage(X_s, 'ward')
    dendrogram(linkage_matrix)
    plt.title('ward联结法聚类分析树状图')
    plt.show()
    plt.savefig('ward联结法聚类分析树状图.png')
    
    model = AgglomerativeClustering(n_clusters=3,linkage='ward')
    model.fit(X_s)
    model.labels_
    pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])

    df896f75c40f43308bfd8c8f1f293ea8.png

     

    
    #5 重心联结法聚类分析
    linkage_matrix = linkage(X_s, 'centroid')
    dendrogram(linkage_matrix)
    plt.title('重心联结法聚类分析树状图')
    plt.show()
    plt.savefig('重心联结法聚类分析树状图.png')
    
    labels = fcluster(linkage_matrix, t=3, criterion='maxclust')
    labels
    pd.DataFrame(labels.T, index=data.V1,columns=['聚类'])
    

    57d27b996e1d4974a5924b53d4d88eaf.png

     

     

    作者:python机器学习ML

    物联沃分享整理
    物联沃-IOTWORD物联网 » 机器学习聚类分析算法——python详细代码解析(sklearn)

    发表回复