python实现K均值聚类算法

小小编辑 1年前 ⋅ 169 阅读

K均值聚类算法是一种常用的无监督学习算法,用于将数据点分成不同的簇(cluster),每个簇包含具有相似特征的数据点。K均值聚类算法的核心思想是通过迭代优化来找到一组簇中心,使得数据点与其所属簇中心的距离最小化。

算法步骤如下:

初始化:选择要聚类的数据点和簇的数量K,并随机初始化K个簇中心。

分配:对每个数据点,计算其与每个簇中心的距离,将其分配到最近的簇中心所属的簇。

更新簇中心:对每个簇,计算簇内所有数据点的均值,将均值作为新的簇中心。

重复:重复执行步骤2和步骤3,直到簇中心不再发生明显变化或达到预定的迭代次数。

K均值聚类算法的优点和缺点:

优点:

简单、直观且易于实现。 在某些情况下,可以得到较好的聚类结果。 适用于大规模数据集。 缺点:

需要事先指定簇的数量K,选择不合适的K可能导致不好的聚类结果。 对初始簇中心的选择敏感,不同的初始中心可能会得到不同的结果。 对于非球形簇的数据,可能效果较差。 对于噪声和异常值敏感。 在实际应用中,可以通过多次尝试不同的初始中心、选择合适的距离度量方法,以及使用一些改进的K均值变体(如K-Medoids、K-Means++)来提高算法的性能和稳定性。

以下是使用Python实现K均值聚类算法的基本示例:

import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 生成示例数据
n_samples = 300
n_features = 2
n_clusters = 3
random_state = 42

X, _ = make_blobs(n_samples=n_samples, n_features=n_features, centers=n_clusters, random_state=random_state)

# 创建K均值聚类模型
kmeans = KMeans(n_clusters=n_clusters, random_state=random_state)

# 在数据上进行聚类
kmeans.fit(X)

# 获取聚类结果
labels = kmeans.labels_
centroids = kmeans.cluster_centers_

# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.title("K-Means Clustering")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()

在这个示例中,我们使用make_blobs函数生成一个包含3个聚类中心的示例数据集。然后,我们使用KMeans类创建了一个K均值聚类模型,并在数据集上进行聚类。最后,我们使用matplotlib库将聚类结果可视化,将数据点标记为不同的颜色以表示不同的簇,用红色的"X"表示每个簇的中心点。

请注意,K均值聚类算法的性能受到初始中心点的影响,不同的初始中心点可能导致不同的聚类结果。在实际应用中,可以使用不同的初始中心点进行多次聚类,然后选择最好的结果。