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 相关文章推荐
部署Python的框架下的web app的详细教程
Apr 30 Python
详解Python中break语句的用法
May 14 Python
使用python实现省市三级菜单效果
Jan 20 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
Python+OpenCV目标跟踪实现基本的运动检测
Jul 10 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
使用WingPro 7 设置Python路径的方法
Jul 24 Python
python实现代码统计程序
Sep 19 Python
Python2与Python3的区别点整理
Dec 12 Python
keras 读取多标签图像数据方式
Jun 12 Python
详解anaconda离线安装pytorchGPU版
Sep 08 Python
如何在windows下安装配置python工具Ulipad
Oct 27 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 error_log 函数的使用
2009/04/13 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
2013/04/25 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
php中filter_input函数用法分析
2014/11/15 PHP
PHP实现生成唯一会员卡号
2015/08/24 PHP
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
js浮点数精确计算(加、减、乘、除)
2013/12/26 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
jQuery操作属性和样式详解
2016/04/13 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
Vue源码解析之Template转化为AST的实现方法
2018/12/14 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
python中requests和https使用简单示例
2018/01/18 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
Python通用函数实现数组计算的方法
2019/06/13 Python
python中Array和DataFrame相互转换的实例讲解
2021/02/03 Python
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
法律专业学生的自我评价
2014/02/07 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
国际商务专业毕业生自我鉴定2014
2014/09/27 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
工作试用期自我评价
2015/03/10 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
Python基础详解之描述符
2021/04/28 Python
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis