【人工智能与深度学习】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.重新计算每个聚类簇的中心。
最后,我们返回计算得到的聚类中心和聚类簇。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值