如何在 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)。
属于同一簇的球员的得分、助攻和篮板数列的值大致相似。
注意:您可以在此处找到sklearn的KMeans函数的完整文档。
其他资源
以下教程解释了如何在 Python 中执行其他常见任务: