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 23 Python
python简单实现基数排序算法
May 16 Python
由浅入深讲解python中的yield与generator
Apr 05 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
详解python列表生成式和列表生成式器区别
Mar 27 Python
Python当中的array数组对象实例详解
Jun 12 Python
python3.6+django2.0+mysql搭建网站过程详解
Jul 24 Python
Python常用数据类型之间的转换总结
Sep 06 Python
Python包和模块的分发详细介绍
Jun 19 Python
Python Socket编程详解
Apr 25 Python
详解Python魔法方法之描述符类
May 26 Python
pytorch Dropout过拟合的操作
May 27 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
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
2013/05/27 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
2016/03/16 Javascript
JS中的进制转换以及作用
2016/06/26 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
element上传组件循环引用及简单时间倒计时的实现
2018/10/01 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
JavaScript变量作用域及内存问题实例分析
2019/06/10 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
如何使用python爬虫爬取要登陆的网站
2019/07/12 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
python中class的定义及使用教程
2019/09/18 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
信息管理应届生求职信
2014/03/07 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
公务员年度考核评语
2014/12/31 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript
源码分析Redis中 set 和 sorted set 的使用方法
2022/03/22 Redis