使用Python实现数据挖掘中的K-Means聚类算法

03-02 43阅读

在当今信息爆炸的时代,数据挖掘技术变得愈发重要。它可以帮助我们从海量的数据中发现有价值的信息,从而为决策提供支持。K-Means聚类算法是数据挖掘领域中一种经典的无监督学习方法,广泛应用于客户细分、图像压缩、异常检测等场景。本文将深入探讨K-Means聚类算法的原理,并通过Python代码实现该算法。

K-Means聚类算法原理

1. 算法概述

K-Means(K均值)聚类是一种迭代式的聚类算法,旨在将数据集划分为k个簇(clusters),使得每个簇内的数据点尽可能相似,而不同簇之间的数据点尽可能相异。具体来说,K-Means的目标是最小化簇内所有数据点到其所属簇中心的距离平方和(称为“簇内误差平方和”或SSE,Sum of Squared Errors)。

2. 算法步骤

K-Means聚类算法的主要步骤如下:

初始化:随机选择k个数据点作为初始的簇中心。分配数据点:对于每个数据点,计算其与所有簇中心的距离,并将其分配给距离最近的簇中心。更新簇中心:对于每个簇,重新计算其簇中心(即该簇内所有数据点的平均值)。重复步骤2和3:直到簇中心不再发生显著变化,或者达到预设的最大迭代次数。

3. 算法的优点与局限性

优点

简单易实现,计算效率高。对大规模数据集具有较好的扩展性。

局限性

对初始簇中心的选择敏感,可能导致局部最优解。需要事先指定簇的数量k。对于非球形分布的数据效果不佳。

Python实现K-Means聚类算法

接下来,我们将使用Python实现一个简单的K-Means聚类算法,并应用它对一些合成数据进行聚类分析。

1. 准备工作

首先,确保已经安装了必要的Python库,如numpymatplotlibscikit-learn。可以通过以下命令安装这些库:

pip install numpy matplotlib scikit-learn

2. 导入所需库

import numpy as npimport matplotlib.pyplot as pltfrom sklearn.datasets import make_blobsfrom sklearn.cluster import KMeans

3. 生成合成数据

为了演示K-Means聚类的效果,我们先生成一组二维的合成数据。这里使用make_blobs函数来创建包含多个簇的数据集。

# 设置随机种子以保证结果可复现np.random.seed(42)# 生成包含500个样本、5个簇的二维数据X, y = make_blobs(n_samples=500, centers=5, cluster_std=0.60, random_state=0)# 绘制原始数据分布图plt.figure(figsize=(8, 6))plt.scatter(X[:, 0], X[:, 1], s=50)plt.title("Original Data Distribution")plt.show()

4. 实现K-Means聚类

现在,我们使用scikit-learn库中的KMeans类来实现K-Means聚类。

def kmeans_clustering(data, n_clusters, max_iter=300, tol=1e-4):    """    使用K-Means算法对数据进行聚类    参数:    data (array-like): 输入数据,形状为(n_samples, n_features)    n_clusters (int): 指定的簇数量    max_iter (int): 最大迭代次数,默认为300    tol (float): 收敛容差,默认为1e-4    返回:    labels (array): 聚类后的标签,形状为(n_samples,)    centroids (array): 簇中心,形状为(n_clusters, n_features)    """    # 初始化KMeans模型    kmeans = KMeans(n_clusters=n_clusters, max_iter=max_iter, tol=tol, random_state=42)    # 训练模型并预测标签    labels = kmeans.fit_predict(data)    # 获取簇中心    centroids = kmeans.cluster_centers_    return labels, centroids# 对生成的数据进行聚类labels, centroids = kmeans_clustering(X, n_clusters=5)# 绘制聚类结果plt.figure(figsize=(8, 6))plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50)plt.scatter(centroids[:, 0], centroids[:, 1], marker='*', s=300, c='red', label='Centroids')plt.title("K-Means Clustering Result")plt.legend()plt.show()

5. 评估聚类效果

为了评估K-Means聚类的效果,我们可以计算SSE(簇内误差平方和)。此外,还可以使用轮廓系数(Silhouette Coefficient)来衡量聚类的质量。

from sklearn.metrics import silhouette_score# 计算SSEsse = np.sum((X - centroids[labels]) ** 2)print(f"SSE: {sse:.2f}")# 计算轮廓系数silhouette_avg = silhouette_score(X, labels)print(f"Silhouette Coefficient: {silhouette_avg:.2f}")

通过上述代码示例,我们成功实现了K-Means聚类算法,并对其性能进行了初步评估。尽管K-Means算法存在一定的局限性,但在许多实际应用中仍然表现出色。未来的研究可以考虑改进K-Means算法,例如采用更智能的初始簇中心选择策略、引入核函数以处理非线性可分的数据等。

免责声明:本文来自网站作者,不代表ixcun的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:aviv@vne.cc

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!