今天介绍机器学习里常见的一种无监督聚类算法,K-means。我们先来考虑在一个高维空间的一组数据集,S={x1,x2,...,xN}" role="presentation" style="position: relative;">S={x1,x2,...,xN}S={x1,x2,...,xN}, x∈RD" role="presentation" style="position: relative;">x∈RDx∈RD,假设我们需要把这组数据聚集长 K" role="presentation" style="position: relative;">KK 类,不失一般性,我们可以假设每个聚好的类都有一个中心 μk" role="presentation" style="position: relative;">μkμk,如果聚类完成的话,那么数据集中的每一个点 x" role="presentation" style="position: relative;">xx 会有一个中心 μk" role="presentation" style="position: relative;">μkμk 离这个点的距离最近。可以构造一个变量 rnk={0,1}" role="presentation" style="position: relative;">rnk={0,1}rnk={0,1} 表示变量 x" role="presentation" style="position: relative;">xx 离第 k" role="presentation" style="position: relative;">kk 类最近 rnk=1" role="presentation" style="position: relative;">rnk=1rnk=1,离其他的类更远 rnj=0,j≠k" role="presentation" style="position: relative;">rnj=0,j≠krnj=0,j≠k,那么我们可以定义如下的目标函数:

J=∑n=1N∑k=1Krnk||xn−μk||2" role="presentation">J=∑n=1N∑k=1Krnk||xn−μk||2J=∑n=1N∑k=1Krnk||xn−μk||2

这个目标函数就是要求 rnk,μk" role="presentation" style="position: relative;">rnk,μkrnk,μk,使得目标函数 J" role="presentation" style="position: relative;">JJ 的值最小。

为了解决上面这个问题,因为要同时求 rnk,μk" role="presentation" style="position: relative;">rnk,μkrnk,μk 两个变量,所以我们会采取分步迭代的方法,当我们求 rnk" role="presentation" style="position: relative;">rnkrnk 可以让 μk" role="presentation" style="position: relative;">μkμk 固定不动,当我们求 μk" role="presentation" style="position: relative;">μkμk 的时候,可以让 rnk" role="presentation" style="position: relative;">rnkrnk 固定不动。

很显然,当我们求 rnk" role="presentation" style="position: relative;">rnkrnk,只有比较每一个 xn" role="presentation" style="position: relative;">xnxn 与 μk" role="presentation" style="position: relative;">μkμk 的距离,选择距离最近的一个类即可:

rnk=1if=arg⁡minj||xn−μj||2" role="presentation">rnk=1if=argminj||xn−μj||2rnk=1if=arg⁡minj||xn−μj||2

而求 μk" role="presentation" style="position: relative;">μkμk 的时候,我们可以 让 rnk" role="presentation" style="position: relative;">rnkrnk 固定不动, 对目标函数 J" role="presentation" style="position: relative;">JJ 求导,

2∑n=1Nrnk(xn−μk)=0" role="presentation">2∑n=1Nrnk(xn−μk)=02∑n=1Nrnk(xn−μk)=0

从而我们可以求得 μk" role="presentation" style="position: relative;">μkμk :

μk=∑nrnkxn∑nrnk" role="presentation">μk=∑nrnkxn∑nrnkμk=∑nrnkxn∑nrnk

通过这样的反复迭代,直到所有的 rnk,μk" role="presentation" style="position: relative;">rnk,μkrnk,μk 都不再变化。

