将KMeans集群中心映射到原始数据帧

时间:2018-05-18 13:52:36

标签: python scikit-learn k-means

我理解SKL的KMeans算法中的cluster_centers_属性的方式是,这些算法本质上是由算法计算的数据点,以便最小化分配给同一群集的所有其他数据点的距离之和。

现在,在我的情况下,cluster_centers_返回一个4x13数组。 到目前为止,非常好。

In [102]: k_means.cluster_centers_

Out[102]: array([[ 4.78931977e-01,  4.90762118e-01,  4.45716436e-01,
     4.06958828e-01,  1.75669885e-01,  7.20500999e-01,
     1.00000000e+00,  4.67334062e-01,  7.62096965e-01,
     3.26627062e-01,  1.11299030e-01,  1.00000000e+00,
     3.38983051e-03],
   [ 2.56178744e-01,  6.31538163e-01,  6.35222200e-01,
     5.50653164e-01,  1.95449906e-01,  8.42033556e-01,
    -8.28226376e-14,  4.86866204e-01,  7.88197801e-01,
     4.63464418e-01,  1.07503725e-01,  9.65338920e-14,
     8.80867977e-03],
   [ 3.00150863e-01,  6.07788520e-01,  6.05935644e-01,
     4.35146301e-01,  1.95530922e-01,  8.38422087e-01,
     1.00000000e+00,  4.89682837e-01,  7.78838601e-01,
     4.75986892e-01,  1.07519045e-01, -3.79418719e-14,
     9.14063961e-03],
   [ 4.27285065e-01,  5.13167435e-01,  5.00494859e-01,
     5.48965002e-01,  1.86222531e-01,  7.40201080e-01,
    -8.29336599e-14,  4.71366946e-01,  7.67300469e-01,
     3.33472857e-01,  1.12865093e-01,  1.00000000e+00,
     1.87793427e-03]])

作为下一步,我想将正确的列名分配给集群中心值,因为单独的数组并没有告诉我太多。

但是,当我尝试使用以下代码创建新数据帧并根据原始数据帧分配列名时,我可以清楚地看到列与cluster_centers_数组中的值不匹配(我做了一些与分发原始数据帧。)

centers = pd.DataFrame(k_means.cluster_centers_)
df_centers = pd.DataFrame(centers, columns= df.columns)

看起来cluster_centers_返回的数组与原始数据帧的功能顺序不同。

知道如何从cluster_centers_映射数组,以便它与用于聚类的原始数据帧的顺序/结构相匹配吗?

P.S。:我在这个过程中做了一些标准化工作,但也把它反过去了,所以不应该是问题。

在评论中发布拟合/预测部分

k_means.fit(df)
y_pred = k_means.predict(df)

编辑:我搞砸了

在笔记本上挖了一些后,我发现了这个问题:

所以我的机器学习过程就像这样

  • 标准化(整个数据帧)
  • 二值化(我的数据帧只有2列,然后从初始df中删除那些并添加新的二值化的,而不是特征顺序)
  • 群集(在此新数据框上)

因此,当我执行MinMaxScaler的inverse_transform方法时,这仍然使用旧的功能顺序(在我用二进制化的东西搞砸之前)。

1 个答案:

答案 0 :(得分:0)

您确定它会颠倒功能的顺序吗?

检查您的代码是不可能的,因为您还没有提供最小的工作示例,但我只是尝试了这个:

from sklearn.cluster import KMeans
import numpy as np
X = np.array([[0, 1], [2, 3]])
for i in range(100):
    kmeans = KMeans(n_clusters=2, random_state=i).fit(X)
    print(kmeans.cluster_centers_)

并且每次都保留了功能的顺序。