k-means 聚类算法与Python实现代码


Posted in Python onJune 01, 2020

k-means 聚类算法思想先随机选择k个聚类中心,把集合里的元素与最近的聚类中心聚为一类,得到一次聚类,再把每一个类的均值作为新的聚类中心重新聚类,迭代n次得到最终结果分步解析

一、初始化聚类中心

首先随机选择集合里的一个元素作为第一个聚类中心放入容器,选择距离第一个聚类中心最远的一个元素作为第二个聚类中心放入容器,第三、四、、、N个同理,为了优化可以选择距离开方做为评判标准

二、迭代聚类

依次把集合里的元素与距离最近的聚类中心分为一类,放到对应该聚类中心的新的容器,一次聚类完成后求出新容器里个类的均值,对该类对应的聚类中心进行更新,再次进行聚类操作,迭代n次得到理想的结果

三、可视化展示

利用 python 第三方库中的可视化工具 matplotlib.pyplot 对聚类后的元素显示(散点图),方便查看结果

python代码实现

import numpy as np
import matplotlib.pyplot as plt

# 两点距离
def distance(e1, e2):
  return np.sqrt((e1[0]-e2[0])**2+(e1[1]-e2[1])**2)

# 集合中心
def means(arr):
  return np.array([np.mean([e[0] for e in arr]), np.mean([e[1] for e in arr])])

# arr中距离a最远的元素,用于初始化聚类中心
def farthest(k_arr, arr):
  f = [0, 0]
  max_d = 0
  for e in arr:
    d = 0
    for i in range(k_arr.__len__()):
      d = d + np.sqrt(distance(k_arr[i], e))
    if d > max_d:
      max_d = d
      f = e
  return f

# arr中距离a最近的元素,用于聚类
def closest(a, arr):
  c = arr[1]
  min_d = distance(a, arr[1])
  arr = arr[1:]
  for e in arr:
    d = distance(a, e)
    if d < min_d:
      min_d = d
      c = e
  return c


if __name__=="__main__":
  ## 生成二维随机坐标(如果有数据集就更好)
  arr = np.random.randint(100, size=(100, 1, 2))[:, 0, :]

  ## 初始化聚类中心和聚类容器
  m = 5
  r = np.random.randint(arr.__len__() - 1)
  k_arr = np.array([arr[r]])
  cla_arr = [[]]
  for i in range(m-1):
    k = farthest(k_arr, arr)
    k_arr = np.concatenate([k_arr, np.array([k])])
    cla_arr.append([])

  ## 迭代聚类
  n = 20
  cla_temp = cla_arr
  for i in range(n):  # 迭代n次
    for e in arr:  # 把集合里每一个元素聚到最近的类
      ki = 0    # 假定距离第一个中心最近
      min_d = distance(e, k_arr[ki])
      for j in range(1, k_arr.__len__()):
        if distance(e, k_arr[j]) < min_d:  # 找到更近的聚类中心
          min_d = distance(e, k_arr[j])
          ki = j
      cla_temp[ki].append(e)
    # 迭代更新聚类中心
    for k in range(k_arr.__len__()):
      if n - 1 == i:
        break
      k_arr[k] = means(cla_temp[k])
      cla_temp[k] = []

  ## 可视化展示
  col = ['HotPink', 'Aqua', 'Chartreuse', 'yellow', 'LightSalmon']
  for i in range(m):
    plt.scatter(k_arr[i][0], k_arr[i][1], linewidth=10, color=col[i])
    plt.scatter([e[0] for e in cla_temp[i]], [e[1] for e in cla_temp[i]], color=col[i])
  plt.show()

结果展示

k-means 聚类算法与Python实现代码

总结

到此这篇关于k-means 聚类算法与Python实现代码的文章就介绍到这了,更多相关k-means 聚类算法python内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
调试Python程序代码的几种方法总结
Apr 28 Python
详解Django中的权限和组以及消息
Jul 23 Python
Python3实现的字典遍历操作详解
Apr 18 Python
python主线程捕获子线程的方法
Jun 17 Python
Python面向对象之接口、抽象类与多态详解
Aug 27 Python
Python 实现Windows开机运行某软件的方法
Oct 14 Python
Numpy 中的矩阵求逆实例
Aug 26 Python
Selenium及python实现滚动操作多种方法
Jul 21 Python
python selenium 获取接口数据的实现
Dec 07 Python
Django+Django-Celery+Celery的整合实战
Jan 20 Python
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
Apr 27 Python
Python 中的单分派泛函数你真的了解吗
Jun 22 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 #Python
python如何写出表白程序
Jun 01 #Python
python中os包的用法
Jun 01 #Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 #Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 #Python
浅谈pycharm导入pandas包遇到的问题及解决
Jun 01 #Python
python实现密码验证合格程序的思路详解
Jun 01 #Python
You might like
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
php 删除cookie方法详解
2014/12/01 PHP
php获取发送给用户的header信息的方法
2015/03/16 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
javascript parseInt 函数分析(转)
2009/03/21 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
一道关于JavaScript变量作用域的面试题
2016/03/08 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
分析javascript原型及原型链
2018/03/18 Javascript
Koa项目搭建过程详细记录
2018/04/12 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
[01:15:15]VG VS EG Supermajor小组赛B组胜者组第一轮 BO3第二场 6.2
2018/06/03 DOTA
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
python控制台显示时钟的示例
2014/02/24 Python
python运行时间的几种方法
2016/06/17 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
2019/01/08 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
python对Excel的读取的示例代码
2020/02/14 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
2020/06/17 Python
Python操作dict时避免出现KeyError的几种解决方法
2020/09/20 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
老公给老婆的道歉信
2014/01/10 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
秋季运动会加油词
2015/07/18 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
php修改word的实例方法
2021/11/17 PHP
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android