KMean算法精讲

article/2025/8/31 14:06:36

本文目录

    • 基本训练步骤
    • 关于KMeans的几个问题
      • KMeans算法的目标函数是什么?
      • KMeans算法是否一定会收敛?
      • 不同的初始化是否带来不⼀样的结果?
      • K值如何进行选择?
    • KMeans++
    • KMeans的优缺点
    • 个人有关KMeans的奇思妙想

  KMeas算法是一种聚类算法,同时也是一种无监督的算法,即在训练模型时并不需要标签,其主要目的是通过循环迭代,将样本数据分成 K K K类。

基本训练步骤

  • Step1:初始化 K K K个聚类中心(不必是真是的样本)
  • Step2:分别计算所有样本点到这 K K K个聚类中心的距离,并把样本点划分至距离最近的group
  • Step3:针对于每个group,计算其组内的平均点作为新的聚类中心(例如用户有年龄、性别两个特征,针对于年龄特征直接求平均值即可,对于性别特征使用onehot编码,每个纬度都求其平均值即可)
  • Step4:重复步骤2和3直到满足终止条件

其基本过程如下图所示:
在这里插入图片描述

关于KMeans的几个问题

KMeans算法的目标函数是什么?

  已知观测集 ( x 1 , x 2 , . . . , x n ) (x_1,x_2,...,x_n) (x1,x2,...,xn),其中每个观测都是一个d维实向量,k平均聚类要把这 n n n个观测划分到 K K K个集合中 ( K ≤ n ) (K≤n) (Kn),使得组内平方和最小。换句话说,它的目标是找到使得下式满足的聚类 S i S_i Si
arg min ⁡ S ∑ i = 1 K ∑ x ∈ S i ∣ ∣ x i − μ i ∣ ∣ 2 \argmin_S\sum\limits_{i=1}^K\sum\limits_{x\in S_i}||x_i-\mu_i||^2 Sargmini=1KxSixiμi2
其中 u i u_i ui S i S_i Si中所有点的均值

KMeans算法是否一定会收敛?

  将 n n n个数据分为 K K K个聚类,最多有 n K n^K nK种分类可能,这是一个很大但有限的数字。对于算法每次迭代,我们仅基于旧的聚类产生一个新的聚类。算法的性质如下:

  • (1)如果旧的聚类与新的聚类相同,则下一次迭代的结果将再次相同。
  • (2)如果新的聚类与旧的聚类不同,则更新的群集的目标函数值较低

  因此,KMeans算法的迭代过程总是在朝着目标函数减小的方向进行,进行优先次迭代之后,其目标值一定可以收敛。

不同的初始化是否带来不⼀样的结果?

不同的初始化显然会带来不同的结果,下面图片就可以表示:
在这里插入图片描述

K值如何进行选择?

  显然不同的K值也会导致最终的结果不同,那么我们该如何对K值进行选择?
在这里插入图片描述
  在这里我们定义一个概念Inertia:样本集中所有点离其所属cluster中心的距离的总和。
在这里插入图片描述
  因此我们可以使用交叉验证的方法,对不同的K值计算其Inertia,当 K K K趋近于 n n n时,Inertia的值一定是越来越小并且趋近于0,但其总会存在一个拐点,即Inertia下降的速度由快变为慢,我们一般取这个拐点的K值:
在这里插入图片描述

KMeans++

  所谓Kmeans++,即在Kmeans的基础上做了一些改进,主要是针对于初始点选择进行了优化,其初始点的选择过程如下:

  • 1.从数据点中随机选择一个中心。
  • 2.对于每个数据点 x x x,计算 D ( x ) D(x) D(x),即 x x x与已经选择的最接近中心之间的距离。
  • 3.使用加权概率分布随机选择一个新的数据点作为新的中心,其中选择点 x x x 的概率与 D ( x ) 2 D(x)^2 D(x)2成正比。
  • 4.重复步骤2和3,直到选择了 K K K个中心。

