K-Means聚类算法

6.1 K-Means聚类算法

6.1.1 聚类

聚类(Clustering)是指将不同的对象划分成由多个对象组成的多个类的过程。由聚类产生的数据分组,同一组内的对象具有相似性,不同组的对象具有相异性。聚类待划分的类别未知,即训练数据没有标签。聚类属于非监督学习。

簇(cluster)是由距离邻近的对象组合而成的集合。聚类的最终目标是获得紧凑、独立的簇集合。一般采用相似度作为聚类的依据,两个对象的距离越近,其相似度就越大。

按照簇的定义和聚类的方式,聚类大致分为以下几种:K-Means为代表的簇中心聚类、基于连通性的层次聚类、以EM算法为代表的概率分布聚类、以DBSCAN为代表的基于网格密度的聚类,以及高斯混合聚类等。

6.1.2 K-Means聚类

K-Means聚类算法也称为K均值聚类算法,是典型的聚类算法。对于给定的数据集和需要划分的类数k,算法根据距离函数进行迭代处理,动态地把数据划分成k个簇(即类别),直到收敛为止。簇中心(cluster center)也称为聚类中心。

K-Means聚类的优点是算法简单、运算速度快,即便数据集很大计算起来也便捷。不足之处是如果数据集较大,容易获得局部最优的分类结果。而且所产生的类的大小相近,对噪声数据也比较敏感。

聚类的运算流程:

python 复制代码
随机选择 k个数据点 -> 起始簇中心

While数据点的分配结果发生改变:

     for数据集中的每个数据点p:

           for 循环访问每个簇中心c:

                 computer_distance(p,c)

                 将数据点p分配到最近的簇

     for 每一个簇:

           簇中心更新为簇内数据点的均值

聚类是一个反复迭代的过程,理想的终止条件是簇的分配和个簇中心不再改变。此外,也可以设置循环次数、变化误差作为终止条件。

聚类的运算流程可以简单示意为下图:

上图中在第三次迭代之后,分配方案和簇中心保持不变,算法结束

6.1.3聚类算法的性能评估

1.常见的聚类评价方法

大致3类:外部有效性评价、内部有效性评价和相对评价法。

  • 外部评价反映聚类结果的整体效果,常用的指标有F-measure指数,Rand指数和Jaccard系数等。
  • 内部评价是利用数据集的内部特征来评价,包括Dunn指数、轮廓系数等指标。
  • 相对评价法选定某个评价指标,然后为聚类算法设置不同的参数进行测试。根据测试结果选取最优的算法参数和聚类模式等,例如改进的Dunn指数等。
2.K-Means目标函数

假设数据集X包含n个数据点,需要划分到k个类。类中心为用集合U表示。聚类后所有数据点到各自聚类中心的差的平方和为聚类平方和用J表示,J值为:

聚类的目标就是使J值最小化。 如果在某次迭代前后,J值没有収生变化,则说明 簇的分配丌再収生变化,算法已经收敛。

6.2.4 代码示例(Python)

以下是一个使用 Python 实现 K-Means 聚类算法的简单示例:

python 复制代码
import numpy as np

def kmeans(data, k, max_iterations=100):
    n_samples, n_features = data.shape
    centroids = data[np.random.choice(n_samples, k, replace=False)]
    for _ in range(max_iterations):
        distances = np.linalg.norm(data[:, np.newaxis] - centroids, axis=2)
        labels = np.argmin(distances, axis=1)
        new_centroids = np.array([data[labels == i].mean(axis=0) for i in range(k)])
        if np.allclose(centroids, new_centroids):
            break
        centroids = new_centroids
    return labels, centroids

你可以使用以下方式调用这个函数:

python 复制代码
data = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])
labels, centroids = kmeans(data, k=2)
print("Labels:", labels)
print("Centroids:", centroids)

在这个示例中,我们首先定义了一个kmeans函数,它接受数据集data、聚类数k和最大迭代次数作为参数。函数首先随机选择初始聚类中心,然后通过不断迭代分配样本和更新聚类中心的过程,直到聚类中心不再发生变化或达到最大迭代次数为止。最后,函数返回每个样本的聚类标签和最终的聚类中心。这只是一个简单的示例,实际应用中可能需要根据具体问题进行调整和优化。

相关推荐
黎燃2 小时前
短视频平台内容推荐算法优化:从协同过滤到多模态深度学习
人工智能
飞哥数智坊3 小时前
多次尝试用 CodeBuddy 做小程序,最终我放弃了
人工智能·ai编程
后端小肥肠4 小时前
别再眼馋 10w + 治愈漫画!Coze 工作流 3 分钟出成品,小白可学
人工智能·aigc·coze
唐某人丶7 小时前
教你如何用 JS 实现 Agent 系统(2)—— 开发 ReAct 版本的“深度搜索”
前端·人工智能·aigc
FIT2CLOUD飞致云7 小时前
九月月报丨MaxKB在不同规模医疗机构的应用进展汇报
人工智能·开源
阿里云大数据AI技术7 小时前
【新模型速递】PAI-Model Gallery云上一键部署Qwen3-Next系列模型
人工智能
袁庭新7 小时前
全球首位AI机器人部长,背负反腐重任
人工智能·aigc
机器之心7 小时前
谁说Scaling Law到头了?新研究:每一步的微小提升会带来指数级增长
人工智能·openai
算家计算8 小时前
AI配音革命!B站最新开源IndexTTS2本地部署教程:精准对口型,情感随心换
人工智能·开源·aigc
量子位8 小时前
马斯克周末血裁xAI 500人
人工智能·ai编程