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和最大迭代次数作为参数。函数首先随机选择初始聚类中心,然后通过不断迭代分配样本和更新聚类中心的过程,直到聚类中心不再发生变化或达到最大迭代次数为止。最后,函数返回每个样本的聚类标签和最终的聚类中心。这只是一个简单的示例,实际应用中可能需要根据具体问题进行调整和优化。

相关推荐
网易独家音乐人Mike Zhou2 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
小陈phd2 小时前
OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算
人工智能·opencv·计算机视觉
Guofu_Liao3 小时前
大语言模型---LoRA简介;LoRA的优势;LoRA训练步骤;总结
人工智能·语言模型·自然语言处理·矩阵·llama
Swift社区5 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman6 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
IT 青年7 小时前
数据结构 (1)基本概念和术语
数据结构·算法
ZHOU_WUYI7 小时前
3.langchain中的prompt模板 (few shot examples in chat models)
人工智能·langchain·prompt
Dong雨7 小时前
力扣hot100-->栈/单调栈
算法·leetcode·职场和发展
如若1237 小时前
主要用于图像的颜色提取、替换以及区域修改
人工智能·opencv·计算机视觉
SoraLuna7 小时前
「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解
开发语言·算法·macos·cangjie