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实现QQ游戏大家来找茬辅助工具
Sep 14 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 Python
浅述python2与python3的简单区别
Sep 19 Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 Python
Python使用指定端口进行http请求的例子
Jul 25 Python
详解python中自定义超时异常的几种方法
Jul 29 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
Nov 27 Python
dpn网络的pytorch实现方式
Jan 14 Python
使用Puppeteer爬取微信文章的实现
Feb 11 Python
Scrapy框架介绍之Puppeteer渲染的使用
Jun 19 Python
Python 如何实现访问者模式
Jul 28 Python
Python 统计序列中元素的出现频度
Apr 26 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调用三种数据库的方法(1)
2006/10/09 PHP
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
浅谈JavaScript function函数种类
2014/12/29 Javascript
JS解析XML实例分析
2015/01/30 Javascript
Jquery实现简单的轮播效果(代码管用)
2016/03/14 Javascript
Angular路由简单学习
2016/12/26 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
2020/03/25 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
运动会致辞稿50字
2014/02/04 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
银行服务明星推荐材料
2014/05/29 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
红色经典观后感
2015/06/18 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
基于Redis位图实现用户签到功能
2021/05/08 Redis
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
Django框架中模型的用法
2022/06/10 Python