其余训练过程与KMeans一致。

KMeans的优缺点

优点:

  • 容易理解,容易实现
  • 容易解释结果
  • 计算复杂度比较低

缺点:

  • 当数据的分布密度不均匀情况下,效果不理想
  • 即使真实的聚类情况下不同聚类的个体数量非常不同,K-Means-也倾向让不同聚类包含的个体数据比较平均
  • K-Means前提假设数据特征之间的联合分布是椭圆形的。这个条件在真实世界很难满足。
  • K-Means无法处理环套环,缠绕S形的聚类
  • 对异常值比较敏感
  • 对初始化比较敏感

个人有关KMeans的奇思妙想

  上面有提到过,KMeans无法处理环套环,缠绕S形的聚类,也可以理解为对于分类问题,无法处理线性不可分的情况,但是我们在计算距离时如果有使用内积,比如余弦距离,那么我们就可以使用kernel trick,但缺点是对于核函数的选择我们往往需要采用交叉验证,这就需要我们使用带标签的数据来进行训练,而且现实中的意义可能不大。


http://chatgpt.dhexx.cn/article/gAJbLaou.shtml

相关文章

K-Means算法的并行和分布式写法

前段时间学习了并行与分布式技术,为了写了篇关于KMeans算法的并行和分布式的编程写法,上网找了挺久,没想到网上并没有很多资料,那今天就来说一下我是怎么写的吧。 首先来讲一下K-Means的思想原理吧! K-Means算法思想…

k-means算法、性能及优化

k-means算法、性能及优化 一、k-means算法简介 k-means是用来解决著名的聚类问题的最简单的非监督学习算法之一。 该过程遵循一个简易的方式,将一组数据划分为预先设定好的k个簇。其主要思想是为每个簇定义一个质心。设置这些质心需要一些技巧,因为不同的…

k均值聚类算法(K Means)及其实战案例

算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑。其中K表示要聚类的数量,就是说样本要被划分成几个类别。而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本的算术平均数。 这里存在一个…

详解K-Means算法

一、引言 K-Means算法是机器学习中最简单、最常见的一种聚类算法。 1.什么是聚类? 通俗来讲,聚类就是将一堆没有标签的原始样本数据,按照某个标准让其中特征一致的样本自动聚成一堆儿,最后原始样本数据聚成了一堆儿一堆儿的。 …

weighted Kernel k-means 加权核k均值算法理解及其实现(一)

那就从k-means开始吧 对于机器学习的新手小白来说,k-means算法应该都会接触到吧。传统的k-means算法是一个硬聚类(因为要指定k这个参数啦)算法。这里利用百度的解释 它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算…

K-均值算法的原理与实战

K-均值(K-means)算法是一种常用的聚类算法。 当我们需要对未标记的数据划分类别时,往往用到的算法是聚类(clustering)。聚类是一种无监督的学习,它试图将数据集中的样本划分为若干个通常是不相交的子集&…

十分钟快速讲明白K均值聚类算法

K均值聚类算法 无监督学习 在一个典型的监督学习中,我们有一个有标签的训练集,我们的目标是找到能够区分正样本和负样本的决策边界,在这里的监督学习中,我们有一系列标签,我们需要据此拟合一个假设函数。 与此不同的…

深入浅出聚类算法之k-means算法

k-means是一个十分简单的聚类算法,它的思路非常简明清晰,所以经常拿来当做教学。下面就来讲述一下这个模型的细节操作。 内容 模型原理模型收敛过程模型聚类个数模型局限 1. 模型原理 将某一些数据分为不同的类别,在相同的类别中数据之间的…

c++函数调用

一个函数就是完成一项任务的独立代码块,它以名字作为整个代码块的代表 函数完成任务后,如果有数值需要返回,则在声明函数时,在函数名前写好返回值类型 如果不需要返回任何值,则在函数名前写 void 有时,一个…

c语言中函数调用的过程

