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 文件处理注意事项总结
Apr 10 Python
Python中shape计算矩阵的方法示例
Apr 21 Python
Django原生sql也能使用Paginator分页的示例代码
Nov 15 Python
python删除不需要的python文件方法
Apr 24 Python
python 寻找list中最大元素对应的索引方法
Jun 28 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
Nov 15 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
Nov 19 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
解决django的template中如果无法引用MEDIA_URL问题
Apr 07 Python
使用Python实现批量ping操作方法
May 06 Python
Python脚本实现Zabbix多行日志监控过程解析
Aug 26 Python
如何使用Python实现一个简易的ORM模型
May 12 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 求质素(素数) 的实现代码
2011/04/12 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
sae使用smarty模板的方法
2013/12/17 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
PHP实现上传文件并存进数据库的方法
2015/07/16 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
jquery购物车实时结算特效实现思路
2013/09/23 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
alert出数组中的随即值代码
2014/09/25 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
2015/03/06 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
全面了解javascript中的错误处理机制
2016/07/18 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
vue-cli扩展多模块打包的示例代码
2018/04/09 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
[53:50]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
用python获取txt文件中关键字的数量
2020/12/24 Python
英国巧克力贸易公司:Chocolate Trading Company
2017/03/21 全球购物
高级运动鞋:GREATS
2019/07/19 全球购物
英国排名第一的餐具品牌:Denby Pottery
2019/11/01 全球购物
《学棋》教后反思
2014/04/14 职场文书
死亡证明书样本说明
2014/10/18 职场文书
家长高考寄语
2015/02/27 职场文书
高校自主招生校长推荐信
2015/03/23 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书