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

Python 在使用kmeans创建集群时,是否有方法输出每行的扭曲?,python,machine-learning,scikit-learn,k-means,Python,Machine Learning,Scikit Learn,K Means,下面是一些代码: 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_center

下面是一些代码:

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)

您可以使用群集质心和标签索引群集质心,以获得每个示例所表示的内容。然后可以分别计算每个示例的失真。回想一下,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.惯性
,它与在最后一行中计算的失真数组的总和相匹配,因此请检查
失真.sum()
km.惯性

作为一个可复制的示例:

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
请注意,值的尾端有一些细微的差异,这是由于数值精度,但您可以保证,我们已经分别计算了每个示例的失真

一旦有了失真数组,就可以在数据帧中添加一个表示这些失真的附加列,并可以根据需要确定哪一行的失真最大或最小