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使用urllib2模块获取gravatar头像实例
Dec 18 Python
使用python分析git log日志示例
Feb 27 Python
深入讲解Python编程中的字符串
Oct 14 Python
python结合shell查询google关键词排名的实现代码
Feb 27 Python
对python sklearn one-hot编码详解
Jul 10 Python
利用python修改json文件的value方法
Dec 31 Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 Python
python中调试或排错的五种方法示例
Sep 12 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
Oct 12 Python
python DataFrame转dict字典过程详解
Dec 26 Python
如何用用Python将地址标记在地图上
Feb 07 Python
python 开心网和豆瓣日记爬取的小爬虫
May 29 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数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
PHP实现批量修改文件名的方法示例
2019/09/18 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
浅谈angularjs依赖服务注入写法的注意点
2017/04/24 Javascript
详解vue-cli 脚手架项目-package.json
2017/07/04 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
2018/11/09 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
python对于requests的封装方法详解
2019/01/03 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
三维科技面试题
2013/07/27 面试题
大学生涯自我鉴定
2014/01/16 职场文书
高中生物教学反思
2014/02/05 职场文书
电气工程自动化求职信
2014/03/14 职场文书
保险公司早会主持词
2014/03/22 职场文书
庆元旦活动总结
2014/07/09 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
幼师求职自荐信
2015/03/26 职场文书
幼儿园辞职信
2015/05/13 职场文书
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
2021/12/06 MySQL