Python实现聚类K-means算法详解

  • Post category:Python

Python实现聚类K-means算法详解

本攻略将介绍如何使用Python实现聚类K-means算法。K-means算法是一种常用的聚类算法,其基本思想是将数据集分成K个簇,每个簇包含最接近其质心的数据点。在本攻略中,我们将介绍K-means算法的原理和实现方法,并提供两个示例来演示如何使用Python实现K-means算法。

K-means算法原理

K-means算法是一种迭代算法,其基本思想是将数据集分成K个簇,每个簇包含最接近其质心的数据点。K-means算法的具体步骤如下:

  1. 随机选择K个数据点作为初始质心。
  2. 将每个数据点分配到最近的质心所在的簇中。
  3. 计算每个簇的新质心。
  4. 重复步骤2和3,直到质心不再发生变化或达到最大迭代次数。

K-means算法的优点是简单易用,但其结果可能受到初始质心的影响,且对于非凸数据集的聚类效果不佳。

Python实现K-means算法

以下是使用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):
            # 分配数据点到最近的质心
            distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
            labels = np.argmin(distances, axis=0)

            # 计算新的质心
            new_centroids = np.array([X[labels == j].mean(axis=0) for j in range(self.n_clusters)])

            # 如果质心不再发生变化,则停止迭代
            if np.allclose(centroids, new_centroids):
                break

            centroids = new_centroids

        self.labels_ = labels
        self.cluster_centers_ = centroids

在这个示例中,我们定义了一个KMeans类,其中包含两个方法:init()和fit()。init()方法用于初始化KMeans类的参数,包括簇的数量和最大迭代次数。fit()方法用于拟合数据并执行K-means算法。

示例说明

以下是使用Python实现K-means算法的示例:

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

# 生成机数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 使用K-means算法进行聚类
kmeans = KMeans(n_clusters=4)
means.fit(X)

# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()

在这个示例中,我们使用make_blobs()函数生成一个随机数据集。然后我们使用K-means算法对数据进行聚类,并使用matplotlib库绘制聚类结果。

以下是另一个示例,演示如何使用K-means算法对图像进行压缩:

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import load_sample_image
from sklearn.utils import shuffle

# 加载样本图像
china = load_sample_image('china.jpg')
china = np.array(china, dtype=np.float64) / 255

# 将图像转换为二维数组
w, h, d =(china.shape)
image_array = np.reshape(china, (w * h, d))

# 对图像进行K-means聚类
kmeans = KMeans(n_clusters=64)
image_array_sample shuffle(image_array, random_state=0, n_samples=1000)
kmeans.fit(image_array_sample)

# 使用聚类结果对图像进行压缩
compressed_image = kmeans.cluster_centers_[kmeans.predict(image_array)]
compressed_image = np.reshape(compressed_image, (w, h, d))

# 绘制原始图像和压缩后的图像
fig, ax = plt.subplots(1, 2, figsize=(16, 6))
ax[0].imshow(china)
ax[0].axis('off')
ax[0].set_title('Original Image')
ax[1].imshow(compressed_image)
ax[1].axis('off')
ax[1].set_title('Compressed Image ({0} colors)'.format(kmeans.n_clusters))
plt.show()

在这个示例中,我们加载了一个样本图像,并将其转换为二维数组。然后我们使用K-means算法对图像进行聚类,并使用聚类结果对图像进行压缩最后,我们绘制了原始图像和压缩后的图像。

总结

以上是Python实现K-means算法详解。K-means算法是一种常用的聚类算法,其基本思想是将数据集分成K个簇,每个簇包含最接近其质心的数据点。本攻略中,我们介绍了K-means算法的原理和实现,并提供了两个示例来演示如何使用Python实现K-means算法。这些示例代码可以帮助读者更地理K-means算法的方法和应用场景。