K-Means聚类算法的原理与Python实现

K-Means聚类算法的实现

1、简介

K-Means是一种广泛使用的聚类算法,属于无监督学习方法,主要用于将数据集划分为多个组(簇)。它的基本思想是通过迭代的方式最小化簇内的误差平方和(即簇内所有点到该簇中心的距离平方和)。

2、算法原理

  1. 初始化

    • 随机选择K个数据点作为初始的簇中心(质心)。
    • 或者使用某些启发式方法(如K-Means++)来选择初始质心,以提高算法的性能和稳定性。
  2. 分配点到最近的簇

    • 对于数据集中的每一个点,计算它与每个质心之间的距离,并将其分配给距离最近的质心所在的簇。
    • 常用的距离度量方法是欧氏距离,但也可以使用其他距离度量。
  3. 更新质心

    • 对于每个簇,重新计算其质心,新的质心是该簇中所有点的平均值。
  4. 重复步骤2和3

    • 重复执行“分配点”和“更新质心”这两个步骤,直到质心不再发生变化或变化非常小,或者达到预设的最大迭代次数。

3、算法实现

import numpy as np


class KMeans:
    def __init__(self, k=3, max_iters=100):
        self.k = k
        self.max_iters = max_iters
        self.centroids = None

    def fit(self, X):
        self.centroids = X[np.random.choice(X.shape[0], self.k, replace=False)]
        for _ in range(self.max_iters):
            clusters = [[] for _ in range(self.k)]
            for x in X:
                distances = [np.linalg.norm(x - c) for c in self.centroids]
                cluster_idx = np.argmin(distances)
                clusters[cluster_idx].append(x)
            new_centroids = np.array([np.mean(cluster, axis=0) for cluster in clusters])
            if np.all(self.centroids == new_centroids):
                break
            self.centroids = new_centroids

    def predict(self, X):
        distances = [np.linalg.norm(X - c, axis=1) for c in self.centroids]
        return np.argmin(distances, axis=0)


X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])
kmeans = KMeans(k=2)
kmeans.fit(X)
predictions = kmeans.predict(X)

print("中心点:", kmeans.centroids)
print("预测点:", predictions)

5、运行效果


> 中心点: [[1.16666667 1.46666667]
           [7.33333333 9.        ]]
> 预测点: [0 0 1 1 0 1]

K-Means聚类算法的原理与Python实现
https://www.dearcloud.cn/2024/11/14/20241114-k-means-impls/K-Means聚类算法的原理与Python实现/
作者
宋兴柱
发布于
2024年11月14日
许可协议