代码之家  ›  专栏  ›  技术社区  ›  Jeremy

使用kmeans创建集群时,是否有方法输出每行的扭曲?

  •  4
  • Jeremy  · 技术社区  · 6 年前

    下面是一些代码:

    df_tr_std = stats.zscore(df_tr[clmns])
    
    km = KMeans(n_clusters=3, init='k-means++',n_init=10,max_iter=300,tol=1e-04,random_state=0)
    y_km = km.fit_predict(df_tr_std)
    

    我试着引用惯性,但这是完全失真。以下代码用于计算各个距离:

    distance = euclidean_distances(km.cluster_centers_, df_tr_std)
    

    但它将距离分成3个数组(或我创建的多个集群)。有没有办法做到这一点而不必按标签/簇进行分离?

    我想用一列距离来扩展我的原始数据集,这样我就可以确定最大的距离。我还想知道最近的距离,但通过使用以下代码,我发现:

    closest, _ = pairwise_distances_argmin_min(km.cluster_centers_, df_tr_std)
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   rayryeng    6 年前

    您可以使用簇质心和标签索引到簇质心中,以获得每个示例所表示的内容。然后可以分别计算每个示例的失真。回想一下,K-Means聚类结果的失真或惯性只是示例与其对应的代表质心之间的平方差之和。要计算各个畸变值,只需找到每个示例的代表性质心,然后找到组件的平方差之和。总失真是所有这些值的总和。

    因此:

    cluster_centers = km.cluster_centers_
    centroids = cluster_centers[y_km]
    distortion = ((df_tr_std - centroids)**2.0).sum(axis=1)
    

    第一行代码访问已安装的K-means模型的群集中心。第二行代码使用拟合结果输出的标签获取每个示例的代表性质心。对于最后一行,您可以通过将输入的每一行或示例与其代表的质心分量相减,将每个元素平方,然后沿每一行求和来计算失真。

    可以方便地在一行中执行此操作,而不需要临时变量:

    distortion = ((df_tr_std - km.cluster_centers_[y_km])**2.0).sum(axis=1)
    

    现在,这将为您提供每个示例的计算失真。具体而言, distortion 是一个 N, NumPy阵列 N 是数据集中的示例数。每个元素对应于相应示例对整体失真造成的失真。

    要进行验证,可以检查 km.inertia_ 这是总失真与最后一行中计算的失真数组之和相匹配,因此请检查 distortion.sum() 公里。惯性_ .

    作为一个可复制的示例:

    In [27]: import numpy as np
    
    In [28]: from sklearn.cluster import KMeans
    
    In [29]: df_tr_std = np.random.rand(1000,3)
    
    In [30]: km = KMeans(n_clusters=3, init='k-means++',n_init=10,max_iter=300,tol=
        ...: 1e-04,random_state=0)
    
    In [31]: y_km = km.fit_predict(df_tr_std)
    
    In [32]: distortion = ((df_tr_std - km.cluster_centers_[y_km])**2.0).sum(axis=1)
    
    In [33]: km.inertia_
    Out[33]: 147.01626670004867
    
    In [34]: distortion.sum()
    Out[34]: 147.01626670004865
    

    请注意,值的尾端有一些细微的差异,这是由于数值精度的原因,但您可以确信,我们已经分别计算了每个示例的失真。

    一旦有了扭曲的数组,就可以在数据帧中添加一个额外的列来表示这些扭曲,并且可以根据需要定位哪一行的扭曲最大或最小。