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 相关文章推荐
在Django中使用Sitemap的方法讲解
Jul 22 Python
Python出现segfault错误解决方法
Apr 16 Python
Python绘制3D图形
May 03 Python
python通过zabbix api获取主机
Sep 17 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
Oct 15 Python
Django restframework 源码分析之认证详解
Feb 22 Python
浅谈Django中view对数据库的调用方法
Jul 18 Python
Python 一键获取百度网盘提取码的方法
Aug 01 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
Oct 06 Python
python的列表List求均值和中位数实例
Mar 03 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
Mar 12 Python
OpenCV-Python 实现两张图片自动拼接成全景图
Jun 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
傻瓜化配置PHP环境――Appserv
2006/12/13 PHP
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
一组PHP可逆加密解密算法实例代码
2014/01/21 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
2015/07/01 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
JS常用函数使用指南
2014/11/23 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
JavaScript对象学习小结
2015/09/02 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
2017/01/06 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
微信小程序自定义导航隐藏和显示功能
2017/06/13 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
详解Python文本操作相关模块
2017/06/22 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
Python生成器常见问题及解决方案
2020/03/21 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
企业宣传方案
2014/03/04 职场文书
教师网络培训感言
2014/03/09 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
谢师宴答谢词
2015/01/05 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS
进阶篇之linux环境下安装MySQL数据库
2022/04/09 MySQL
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL