使用Pipline后如何获取KMeans的inertia_值

Mei*_*ang 1 scikit-learn

我想通过使用 Pipeline 来组合StandardScaler()和并检查的,因为我想检查哪个数量的集群是最好的。代码如下:KMeans()kmeansinertia_

ks = range(3, 5)
inertias = []
inertias_temp = 9999.0
for k in ks:
    scaler = StandardScaler()
    kmeans = KMeans(n_clusters=k, random_state=rng)
    pipeline = make_pipeline(scaler, kmeans)
    pipeline.fit(X_pca)
    labels = pipeline.predict(X_pca)
    np.round(kmeans.cluster_centers_, decimals=3)
    inertias.append(kmeans.inertia_)
if (kmeans.inertia_ < inertias_temp):
    n_clusters_min = k
    kmeans_min = kmeans
    inertias_temp = kmeans.inertia_
Run Code Online (Sandbox Code Playgroud)

但是,我认为也许 的值kmeans.inertia_不正确,因为它应该在 之后得到pipeline.predict()。但之后我就没有办法得到这个值了pipeline.predict()。谁可以帮我这个事?

E.Z*_*.Z. 5

可以从make_pipeline实例中观察集群运行的惯性距离。然而,不必执行.predict()观察多个质心的距离。要访问您的情况下的惯量值,您可以输入以下内容:

pipeline.named_steps['kmeans'].inertia_

然后按照你喜欢的方式处理它!


而且,我有一些空闲时间,所以我为你重写了一点代码,让它变得更有趣:

scaler = StandardScaler()
cluster = KMeans(random_state=1337)
pipe = make_pipeline(scaler, cluster)

centroids = []
inertias = []
min_ks = []
inertia_temp = 9999.0

for k in range(3, 5):
    pipe.set_params(cluster__n_clusters=k)
    pipe.fit(X_pca)
    centroid = pipe.named_steps['cluster'].cluster_centers_
    inertia = pipe.named_steps['cluster'].inertia_        
    centroids.append(centroid)
    inertias.append(inertia)

    if inertia < inertia_temp:
        min_ks.append(k)
Run Code Online (Sandbox Code Playgroud)

感谢你的提问!