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使用nntp读取新闻组内容的方法
May 08 Python
python实现的用于搜索文件并进行内容替换的类实例
Jun 28 Python
python 创建弹出式菜单的实现代码
Jul 11 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
May 24 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
Jul 16 Python
Python实现打砖块小游戏代码实例
May 18 Python
解决pycharm remote deployment 配置的问题
Jun 27 Python
python自带tkinter库实现棋盘覆盖图形界面
Jul 17 Python
python多线程分块读取文件
Aug 29 Python
python实现文件批量编码转换及注意事项
Oct 14 Python
python设置中文界面实例方法
Oct 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
检查用户名是否已在mysql中存在的php写法
2014/01/20 PHP
javascript 原型继承介绍
2011/08/30 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
jquery验证邮箱格式并显示提交按钮
2015/11/07 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
2019/05/15 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
Python字符串处理之count()方法的使用
2015/05/18 Python
python字符串的常用操作方法小结
2016/05/21 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
Python调用C语言的实现
2019/07/26 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
纯CSS3实现3D旋转书本效果
2016/03/21 HTML / CSS
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
CSS+jQuery实现的在线答题功能
2015/04/25 HTML / CSS
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
数据库测试通常都包括哪些方面
2015/11/30 面试题
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-> (一千零一拾一元整)输出
2015/05/29 面试题
灵泰克Java笔试题
2016/01/09 面试题
自我鉴定写作要点
2014/01/17 职场文书
校园活动策划方案
2014/06/13 职场文书
关爱残疾人标语
2014/06/25 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
2014年科室工作总结
2014/11/20 职场文书
2015年导购员工作总结
2015/04/25 职场文书
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫
《极主夫道》真人电影正式预告 定档6月3日上映
2022/04/05 日漫