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中使用HTML模版的教程
Apr 29 Python
使用Python程序抓取新浪在国内的所有IP的教程
May 04 Python
Python pymongo模块常用操作分析
Sep 01 Python
Python实现的KMeans聚类算法实例分析
Dec 29 Python
python中p-value的实现方式
Dec 16 Python
Python os模块常用方法和属性总结
Feb 20 Python
Django 5种类型Session使用方法解析
Apr 29 Python
python 解决Fatal error in launcher:错误问题
May 21 Python
python爬虫构建代理ip池抓取数据库的示例代码
Sep 22 Python
python基于exchange函数发送邮件过程详解
Nov 06 Python
python温度转换华氏温度实现代码
Dec 06 Python
学会迭代器设计模式,帮你大幅提升python性能
Jan 03 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性能优化工具篇Benchmark类调试执行时间
2011/12/06 PHP
PHP中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
2019/04/10 PHP
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
JavaScript Date对象使用总结
2009/05/14 Javascript
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
VUE多层路由嵌套实现代码
2017/05/15 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
Vue学习笔记之表单输入控件绑定
2017/09/05 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
Python实现在线程里运行scrapy的方法
2015/04/07 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
python中常用的九种预处理方法分享
2016/09/11 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
Python 抓取微信公众号账号信息的方法
2019/06/14 Python
一文读懂Python 枚举
2020/08/25 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
CSS3 制作绽放的莲花采用效果叠加实现
2013/01/31 HTML / CSS
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
销售会计岗位职责
2014/03/15 职场文书
大二学习计划书范文
2014/04/27 职场文书
入党个人总结范文
2015/03/02 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书
单位病假条范文
2015/08/17 职场文书