python - 将 KMeans 集群中心映射到原始数据帧
问题描述
我从 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_ 映射数组,使其与用于聚类的原始数据帧的顺序/结构相匹配吗?
PS:我在这个过程中做了一些标准化,但也把它倒过来了,所以这不应该是问题。
按照评论中的要求发布拟合/预测部分
k_means.fit(df)
y_pred = k_means.predict(df)
编辑:我搞砸了
在我的笔记本中进行了一些挖掘后,我发现了问题:
所以我的机器学习过程是这样的
- 标准化(整个数据框)
- 二值化(我的数据框只有 2 列,然后从初始 df 中删除那些列并添加新的二值化列,而不是搞乱了特征顺序)
- 聚类(在这个新的数据框上)
因此,当我执行 MinMaxScaler 的 inverse_transform 方法时,它仍在使用旧的特征顺序(在我将它与我的二值化事物搞砸之前)。
解决方案
您确定它正在反转功能的顺序吗?
由于您没有提供最小的工作示例,因此无法检查您的代码,但我只是尝试了这个:
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_)
并且每次都保留了特征的顺序。
推荐阅读
- javascript - 重新执行功能
- javascript - 用 Promise 替换 TestCafe async / await
- php - 我需要拥有所有 Instagram API 端点
- javascript - 将贝塞尔控制点映射到 SVG 中的 d 属性
- android - Android权限RECEIVE_BOOT_COMPLETED vs firebase远程推送通知vs google play策略
- git - 如何在一个 jenkins 管道(使用 groovy )或一个工作区中获得四个单独的 git 存储库(具有多个分支)?
- python - 如何在python中计算2个列表的精度和召回率
- c# - Entity Framework Core 2.2 在单元测试时拆除后未重置
- solr - 如何有效地使用 solr cloud 进行多达 1000 个集合?
- python - 将 IPNetworks 列表转换为实际子网