一.程序在内存中的占用。 要学习C语言中函数调用的过程,必须要知道程序在内存中各个区域的分布。 C语言的函数调用的过程主要分布在栈中,所以我们今天主要研究栈。 二.几个基本的汇编指令。 call:1.将当前指令的下一条指令的地址保存到栈中…

函数定义和调用

<1>定义函数 定义函数的格式如下&#xff1a; def 函数名(): 代码 demo: 定义一个函数&#xff0c;能够完成打印信息的功能 def printInfo(): print(’------------------------------------’) print(’ 人生苦短&#xff0c;我用Python’) print(’----------------…

Shell函数调用

文章目录 一.函数基本格式二.函数调用2.1函数中调用2.2函数调用函数2.3外部调用2.4案例 三.总结 在shell脚本中&#xff0c;有些命令或者某些操作需要频繁的使用时&#xff0c;每次都重新写太过繁琐&#xff0c;这时我们就可以使用函数&#xff0c;当需要使用时&#xff0c;直接…

类的函数调用

父类和子类的函数调用 1.用指针&#xff08;引用&#xff09;调用函数的时候&#xff0c;被调用的函数取决于指针&#xff08;引用&#xff09;的类型&#xff1b; 2.涉及多态性时&#xff0c;采用虚函数和动态绑定&#xff0c;函数调用在运行时绑定&#xff0c;而非在编译时…

函数调用栈分析

进程在虚拟地址空间的布局 操作系统把磁盘上可执行文件加载到内存运行之前, 需要做很多工作, 其中很重要的一件事就是把可执行文件中的代码, 数据存放到内存 中合适的位置, 并分配和初始化程序运行过程中必须的堆栈, 所有准备工作完成之后操作系统才会调度程序起来运行. 进程…

C语言的函数调用过程

C语言的函数调用过程 先上一段代码 #include<stdio.h> int Add(int x, int y) {int z 0;z x y;return z; } #include <stdio.h> int main() {int a 10;int b 20;int c Add(a, b);return 0; } 123456789101112131415 这个函数计算两个数的值。接下来我们通…

C--函数调用

C函数的调用约定 编译器实现函数调用时所遵循的一系列规则称为函数的“调用约定&#xff08;Calling Convention&#xff09;” 对于C语言来说&#xff0c;运行在X86-64平台上的编译器基本都会根据操作系统的不同选择使用几种常见的调用约定。例如&#xff0c;在wiindows下通常…

C语言 函数调用的过程

例题&#xff1a;求两个整数中的较小者&#xff0c;用函数调用实现。 【代码实现】 int Min(int x, int y) {if (x < y){return x;}elsereturn y; } int main() {int Min(int x, int y);int a, b, c;printf("输入两个要比较的整数&#xff1a;\n");scanf("%…

函数调用的过程分析

一、函数调用机制 局部变量占用的内存是在程序执行过程中”动态”地建立和释放的。这种”动态”是通过栈由系统自动管理进行的。当任何一个函数调用发生时,系统都要作以下工作: 1)建立栈帧空间;2)保护现场: 主调函数运行状态和返回地址入栈&#xff1b;3)为被调函数传递数据(…

C/C++ 函数调用是如何实现的?

一、写在前面的话 C/C 函数调用方式与栈原理是 C/C 开发必须要掌握的基础知识&#xff0c;也是高级技术岗位面试中高频题。我真的真的真的建议无论是使用 C/C 的学生还是广大 C/C 开发者&#xff0c;都该掌握此回答中所介绍的知识。 如果你看不懂接下来第二部分在说什么&#…

函数调用过程

今天突然看到有人私信我说一直没写函数调用过程&#xff08;栈帧的形成和销毁过程&#xff09;这篇博文&#xff0c;赶紧补上。 刚看的栈帧内容时&#xff0c;我很迷惑&#xff0c;我觉得栈帧创建和销毁很麻烦&#xff0c;几句话根本说不完&#xff0c;而且我好像描述不清楚他…