Python实现K-Means聚类算法详解及代码示例150
K-Means算法是一种广泛使用的无监督学习聚类算法,其目标是将数据点划分成k个不同的簇,使得每个数据点与其所属簇的中心(质心)距离最小。Python提供了丰富的库来实现K-Means算法,其中最常用的是Scikit-learn库。本文将详细介绍K-Means算法的原理,并提供Python代码示例,涵盖数据预处理、算法实现、结果可视化等方面。
一、K-Means算法原理
K-Means算法的基本思想是迭代地将数据点分配给最近的质心,并更新质心的位置,直到算法收敛或达到最大迭代次数。具体步骤如下:
初始化:随机选择k个数据点作为初始质心。
分配:将每个数据点分配到与其最近的质心所在的簇。
更新:计算每个簇中所有数据点的平均值,将其作为新的质心。
迭代:重复步骤2和步骤3,直到质心的位置不再发生显著变化或达到最大迭代次数。
算法的收敛性取决于初始质心的选择,不同的初始质心可能会导致不同的聚类结果。为了提高算法的稳定性,通常会运行多次K-Means算法,并选择具有最小误差平方和(SSE)的结果。
二、Python代码实现
以下代码使用Scikit-learn库实现K-Means算法,并对结果进行可视化:```python
import numpy as np
import as plt
from import KMeans
from import make_blobs
# 生成示例数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 使用KMeans进行聚类
kmeans = KMeans(n_clusters=4, random_state=0)
(X)
# 获取聚类中心和标签
centers = kmeans.cluster_centers_
labels = kmeans.labels_
# 可视化结果
(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5)
('K-Means Clustering')
('Feature 1')
('Feature 2')
()
# 计算SSE
sse = kmeans.inertia_
print(f"SSE: {sse}")
```
这段代码首先使用`make_blobs`函数生成一些示例数据,然后使用`KMeans`类进行聚类。`n_clusters`参数指定簇的数量,`random_state`参数用于设置随机种子,保证结果的可重复性。`fit`方法用于拟合模型,`cluster_centers_`属性返回聚类中心,`labels_`属性返回每个数据点的簇标签。最后,使用`matplotlib`库将聚类结果可视化,并计算SSE值来评估聚类效果。
三、参数调整和评估
K-Means算法的关键参数是`n_clusters`,即簇的数量。选择合适的簇数量至关重要。常用的方法包括:肘部法则(Elbow Method)和轮廓系数(Silhouette Score)。
肘部法则: 绘制不同k值下的SSE值,观察SSE值下降的拐点,该拐点对应的k值通常被认为是合适的簇数量。```python
sse = []
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=0)
(X)
(kmeans.inertia_)
(range(1, 11), sse)
('Elbow Method')
('Number of clusters (k)')
('SSE')
()
```
轮廓系数: 轮廓系数衡量数据点与其自身簇的相似度以及与其他簇的差异。轮廓系数的值在[-1, 1]之间,越接近1表示聚类效果越好。```python
from import silhouette_score
silhouette_avg = silhouette_score(X, labels)
print(f"Silhouette Score: {silhouette_avg}")
```
四、数据预处理
在应用K-Means算法之前,通常需要对数据进行预处理,例如数据标准化或归一化,以避免特征尺度差异对聚类结果的影响。可以使用Scikit-learn库中的`StandardScaler`或`MinMaxScaler`进行数据预处理。```python
from import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
kmeans = KMeans(n_clusters=4, random_state=0)
(X_scaled)
# ... (后续步骤与之前相同)
```
五、总结
本文详细介绍了K-Means算法的原理以及Python实现,并提供了数据预处理、参数调整和结果评估的方法。K-Means算法是一种简单有效的聚类算法,但其性能也受到数据分布和参数选择的影响。在实际应用中,需要根据具体情况选择合适的参数和预处理方法,并结合其他评估指标来评估聚类效果。
2025-04-12
Python函数中的return语句详解:从基础到高级实践
https://www.shuihudhg.cn/134403.html
Python高效处理HTML:从本地加载到网络爬取与解析实战
https://www.shuihudhg.cn/134402.html
C语言多次输出终极指南:从循环、数组到文件的高效实践
https://www.shuihudhg.cn/134401.html
Python Turtle绘制动态柳树:从递归算法到艺术呈现的完整指南
https://www.shuihudhg.cn/134400.html
Java定时抓取数据:从基础到企业级实践与反爬策略
https://www.shuihudhg.cn/134399.html
热门文章
Python 格式化字符串
https://www.shuihudhg.cn/1272.html
Python 函数库:强大的工具箱,提升编程效率
https://www.shuihudhg.cn/3366.html
Python向CSV文件写入数据
https://www.shuihudhg.cn/372.html
Python 静态代码分析:提升代码质量的利器
https://www.shuihudhg.cn/4753.html
Python 文件名命名规范:最佳实践
https://www.shuihudhg.cn/5836.html