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实现个性化词云的方法
Jun 16 Python
对python3 urllib包与http包的使用详解
May 10 Python
python中break、continue 、exit() 、pass终止循环的区别详解
Jul 08 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
python高阶函数map()和reduce()实例解析
Mar 16 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
Jun 23 Python
Python selenium模块实现定位过程解析
Jul 09 Python
基于Python中Remove函数的用法讨论
Dec 11 Python
python 对xml解析的示例
Feb 27 Python
Django开发RESTful API实现增删改查(入门级)
May 10 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 Python
浅谈Python从全局与局部变量到装饰器的相关知识
Jun 21 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中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
php array_slice 取出数组中的一段序列实例
2016/11/04 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
通用JS事件写法实现代码
2009/01/07 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
js实现网页自动刷新可制作节日倒计时效果
2014/05/27 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
python进阶教程之动态类型详解
2014/08/30 Python
跟老齐学Python之正规地说一句话
2014/09/28 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
Python随机数用法实例详解【基于random模块】
2017/04/18 Python
python3实现跳一跳点击跳跃
2018/01/08 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
python排序函数sort()与sorted()的区别
2018/09/18 Python
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
迟到检讨书大全
2014/01/25 职场文书
《这儿真好》教学反思
2014/02/22 职场文书
80后职场人的职业生涯规划
2014/03/08 职场文书
企业文明单位申报材料
2014/05/16 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
授权委托书协议书
2014/10/16 职场文书
中学生检讨书1000字
2014/10/28 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电
springboot+rabbitmq实现智能家居实例详解
2022/07/23 Java/Android