机器学习: K-means 聚类的更多相关文章

  1. 吴裕雄 python 机器学习——K均值聚类KMeans模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import cluster from sklearn.metrics ...

  2. 机器学习算法与Python实践之(五)k均值聚类(k-means)

    机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学 ...

  3. 机器学习算法与Python实践之(六)二分k均值聚类

    http://blog.csdn.net/zouxy09/article/details/17590137 机器学习算法与Python实践之(六)二分k均值聚类 zouxy09@qq.com http ...

  4. 机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例

    k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定 ...

  5. 机器学习之路:python k均值聚类 KMeans 手写数字

    python3 学习使用api 使用了网上的数据集,我把他下载到了本地 可以到我的git中下载数据集: https://github.com/linyi0604/MachineLearning 代码: ...

  6. 机器学习之K均值聚类

      聚类的核心概念是相似度或距离,有很多相似度或距离的方法,比如欧式距离.马氏距离.相关系数.余弦定理.层次聚类和K均值聚类等 1. K均值聚类思想   K均值聚类的基本思想是,通过迭代的方法寻找K个 ...

  7. 100天搞定机器学习|day44 k均值聚类数学推导与python实现

    [如何正确使用「K均值聚类」? 1.k均值聚类模型 给定样本,每个样本都是m为特征向量,模型目标是将n个样本分到k个不停的类或簇中,每个样本到其所属类的中心的距离最小,每个样本只能属于一个类.用C表示 ...

  8. 机器学习实战---K均值聚类算法

    一:一般K均值聚类算法实现 (一)导入数据 import numpy as np import matplotlib.pyplot as plt def loadDataSet(filename): ...

  9. 机器学习六--K-means聚类算法

    机器学习六--K-means聚类算法 想想常见的分类算法有决策树.Logistic回归.SVM.贝叶斯等.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别 ...

  10. 机器学习理论与实战(十)K均值聚类和二分K均值聚类

    接下来就要说下无监督机器学习方法,所谓无监督机器学习前面也说过,就是没有标签的情况,对样本数据进行聚类分析.关联性分析等.主要包括K均值聚类(K-means clustering)和关联分析,这两大类 ...

随机推荐

  1. C++ string::size_type

    从逻辑上讲,size()成员函数应该似乎返回整型数值,但事实上,size操作返回是string::size_type类型的值.string类类型和其他许多库类型都定义了一些配套类型(companion ...

  2. jQuery-全屏滚动插件【fullPage.js】API 使用方法总结

    jQuery-全屏滚动插件[fullPage.js]API 使用方法总结   jQuery-全屏滚动插件fullPage.js使用方法总结 作者github及下载地址:https://github.c ...

  3. 数据库恢复(database restore)之兵不血刃——半小时恢复客户数据库

    昨天,一个客户打打来电话,说他们的数据库坏了,不能用了,需要我帮助恢复下,这马上要放假了,居然出了这事儿,自己也不太喜欢恢复数据库这类,尤其是他们的数据库是个win上的库,但心里很清楚,客户比咱着急, ...

  4. Android--Android Studio 打开ADM报错

    Android studio无法打开类似与eclipse的DDMS, 在android studio里点击android device monitor(点击菜单栏里的Tools->Android ...

  5. 尚学堂java答案解析 第二章

    本答案为本人个人编辑,仅供参考,如果读者发现,请私信本人或在下方评论,提醒本人修改 一.选择题: 1.CD 解析:A public是关键字. B 第一个不能是数字 2.C 解析:j=i++  < ...

  6. VS Code 常用快捷键

    VS Code 常用快捷键 1.注释: 单行注释:ctrl+/, 注释后再按取消 取消单行注释:alt+shift+A 注释后再按取消 2.移动行 向上移动一行:alt+up 向下移动一行:alt+d ...

  7. bzoj2055

    题解: 似乎是放在费用流里的 然而是有上下界的网络流QAQ 代码: #include<bits/stdc++.h> using namespace std; ; int n,m,x,min ...

  8. flask项目结构(一)mariadb

    简介: 本文主要是根据自己所学,创建一个flask项目,使用sqlalchemy,alembic,mariadb,bootstrap,APScheduler,selenium,request…………技 ...

  9. 今天心情大好,在bluemix部署了一个hell-oworld。

    虽然不是什么很NB的事情. 但是已经开始了. 基于kubernetes容器技术,在kubernetes集群中部署docker镜像hello-world,并正确映射到集群的80端口. 听着老TM复杂了. ...

  10. 在命令行中的vim编辑器加上行号

    在使用vim编辑器时运行脚本程序纠察缺少相应的行号,检测起来非常不方便, 所以在vim编辑器每行前面加上相应的行号: 输入命令::set nu 按下回车,完成