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 将字符串转换成字典dict
Mar 24 Python
简单的Python的curses库使用教程
Apr 11 Python
Python验证企业工商注册码
Oct 25 Python
浅述python中argsort()函数的实例用法
Mar 30 Python
Python查找第n个子串的技巧分享
Jun 27 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
Python迭代器iterator生成器generator使用解析
Oct 24 Python
python实发邮件实例详解
Nov 11 Python
Python如何使用argparse模块处理命令行参数
Dec 11 Python
Python csv文件记录流程代码解析
Jul 16 Python
Python pandas对excel的操作实现示例
Jul 21 Python
Python模拟登录和登录跳转的参考示例
Oct 30 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和ACCESS写聊天室(八)
2006/10/09 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
使用phpQuery获取数组的实例
2017/03/13 PHP
js获取变量
2006/08/24 Javascript
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
jQuery图片的展开和收缩实现代码
2013/04/16 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
javascript中encodeURI和decodeURI方法使用介绍
2013/05/06 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
2017/09/02 Javascript
jQuery实现滚动效果
2017/11/17 jQuery
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
Python使用poplib模块和smtplib模块收发电子邮件的教程
2016/07/02 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
HTML5里autofocus自动聚焦属性使用介绍
2016/06/22 HTML / CSS
JD Sports瑞典:英国领先的运动时尚商店
2018/01/28 全球购物
软件工程师岗位职责
2013/11/16 职场文书
护理工作感言
2014/01/16 职场文书
《画风》教学反思
2014/04/16 职场文书
团日活动总结书格式
2014/05/08 职场文书
观看信仰心得体会
2014/09/04 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书
找规律教学反思
2016/02/23 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
Python源码解析之List
2021/05/21 Python
MySQL的Query Cache图文详解
2021/07/01 MySQL
Python编程源码报错解决方法总结经验分享
2021/10/05 Python