本学习笔记参考自吴恩达老师机器学习公开课

聚类算法是一种无监督学习算法。k均值算法是其中应用最为广泛的一种,算法接受一个未标记的数据集,然后将数据聚类成不同的组。K均值是一个迭代算法,假设我们想要将数据聚类成K个组,其方法为:

  1. 随机选择K个随机的点(称为聚类中心);
  2. 对与数据集中的每个数据点,按照距离K个中心点的距离,将其与距离最近的中心点关联起来,与同一中心点关联的所有点聚成一类;
  3. 计算每一组的均值,将该组所关联的中心点移动到平均值的位置;
  4. 重复执行2-3步,直至中心点不再变化

算法的数学表示

算法的输入(input):

K – 聚类的类别数

 - 无标签训练集,其中每个输入是都是一个n维的实数向量,即

假设分别表示K个类别的聚类中心,用来存储与第i个实例数据最近的聚类中心的索引(1,2,…,k),则K-均值算法的伪代码如下:

算法分为2个步骤,第一个for循环是赋值步骤,即:对于每一个样例i,计算其应该属于的类。第二个for循环是聚类中心的移动,即:对于每一个类k,重新计算该类的质心。(注:算法执行过程中若出现没有分配点的聚类中心,可以直接移除该聚类中心)

目标函数及其执行细节

目标函数

K均值最小化的问题,是要最小化所有数据点与其所关联的聚类中心点之间的距离之和。因此k均值的代价函数为:

随机初始化

K均值算法执行开始时,通常随机初始化聚类中心点,即:随机选择K个训练实例,然后令K个聚类中心分别等于这K个训练实例。这就使得Kmeans算法存在一个缺陷:最后结果会依赖于初始化的情况,并且有可能使得代价函数停留在局部最小值处。

为了解决该问题,我们通常需要多次(50到1000次)运行K均值算法,每一次都重新进行初始化,最后再比较多次运行K-均值的结果,选择代价函数最小的结果。通常这种方法在K较小的时候(2-10)还是可行的;但是K较大,这么做可能不会有明显的改善,并且K较大时,通常第一次执行K均值也会得到一个不错的结果。典型的执行次数为100次。伪代码如下:

选择聚类数K

没有所谓最好的选择聚类数的方法,通常是需要根据不同的问题,人工的进行选择。但是,当你想要确定最优聚类数K时,有一个值得一试的方法 - “肘部法则(Elbow method)”。该方法所做的就是不断的改变K值(from 1 to x),执行k-均值,然后画出代价函数与K值的变化曲线,选择“肘点处”的值作为K的取值。如下图:

事实上,该方法并不常用,因为大多数情况下,我们通常会得到一个光滑下降的曲线,没有一个清晰的“肘点”,这样就不能果断的确定K的取值;即便若此,该方法还是值得推荐和尝试的。

K-means 算法的更多相关文章

  1. KNN 与 K - Means 算法比较

    KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...

  2. K-means算法

    K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?  ...

  3. 机器学习实战笔记--k近邻算法

    #encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...

  4. 《机器学习实战》学习笔记一K邻近算法

     一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将 ...

  5. [Machine-Learning] K临近算法-简单例子

    k-临近算法 算法步骤 k 临近算法的伪代码,对位置类别属性的数据集中的每个点依次执行以下操作: 计算已知类别数据集中的每个点与当前点之间的距离: 按照距离递增次序排序: 选取与当前点距离最小的k个点 ...

  6. k近邻算法的Java实现

    k近邻算法是机器学习算法中最简单的算法之一,工作原理是:存在一个样本数据集合,即训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据和所属分类的对应关系.输入没有标签的新数据之后, ...

  7. 基本分类方法——KNN(K近邻)算法

    在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...

  8. 聚类算法:K-means 算法(k均值算法)

    k-means算法:      第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设 ...

  9. 从K近邻算法谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...

  10. Python实现kNN(k邻近算法)

    Python实现kNN(k邻近算法) 运行环境 Pyhton3 numpy科学计算模块 计算过程 st=>start: 开始 op1=>operation: 读入数据 op2=>op ...

随机推荐

  1. Akka(30): Http:High-Level-Api,Routing DSL

    在上篇我们介绍了Akka-http Low-Level-Api.实际上这个Api提供了Server对进来的Http-requests进行处理及反应的自定义Flow或者转换函数的接入界面.我们看看下面官 ...

  2. 【计算机网络】 一个小白的DNS学习笔记

    参考书籍 <计算机网络-自顶向下>  作者 James F. Kurose   DNS的作用   DNS是因特网的目录服务 DNS是因特网的目录服务,它提供了主机名到IP地址映射的查询服务 ...

  3. ELK系列~对fluentd参数的理解

    这段时候一直在研究ELK框架,主要集成在对fluentd和nxlog的研究上,国内文章不多,主要看了一下官方的API,配合自己的理解,总结了一下,希望可以帮到刚入行的朋友们! Fluentd(日志收集 ...

  4. 如何用CropBox实现头像裁剪并与java后台交互

    如何用CropBox实现头像裁剪并与java后台交互 参考网站:https://developer.mozilla.org/zh-CN/docs/Web/API/Blob 参考: http://blo ...

  5. 写一个类时什么时候需要重写toString

    一般需要打印出来的时候需要重写toString方法 例如:User.java类 public class User { private String name; @Value(value=" ...

  6. C#中的常识

    1.快捷键 Ctrl+K+D:快速对齐代码 Ctrl+Z:撤销 Ctrl+S:保存 Ctrl+J:快速弹出智能提示 Shift+End.Shift+Home:快速选中 Ctrl+K+C:注释所选代码 ...

  7. HTML学习笔记 CSS表格及轮廓案例 第八节 (原创)参考使用表

    #tb, tb1, tr, th, td { border: 5px solid blue; /*加边框*/ padding: 5px; /*内边距*/ } #tb1 { border-collaps ...

  8. 利用Python循环(包括while&for)各种打印九九乘法表

    一.for循环打印九九乘法表 #注意:由于缩进在浏览器不好控制,请大家见谅,后续会有图片传入. 1.1 左下角 for i in range(1,10): for j in range(1,i+1): ...

  9. 小白必看Python视频基础教程

    Python的排名从去年开始就借助人工智能持续上升,现在它已经成为了第一名.Python的火热,也带动了工程师们的就业热.可能你也想通过学习加入这个炙手可热的行业,可以看看Python视频基础教程,小 ...

  10. 原生js绑定和解绑事件,兼容IE,FF,chrome

    主要是最近项目中用到了原生的js 解绑和绑定 事件  然后今天研究了一下,其实问题不大,不过要注意不要把单词写错了,今天我就找了好久单词写错了. 需求:当鼠标移上去以后,给Select加载元素,接着解 ...