python中实现k-means聚类算法详解

  • Post category:Python

下面是详细讲解“Python中实现k-means聚类算法详解”的完整攻略,包括算法原理、Python实现和两个示例说明。

算法原理

k-means聚类算法是一种基于距离的聚类算法,其基本思想是将数据集划分为k个簇,使得同一簇内的数据点之间的距离尽可能小,不同簇之间的距离尽可能大。具体来说,k-means聚类算法的步骤如下:

  1. 随机选择k个数据点作为初始聚类中心。
  2. 对于每个数据点,计算其与每个聚类中心的距离,将其归为距离最近的聚类中心所在的簇。
  3. 对于每个簇,重新计算其聚类中心。
  4. 重复步骤2和步骤3,直到聚类中心不再发生变化或达到最大迭次数。

Python实现代码

以下是Python实现k-means聚类算法的示例代码:

import numpy as np

class KMeans:
    def __init__(self, n_clusters=8, max_iter=300):
        self.n_clusters = n_clusters
        self.max_iter = max_iter

    def fit(self, X):
        n_samples, n_features = X.shape
        centroids = X[np.random.choice(n_samples, self.n_clusters, replace=False)]
        for i in range(self.max_iter):
            clusters = [[] for _ in range(self.n_clusters)]
            for j in range(n_samples):
                distances = np.linalg.norm(X[j] - centroids, axis=1)
                cluster_idx = np.argmin(distances)
                clusters[cluster_idx].append(j)
            new_centroids = np.zeros((self.n_clusters, n_features))
            for j in range(self.n_clusters):
                if len(clusters[j]) > 0:
                    new_centroids[j] = np.mean(X[clusters[j]], axis=0)
                else:
                    new_centroids[j] = centroids[j]
            if np.allclose(new_centroids, centroids):
                break
            centroids = new_centroids
        self.centroids = centroids

    def predict(self, X):
        distances = np.linalg.norm(X - self.centroids[:, np.newaxis], axis=2)
        return np.argmin(distances, axis=0)

上述代码中,定义了一个KMeans类表示k-means聚类器,包括簇的数量和最大迭代次数等参数。fit方法接受一个数据矩阵X作为参数,随机选择k个数据点作为初始聚类中心,然后对于每个数据点,计算其与每个聚类中心的距离,将其归为距离最近的聚类中心所在的簇,并重新计算每个簇的聚类中心,重复以上步骤直到聚类中心不再发生变化或达到最大迭代次数。predict方法接受一个数据矩阵X作为参数,计算每个数据点与聚类中心的距离,将其归为距离最近的簇。

示例说明

以下是两个示例,说明如何使用KMeans类进行聚类。

示例1

使用KMeans类对Iris数据集进行聚类。

from sklearn.datasets import load_iris
from sklearn.metrics import silhouette_score

iris = load_iris()
X = iris.data
y = iris.target

kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
y_pred = kmeans.predict(X)
score = silhouette_score(X, y_pred)
print(f"Silhouette score: {score}")

输出结果:

Silhouette score: 0.5528190123564091

示例2

使用KMeans类对手写数字数据集进行聚类。

from sklearn.datasets import load_digits
from sklearn.metrics import silhouette_score

digits = load_digits()
X = digits.data
y = digits.target

kmeans = KMeans(n_clusters=10)
kmeans.fit(X)
y_pred = kmeans.predict(X)
score = silhouette_score(X, y_pred)
print(f"Silhouette score: {score}")

输出结果:

Silhouette score: 0.1827298559477645

总结

本文介绍了Python中实现k-means聚类算法详解,包括算法原理、Python实现代码和两个示例说明。k-means聚类算法是一种简单而有效的聚类算法,适用于大规模数据集。在实际应用中,需要注意选择合适的簇的数量和距离度量方法,以获得更好的性能。