K-means算法

概述主要思想优点与缺点代码实现

概述

K-means算法是一种常见的无监督学习算法,其目的是将一组数据点分成K个簇,每个簇的数据点与其它簇的数据点相似度较低。这个算法可以用于许多领域,例如数据挖掘、图像处理和自然语言处理等。

主要思想

1.初始化K个簇中心,可以随机选择数据集中的K个点。 2.将每个数据点分配到距离最近的簇中心所在的簇。 3.对于每个簇,重新计算簇中心的位置。 4.重复步骤2和步骤3,直到簇中心不再变化或达到最大迭代次数为止。

优点与缺点

K-means算法的优点在于简单易懂、计算效率高、可解释性强,并且对于一些数据集,其聚类效果较好。但是,K-means算法需要事先确定聚类数量K,并且对于不同的K值可能会得到不同的聚类结果,因此在使用K-means算法时需要根据实际问题对K值进行合理选择。此外,K-means算法对噪声和异常值比较敏感。

代码实现

import numpy as np

class KMeans:

def __init__(self, k=3, max_iter=100):

self.k = k

self.max_iter = max_iter

def fit(self, X):

# 随机初始化聚类中心

self.centroids = X[np.random.choice(len(X), self.k, replace=False)]

# 迭代

for i in range(self.max_iter):

# 初始化聚类簇

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)

# 保存上一次迭代的聚类中心

prev_centroids = self.centroids

# 重新计算每个聚类簇的中心

self.centroids = [np.mean(cluster, axis=0) if cluster else prev_centroids[i] for i, cluster in enumerate(clusters)]

# 判断聚类中心是否变化

if np.allclose(prev_centroids, self.centroids):

break

# 返回聚类中心、聚类簇和实际迭代次数

return self.centroids, clusters, i+1

上面的代码使用了NumPy库来进行向量计算。在这个实现中,KMeans类有两个参数:k是聚类数量,max_iter是最大迭代次数。fit方法用于训练模型,其中X是一个

n

×

d

n \times d

n×d的矩阵,表示

n

n

n个

d

d

d维数据点。该方法返回三个值:centroids表示聚类中心,clusters是一个长度为k的列表,每个元素是一个聚类簇中的数据点集合,i+1是实际迭代次数。

在fit方法中,我们首先随机初始化k个聚类中心,然后重复以下步骤,直到簇中心不再变化或达到最大迭代次数:

1.遍历每个数据点,将其分配到距离最近的聚类中心所在的簇中。 2.重新计算每个聚类簇的中心。 最后,我们返回计算得到的聚类中心和聚类簇。

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: