html
用 Python 实现 K-Means 聚类:逐步指南
聚类是无监督机器学习中一项基本技术,能够根据数据点固有的相似性对其进行分组。在各种聚类算法中,K-Means 以其简单性和高效性脱颖而出。本文将通过使用 Python 的 scikit-learn 库实现 K-Means 聚类,并辅以 Yellowbrick 库的可视化,帮助确定最佳聚类数量。
目录
聚类简介
聚类涉及将数据集划分为多个组或簇,其中同一簇内的数据点彼此更加相似,而与其他簇的数据点相差较大。这项技术广泛应用于各种场景,包括客户细分、图像压缩和异常检测等。
K-Means 聚类 是最流行的聚类算法之一,因其易于实现和可扩展性而备受青睐。其目标是将 n 个数据点划分为 k 个簇,使每个数据点属于与其最近的质心所在的簇。
环境配置
在深入聚类之前,请确保已安装必要的 Python 库。我们将使用以下库:
- pandas 用于数据处理
- numpy 用于数值运算
- matplotlib 和 seaborn 用于可视化
- scikit-learn 用于实现 K-Means
- Yellowbrick 用于高级可视化
您可以使用 pip 安装这些库:
1
pip install pandas numpy matplotlib seaborn scikit-learn yellowbrick
创建和探索数据集
为了演示,我们将使用 scikit-learn 的 make_blobs 方法创建一个合成数据集。此方法用于生成用于聚类的各向同性高斯点簇。
12345
import pandas as pdfrom sklearn.datasets import make_blobs # Create a synthetic datasetX, y = make_blobs(n_samples=300, centers=5, cluster_std=0.60, random_state=0)
或者,您也可以使用在 Kaggle 上提供的自定义数据集。提供的数据集包括:
- 客户 ID:每个客户的唯一标识符。
- Instagram 访问分数:表示用户访问 Instagram 的频率,范围从 0 到 100。
- 消费排名:表示用户的消费排名,同样在 0 到 100 的范围内。
加载数据集:
12345678
# Import necessary librariesimport pandas as pd # Read the CSV filedf = pd.read_csv('path_to_your_dataset.csv') # Display the first 20 rowsprint(df.head(20))
理解数据:
- 用户 ID:作为标识符;在聚类中不直接使用。
- Instagram 访问分数:衡量用户对 Instagram 的参与度。
- 消费排名:反映用户的消费行为。
使用肘部法确定最佳聚类数量
选择正确的聚类数量(k)对于有效的聚类至关重要。肘部法通过绘制聚类内平方和(Within-Cluster Sum of Squares (WCSS))与聚类数量的关系图,并识别出“肘部点”——即下降速率急剧变化的点,来帮助确定最佳聚类数量。
使用 Yellowbrick 进行可视化
1234567891011121314
from yellowbrick.cluster import KElbowVisualizerfrom sklearn.cluster import KMeansimport matplotlib.pyplot as plt # Prepare the dataX = df.iloc[:, [1, 2]].values # Assuming columns 1 and 2 are Instagram Visit Score and Spending Rank # Initialize KMeanskmeans = KMeans() # Use ElbowVisualizer to find the optimal number of clustersvisualizer = KElbowVisualizer(kmeans, k=(2,10))visualizer.fit(X)visualizer.show()
解释可视化结果:
- x 轴代表聚类数量 (k)。
- y 轴显示 WCSS。
- “肘部”点表示最佳的 k。在此情况下,最佳聚类数量确定为 4。
实现 K-Means 聚类
在确定了最佳聚类数量后,我们现在可以实现 K-Means 聚类。
123456789101112131415
from sklearn.cluster import KMeans # Initialize KMeans with the optimal number of clusterskmeans = KMeans(n_clusters=4, random_state=0) # Fit the model to the datakmeans.fit(X) # Retrieve cluster labelslabels = kmeans.labels_ # Add the cluster labels to the original dataframedf['Cluster'] = labels print(df.head())
关键参数:
- n_clusters:要形成的聚类数量(通过肘部法确定)。
- random_state:确保结果的可重复性。
可视化聚类结果:
123456789
import seaborn as sns # Plotting the clusterssns.scatterplot(x=X[:,0], y=X[:,1], hue=labels, palette='viridis')plt.title('K-Means Clustering Results')plt.xlabel('Instagram Visit Score')plt.ylabel('Spending Rank')plt.legend(title='Cluster')plt.show()
此可视化有助于理解数据点如何分组以及聚类的有效性。
结论与下一步
在本指南中,我们成功地使用 Python 的 scikit-learn 实现了 K-Means 聚类,并使用 Yellowbrick 对结果进行了可视化。通过使用肘部法确定最佳聚类数量,我们确保了聚类的意义和有效性。
下一步:
- 解释聚类中心: 分析质心以了解每个聚类的特征。
- 目标营销: 利用聚类来识别和针对特定的用户群体进行营销活动。
- 高级聚类技术: 探索其他聚类算法,如 DBSCAN 或层次聚类,以应对不同的数据情境。
- 特征缩放: 实施特征缩放以改善聚类性能,特别是当特征具有不同的单位或尺度时。
聚类是数据科学家工具库中的一项强大工具,掌握其实现可以带来有价值的洞察和明智的决策。