欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入我们的社群。

K-Means 算法

算法 迷途小书童 2年前 (2023-03-16) 828次浏览 0个评论

简介

K-Means 算法是一种非监督学习算法,它可以将数据分为K个不同的簇或者组。在本文中,我们将会介绍 K-Means 算法的基本概念、原理、实现方法以及使用示例。

基本概念

K-Means 算法中,簇指的是一个由数据点组成的集合,这些数据点具有相似的属性。例如,在对一个顾客数据库进行聚类时,同一簇中的顾客可能具有相似的购买记录、年龄、性别等属性。

距离度量

K-Means 算法中,需要使用距离度量来衡量不同数据点之间的距离。常用的距离度量有欧式距离、曼哈顿距离等。

中心点

每个簇都有一个中心点,该中心点是所有数据点的平均值,用于代表整个簇。

质心

质心指的是所有簇中心点的平均值,也可以理解为所有数据点的平均值。在 K-Means 算法中,质心通常用于计算新的中心点。

原理

K-Means 算法的基本原理是通过迭代寻找最优的簇分配方式,使得每个簇内部的数据点相似度尽可能高,而不同簇之间的相似度尽可能低。

具体步骤如下:

随机初始化 K 个中心点。

将所有数据点分配到离它们最近的中心点所在的簇中。

对每个簇,重新计算该簇的中心点。

重复步骤2和步骤3,直到簇的分配不再改变或者达到指定的迭代次数。

实现方法

我们将 K-Means 算法的实现封装在一个类中,该类包含以下方法:

  • init():初始化类,其中 n_clusters 表示要聚类的簇的数量,max_iter 表示迭代次数,默认值为300。
  • fit():训练模型,其中 X 表示数据集,返回聚类后的标签。
  • predict():预测数据点所属的簇。

具体代码实现如下:

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.zeros((self.n_clusters, n_features))
            for j in range(self.n_clusters):
                new_centroids[j, :] = X[labels == j, :].mean(axis=0)

            # 如果质心不再变化,退出循环
            if np.allclose(new_centroids, centroids):
                break

            centroids = new_centroids

        return labels

    def predict(self, X):
        distances = np.sqrt(((X - self.centroids[:, np.newaxis])**2).sum(axis=2))
        labels = np.argmin(distances, axis=0)
        return labels

使用示例

我们使用一个示例数据集来演示 K-Means 算法的使用

import matplotlib.pyplot as plt

# 生成示例数据
X = np.random.randn(200, 2)
X[:50, :] += 5
X[50:100, :] -= 5

# 初始化并训练模型
kmeans = KMeans(n_clusters=2)
labels = kmeans.fit(X)

# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.show()

上述代码生成了一个包含200个数据点的示例数据集,其中前50个点在(x,y)方向上都增加了5,后50个点在(x,y)方向上都减少了5。

参考资料

喜欢 (0)

您必须 登录 才能发表评论!