【问题标题】:Mapping KMeans cluster centers to the original dataframe将 KMeans 集群中心映射到原始数据帧
【发布时间】:2018-10-28 23:40:55
【问题描述】:

我从 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.:我在这个过程中做了一些标准化,但也把它倒过来了,所以这不应该是问题。

按照 cmets 的要求发布拟合/预测部分

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

编辑:我搞砸了

在我的笔记本中进行了一些挖掘后,我发现了问题:

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

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

因此,当我执行 MinMaxScaler 的 inverse_transform 方法时,它仍在使用旧的特征顺序(在我将它与我的二值化事物搞砸之前)。

【问题讨论】:

  • 你能贴出计算聚类中心的代码吗? scikit-learn KMeans 不应根据文档更改功能的数量。
  • @eozd 我编辑了答案以包含代码。只是为了澄清:功能的数量保持不变,只是顺序。例如,cluster_centers_ 数组中的第 5 个值与原始数据帧中的第 5 列等不匹配。

标签: python scikit-learn k-means


【解决方案1】:

你确定它是在颠倒特征的顺序吗?

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

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_)

并且每次都保留了特征的顺序。

【讨论】:

  • 你是对的。原来我搞砸了列顺序。我编辑的问题中有更多详细信息。
猜你喜欢
  • 1970-01-01
  • 2017-05-04
  • 2018-01-28
  • 2015-05-15
  • 1970-01-01
  • 2015-02-17
  • 2019-11-12
  • 1970-01-01
  • 2017-06-01
相关资源
最近更新 更多