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实现简单温度转换的方法
Mar 13 Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
python处理Excel xlrd的简单使用
Sep 12 Python
python把数组中的数字每行打印3个并保存在文档中的方法
Jul 17 Python
详解Python并发编程之从性能角度来初探并发编程
Aug 23 Python
Python高级property属性用法实例分析
Nov 19 Python
使用pytorch和torchtext进行文本分类的实例
Jan 08 Python
如何在mac版pycharm选择python版本
Jul 21 Python
Pytest如何使用skip跳过执行测试
Aug 13 Python
python 下载文件的多种方法汇总
Nov 17 Python
Python OpenCV中的numpy与图像类型转换操作
Dec 11 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
dedecms中常见问题修改方法总结
2007/03/21 PHP
实用PHP会员权限控制实现原理分析
2011/05/29 PHP
PHP Directory 函数的详解
2013/03/07 PHP
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
php比较两个字符串长度的方法
2015/07/13 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
无需数据库在线投票调查php代码
2016/07/20 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
JS输入用户名自动显示邮箱后缀列表的方法
2015/01/27 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
JS中去掉array中重复元素的方法
2017/05/26 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
Vue DevTools调试工具的使用
2017/12/05 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
vuex入门最详细整理
2020/03/04 Javascript
js中forEach,for in,for of循环的用法示例小结
2020/03/14 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
python比较两个列表是否相等的方法
2015/07/28 Python
用Python解决计数原理问题的方法
2016/08/04 Python
python图像和办公文档处理总结
2019/05/28 Python
python的debug实用工具 pdb详解
2019/07/12 Python
PyCharm更改字体和界面样式的方法步骤
2019/09/27 Python
Python内置类型性能分析过程实例
2020/01/29 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
营业员实习自我鉴定
2013/12/07 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
授权委托书
2014/07/31 职场文书
合伙经营协议书范本
2014/09/13 职场文书
质量整改通知单
2015/04/21 职场文书
辅导员学期工作总结
2015/08/14 职场文书