在使用kmeans创建集群时,有没有办法输出每行的扭曲?
作者:互联网
这是一些代码:
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)
现在,这为您提供了每个示例的计算失真.具体而言,失真是N,NumPy数组,其中N是数据集中的示例数.每个元素对应于相应示例对整体失真贡献的失真.
要验证,您可以检查km.inertia_,即总失真与最后一行中计算的失真数组的总和相匹配,因此请检查distortion.sum()和km.inertia_.
作为一个可重复的例子:
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
请注意,值的尾端有一些细微差别,这是由于数值精度,但您可以确保我们已经分别计算了每个示例的失真.
一旦有了扭曲数组,就可以在数据框中添加一个代表这些变量的附加列,并且可以根据需要找到哪一行给出了最大或最小的失真.
标签:python,machine-learning,k-means,scikit-learn 来源: https://codeday.me/bug/20190701/1347582.html