如何在 python 中使用 elbow 方法查找最佳簇


机器学习中最常见的聚类算法之一称为k 均值聚类

K 均值聚类是一种将数据集中的每个观察结果放入K个聚类中的一个技术。

最终目标是拥有K 个簇,其中每个簇内的观察结果彼此非常相似,而不同簇中的观察结果彼此非常不同。

在进行 k 均值聚类时,第一步是选择K值——我们想要将观测值放入的聚类数量。

选择K值的最常见方法之一称为肘法,该方法涉及创建一个图,其中 x 轴为簇数,y 轴为平方和总数,然后确定图中出现“膝盖”或转弯的地方。

x 轴上出现“拐点”的点告诉我们在 k 均值聚类算法中使用的最佳聚类数量。

以下示例展示了如何在 Python 中使用肘部方法。

第1步:导入必要的模块

首先,我们将导入执行 k 均值聚类所需的所有模块:

 import pandas as pd
import numpy as np
import matplotlib. pyplot as plt
from sklearn. cluster import KMeans
from sklearn. preprocessing import StandardScaler

第 2 步:创建数据框

接下来,我们将创建一个包含 20 名不同篮球运动员的三个变量的 DataFrame:

 #createDataFrame
df = pd. DataFrame ({' points ': [18, np.nan, 19, 14, 14, 11, 20, 28, 30, 31,
                              35, 33, 29, 25, 25, 27, 29, 30, 19, 23],
                   ' assists ': [3, 3, 4, 5, 4, 7, 8, 7, 6, 9, 12, 14,
                               np.nan, 9, 4, 3, 4, 12, 15, 11],
                   ' rebounds ': [15, 14, 14, 10, 8, 14, 13, 9, 5, 4,
                                11, 6, 5, 5, 3, 8, 12, 7, 6, 5]})

#drop rows with NA values in any columns
df = df. dropna ()

#create scaled DataFrame where each variable has mean of 0 and standard dev of 1
scaled_df = StandardScaler(). fit_transform (df)

步骤 3:使用肘部法找到最佳簇数

假设我们想要使用 k 均值聚类根据这三个指标将相似的参与者分组在一起。

要在 Python 中执行 k 均值聚类,我们可以使用sklearn模块中的KMeans函数。

该函数最重要的参数是n_clusters ,它指定要在其中放置观测值的簇数。

为了确定最佳簇数,我们将创建一个图表,显示簇数以及模型的 SSE(误差平方和)。

然后,我们将寻找平方和开始“弯曲”或稳定的“膝盖”。该点代表最佳簇数。

以下代码展示了如何创建这种类型的图,该图在 x 轴上显示簇数,在 y 轴上显示 SSE:

 #initialize kmeans parameters
kmeans_kwargs = {
" init ": " random ",
" n_init ": 10,
" random_state ": 1,
}

#create list to hold SSE values for each k
sse = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, ** kmeans_kwargs)
    kmeans. fit (scaled_df)
    sse. append (kmeans.inertia_)

#visualize results
plt. plot (range(1, 11), sse)
plt. xticks (range(1, 11))
plt. xlabel (" Number of Clusters ")
plt. ylabel (“ SSE ”)
plt. show () 

在此图中,似乎在 k = 3 个簇处存在扭结或“拐点”。

因此,在下一步拟合 k 均值聚类模型时,我们将使用 3 个聚类。

步骤 4:使用最佳K执行 K 均值聚类

以下代码展示了如何使用k的最佳值 3 对数据集执行 k 均值聚类:

 #instantiate the k-means class, using optimal number of clusters
kmeans = KMeans(init=" random ", n_clusters= 3 , n_init= 10 , random_state= 1 )

#fit k-means algorithm to data
kmeans. fit (scaled_df)

#view cluster assignments for each observation
kmeans. labels_

array([1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0]) 

结果表显示了 DataFrame 中每个观察值的聚类分配。

为了使这些结果更易于解释,我们可以在 DataFrame 中添加一列来显示每个玩家的集群分配:

 #append cluster assingments to original DataFrame
df[' cluster '] = kmeans. labels_

#view updated DataFrame
print (df)

points assists rebounds cluster
0 18.0 3.0 15 1
2 19.0 4.0 14 1
3 14.0 5.0 10 1
4 14.0 4.0 8 1
5 11.0 7.0 14 1
6 20.0 8.0 13 1
7 28.0 7.0 9 2
8 30.0 6.0 5 2
9 31.0 9.0 4 0
10 35.0 12.0 11 0
11 33.0 14.0 6 0
13 25.0 9.0 5 0
14 25.0 4.0 3 2
15 27.0 3.0 8 2
16 29.0 4.0 12 2
17 30.0 12.0 7 0
18 19.0 15.0 6 0
19 23.0 11.0 5 0

集群列包含每个玩家分配到的集群编号(0、1 或 2)。

属于同一簇的球员的得分助攻篮板数列的值大致相似。

注意:您可以在此处找到sklearnKMeans函数的完整文档。

其他资源

以下教程解释了如何在 Python 中执行其他常见任务:

如何在 Python 中执行线性回归
如何在 Python 中执行逻辑回归
如何在Python中执行K-Fold交叉验证

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注