我理解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)
编辑:我搞砸了
在笔记本上挖了一些后,我发现了这个问题:
所以我的机器学习过程就像这样
因此,当我执行MinMaxScaler的inverse_transform方法时,这仍然使用旧的功能顺序(在我用二进制化的东西搞砸之前)。
答案 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_)
并且每次都保留了功能的顺序。