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 相关文章推荐
wxPython中文教程入门实例
Jun 09 Python
使用py2exe在Windows下将Python程序转为exe文件
Mar 04 Python
解读! Python在人工智能中的作用
Nov 14 Python
Python2.7 实现引入自己写的类方法
Apr 29 Python
Sanic框架请求与响应实例分析
Jul 16 Python
python调用并链接MATLAB脚本详解
Jul 05 Python
Python函数中的可变长参数详解
Sep 12 Python
基于Python实现拆分和合并GIF动态图
Oct 22 Python
python中time库的实例使用方法
Oct 31 Python
Python matplotlib实时画图案例
Apr 23 Python
Python函数参数分类原理详解
May 28 Python
python如何建立全零数组
Jul 19 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
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
ECMAScript6函数默认参数
2015/06/12 Javascript
javascript下拉列表菜单的实现方法
2015/11/18 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
2016/09/15 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
2016/11/24 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
node.js基础知识小结
2018/02/26 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
利用python爬取散文网的文章实例教程
2017/06/18 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
python交易记录整合交易类详解
2019/07/03 Python
python多线程同步之文件读写控制
2021/02/25 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
员工考核管理制度
2014/02/02 职场文书
生日礼品店创业计划书范文
2014/03/21 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
七一活动主持词
2015/06/29 职场文书
大学生军训感言
2015/08/01 职场文书
小学体育组工作总结
2015/08/13 职场文书