python实现聚类算法原理


Posted in Python onFebruary 12, 2018

本文主要内容:

  • 聚类算法的特点
  • 聚类算法样本间的属性(包括,有序属性、无序属性)度量标准
  • 聚类的常见算法,原型聚类(主要论述K均值聚类),层次聚类、密度聚类
  • K均值聚类算法的python实现,以及聚类算法与EM最大算法的关系
  • 参考引用

先上一张gif的k均值聚类算法动态图片,让大家对算法有个感性认识:

python实现聚类算法原理

其中:N=200代表有200个样本,不同的颜色代表不同的簇(其中 3种颜色为3个簇),星星代表每个簇的簇心。算法通过25次迭代找到收敛的簇心,以及对应的簇。 每次迭代的过程中,簇心和对应的簇都在变化。

聚类算法的特点

聚类算法是无监督学习算法和前面的有监督算法不同,训练数据集可以不指定类别(也可以指定)。聚类算法对象归到同一簇中,类似全自动分类。簇内的对象越相似,聚类的效果越好。K-均值聚类是每个类别簇都是采用簇中所含值的均值计算而成。

python实现聚类算法原理

聚类样本间的属性(包括,有序属性、无序属性)度量标准 1. 有序属性

例如:西瓜的甜度:0.1, 0.5, 0.9(值越大,代表越甜)

我们可以使用明可夫斯基距离定义:

python实现聚类算法原理

2. 无序属性

例如:色泽,青绿、浅绿、深绿(又例如: 性别: 男, 女, 中性,人yao…明显也不能使用0.1, 0.2 等表示求距离)。这些不能使用连续的值表示,求距离的,一般使用VDM计算:

python实现聚类算法原理

python实现聚类算法原理

聚类的常见算法,原型聚类(主要论述K均值聚类),层次聚类、密度聚类

聚类算法分为如下三大类:

1. 原型聚类(包含3个子类算法):

K均值聚类算法

学习向量量化

高斯混合聚类

2. 密度聚类:

3. 层次聚类:

下面主要说明K均值聚类算法(示例来源于,周志华西瓜书)

算法基本思想:

K-Means 是发现给定数据集的 K 个簇的聚类算法, 之所以称之为 K-均值 是因为它可以发现 K 个不同的簇,且每个簇的中心采用簇中所含值的均值计算而成.簇个数 K 是用户指定的, 每一个簇通过其质心(centroid), 即簇中所有点的中心来描述.

算法流程如下:

python实现聚类算法原理

主要是三个步骤:

  • 初始化选择K个簇心,假设样本有 m个属性,则相当于k个m为向量
  • 对于k个簇,求离其最近的样本,并划分新的簇
  • 对于每个新的簇,更新簇心的向量(一般可以求簇的样本的属性的均值)
  • 重复2~3直到算法收敛,或者运行了指定的次数

下面给出西瓜书的示例:

西瓜包含下面两个属性,密度以及含糖率,这两个属性构成的二维向量,作为输入向量(具体数据如下表)

python实现聚类算法原理

算法大致过程如下:

python实现聚类算法原理

下图是分类的,每一轮簇心的更新结果,图中横坐标为密度属性,纵坐标为含糖率属性:

python实现聚类算法原理

4. K均值聚类算法的python实现

下面给出K-means cluster算法的实现的大致框架:

class KMeans(object):
  def __init__(self, k, init_vec, max_iter=100):
    """
    :param k:
    :param init_vec: init mean vectors type: k * n array(n properties)
    """
    self._k = k
    self._cluster_vec = init_vec
    self._max_iter = max_iter

  def fit(self, x):
    # 迭代最大次数
    for i in xrange(self._max_iter):
      print 'iteration %s' % i
      # 求每个簇心的簇类
      d_cluster = self._cluster_point(x)
      # 对现有的簇类,更新簇心
      new_center_node = self._reevaluate_center_node(d_cluster)

      # 检测簇心是否变化,判断算法收敛
      if self._check_converge(new_center_node):
        print 'found converge node'
        break
      else:
        self._cluster_vec = new_center_node

  def _cal_distance(self, vec1, vec2):
    return np.linalg.norm(vec1 - vec2)

  def _cluster_point(self, x):
    # 求每个簇心的簇
    pass
    return d_cluster

  def _reevaluate_center_node(self, d_cluster):
    # 对新的簇,求最佳簇心
    return arr_center_node

  def _check_converge(self, vec):
    # 判断簇心是否改变,算法收敛
    return np.array_equal(self._cluster_vec, vec)

具体的算法,以及见本人的github

下面给出程序的运行结果, 由图可见经过三次迭代程序收敛,并且找到最佳节点:

python实现聚类算法原理

下面再给出,另一次运行结果,可见由于初始化点选择不一样,得到的结果也是不一样的,初始点的选择对聚类算法的影响还是很大。

python实现聚类算法原理

K-means实际上是EM算法的一个特例,根据中心点(簇心)决定数据点归属是expectation,而根据构造出来的cluster更新中心(簇心)则是maximization。理解了K-means,也就顺带了解了基本的EM算法思路。

5. 参考引用

参考引用地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
Apr 16 Python
python读写二进制文件的方法
May 09 Python
Python socket网络编程TCP/IP服务器与客户端通信
Jan 05 Python
python并发2之使用asyncio处理并发
Dec 21 Python
TensorFlow实现Batch Normalization
Mar 08 Python
对Python中DataFrame选择某列值为XX的行实例详解
Jan 29 Python
对python 树状嵌套结构的实现思路详解
Aug 09 Python
Pytorch之Variable的用法
Dec 31 Python
pycharm部署、配置anaconda环境的教程
Mar 24 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 Python
如何使用pycharm连接Databricks的步骤详解
Sep 23 Python
使用Python实现音频双通道分离
Dec 25 Python
python web.py开发httpserver解决跨域问题实例解析
Feb 12 #Python
python生成tensorflow输入输出的图像格式的方法
Feb 12 #Python
Flask解决跨域的问题示例代码
Feb 12 #Python
tensorflow实现对图片的读取的示例代码
Feb 12 #Python
python中数据爬虫requests库使用方法详解
Feb 11 #Python
python 接口测试response返回数据对比的方法
Feb 11 #Python
使用Python读取大文件的方法
Feb 11 #Python
You might like
php地址引用(php地址引用的效率问题)
2012/03/23 PHP
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
js charAt的使用示例
2014/02/18 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
iframe里的页面禁止右键事件的方法
2014/06/10 Javascript
JavaScript中判断页面关闭、页面刷新的实现代码
2014/08/27 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
JS JQUERY实现滚动条自动滚到底的方法
2015/01/09 Javascript
PHP+mysql+Highcharts生成饼状图
2015/05/04 Javascript
超级给力的JavaScript的React框架入门教程
2015/07/02 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
Node.js 回调函数实例详解
2017/07/06 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
2017/11/28 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
Layui表格监听行单双击事件讲解
2019/11/14 Javascript
基于vue-cli3创建libs库的实现方法
2019/12/04 Javascript
vue将文件/图片批量打包下载zip的教程
2020/10/21 Javascript
[06:57]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD 选手采访
2021/03/11 DOTA
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
线程同步的方法
2016/11/23 面试题
工程管理专业毕业生自荐信
2014/01/24 职场文书
业务内勤岗位职责
2014/04/30 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android