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

相关推荐
武子康4 分钟前
大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和
大数据·人工智能·学习·算法·机器学习·数据挖掘
deephub5 分钟前
Tokenformer:基于参数标记化的高效可扩展Transformer架构
人工智能·python·深度学习·架构·transformer
Q81375746010 分钟前
数据挖掘在金融交易中的应用:民锋科技的智能化布局
人工智能·科技·数据挖掘
qzhqbb14 分钟前
语言模型的采样方法
人工智能·语言模型·自然语言处理
qzhqbb17 分钟前
基于 Transformer 的语言模型
人工智能·语言模型·自然语言处理·transformer
___Dream18 分钟前
【CTFN】基于耦合翻译融合网络的多模态情感分析的层次学习
人工智能·深度学习·机器学习·transformer·人机交互
极客代码25 分钟前
【Python TensorFlow】入门到精通
开发语言·人工智能·python·深度学习·tensorflow
义小深27 分钟前
TensorFlow|咖啡豆识别
人工智能·python·tensorflow
passer__jw76732 分钟前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
Ocean☾39 分钟前
前端基础-html-注册界面
前端·算法·html