k-均值聚类算法介绍
k-均值聚类算法是一种经典的无监督学习算法,用于将数据点划分为k个簇。该算法简单易懂,效率高,在许多领域都有广泛应用。
原理
k-均值聚类算法的核心思想是:
- 随机选择k个点作为初始的簇中心。
- 计算每个数据点到每个簇中心的距离,并将数据点分配到距离最近的簇。
- 重新计算每个簇的中心,使其为该簇所有数据点的平均值。
- 重复步骤2和3,直到簇中心不再变化。
优缺点
优点:
- 简单易懂,易于实现。
- 效率高,适用于大规模数据集。
- 对数据类型没有限制,可以处理数值型、文本型等数据。
缺点:
- 需要预先指定簇的数量k,而k的选择对聚类结果有很大影响。
- 对初始簇中心的选取敏感,不同的初始簇中心可能导致不同的聚类结果。
- 不适用于形状不规则的簇。
实现过程
以下是用Python实现k-均值聚类算法的示例代码:
import numpy as np
def kmeans(X, k):
"""
k-均值聚类算法
Args:
X: 数据矩阵,形状为(n_samples, n_features)
k: 簇的数量
Returns:
labels: 数据点的簇标签,形状为(n_samples,)
centroids: 簇中心,形状为(k, n_features)
"""
# 随机选择k个点作为初始簇中心
centroids = X[np.random.choice(X.shape[0], k, replace=False)]
# 迭代直到簇中心不再变化
while True:
# 计算每个数据点到每个簇中心的距离
distances = np.linalg.norm(X[:, np.newaxis] - centroids, axis=2)
# 将数据点分配到距离最近的簇
labels = np.argmin(distances, axis=1)
# 重新计算每个簇的中心
new_centroids = np.zeros_like(centroids)
for i in range(k):
new_centroids[i] = np.mean(X[labels == i], axis=0)
# 判断簇中心是否变化
if np.allclose(centroids, new_centroids):
break
# 更新簇中心
centroids = new_centroids
return labels, centroids
具体示例
以下是用k-均值聚类算法对鸢尾花数据集进行聚类的示例:
from sklearn import datasets
from sklearn.cluster import KMeans
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 使用k-均值聚类算法进行聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
# 打印聚类结果
print(kmeans.labels_)
运行代码后,将输出每个数据点的簇标签。我们可以使用matplotlib库将聚类结果可视化:
import matplotlib.pyplot as plt
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)``
运行代码后,将输出每个数据点的簇标签。我们可以使用matplotlib库将聚类结果可视化:
```python
import matplotlib.pyplot as plt
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)
plt.show()
图中不同颜色代表不同的簇。
总结
k-均值聚类算法是一种简单易懂、效率高、应用广泛的聚类算法。它适用于各种类型的数据,但对初始簇中心的选取和簇的数量k的选择敏感。在实际应用中,需要根据具体情况进行调整。