python kmeans聚类简单介绍和实现代码


Posted in Python onFebruary 23, 2018

一、k均值聚类的简单介绍

假设样本分为c类,每个类均存在一个中心点,通过随机生成c个中心点进行迭代,计算每个样本点到类中心的距离(可以自定义、常用的是欧式距离)  

将该样本点归入到最短距离所在的类,重新计算聚类中心,进行下次的重新划分样本,最终类中心不改变时,聚类完成   

二、伪代码  

三、python代码实现  

#!/usr/bin/env python 
# coding=utf-8 
 
import numpy as np 
import random 
import matplotlib.pyplot as plt 
 
#data:numpy.array dataset 
#k the number of cluster 
def k_means(data,k): 
   
  #random generate cluster_center 
  sample_num=data.shape[0] 
  center_index=random.sample(range(sample_num),k) 
  cluster_cen=data[center_index,:] 
 
  is_change=1 
  cat=np.zeros(sample_num) 
   
 
  while is_change: 
    is_change=0 
 
    for i in range(sample_num): 
      min_distance=100000 
      min_index=0 
 
      for j in range(k): 
        sub_data=data[i,:]-cluster_cen[j,:] 
        distance=np.inner(sub_data,sub_data) 
        if distance<min_distance: 
          min_distance=distance 
          min_index=j+1 
 
      if cat[i]!=min_index: 
        is_change=1 
        cat[i]=min_index 
    for j in range(k): 
      cluster_cen[j]=np.mean(data[cat==(j+1)],axis=0) 
 
  return cat,cluster_cen 
 
 
if __name__=='__main__': 
 
  #generate data 
  cov=[[1,0],[0,1]] 
  mean1=[1,-1] 
  x1=np.random.multivariate_normal(mean1,cov,200) 
 
  mean2=[5.5,-4.5] 
  x2=np.random.multivariate_normal(mean2,cov,200) 
 
  mean3=[1,4] 
  x3=np.random.multivariate_normal(mean3,cov,200) 
 
  mean4=[6,4.5] 
  x4=np.random.multivariate_normal(mean4,cov,200) 
 
  mean5=[9,0.0] 
  x5=np.random.multivariate_normal(mean5,cov,200) 
   
  X=np.vstack((x1,x2,x3,x4,x5)) 
   
  #data distribution 
  fig1=plt.figure(1) 
  p1=plt.scatter(x1[:,0],x1[:,1],marker='o',color='r',label='x1') 
  p2=plt.scatter(x2[:,0],x2[:,1],marker='+',color='m',label='x2') 
  p3=plt.scatter(x3[:,0],x3[:,1],marker='x',color='b',label='x3') 
  p4=plt.scatter(x4[:,0],x4[:,1],marker='*',color='g',label='x4') 
  p5=plt.scatter(x5[:,0],x4[:,1],marker='+',color='y',label='x5') 
  plt.title('original data') 
  plt.legend(loc='upper right') 
   
  cat,cluster_cen=k_means(X,5)    
 
  print 'the number of cluster 1:',sum(cat==1) 
  print 'the number of cluster 2:',sum(cat==2) 
  print 'the number of cluster 3:',sum(cat==3) 
  print 'the number of cluster 4:',sum(cat==4) 
  print 'the number of cluster 5:',sum(cat==5) 
 
   
  fig2=plt.figure(2) 
  for i,m,lo,label in zip(range(5),['o','+','x','*','+'],['r','m','b','g','y'],['x1','x2','x3','x4','x5']): 
 
    p=plt.scatter(X[cat==(i+1),0],X[cat==(i+1),1],marker=m,color=lo,label=label) 
  plt.legend(loc='upper right') 
  plt.title('the clustering result') 
  plt.show()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 实现归并排序算法
Jun 05 Python
Python获取apk文件URL地址实例
Nov 01 Python
Python读取sqlite数据库文件的方法分析
Aug 07 Python
Python读取YUV文件,并显示的方法
Dec 04 Python
python 检查是否为中文字符串的方法
Dec 28 Python
对PyQt5中树结构的实现方法详解
Jun 17 Python
pyhton中__pycache__文件夹的产生与作用详解
Nov 24 Python
python代码区分大小写吗
Jun 17 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 Python
Python实现手势识别
Oct 21 Python
基于注解实现 SpringBoot 接口防刷的方法
Mar 02 Python
OpenCV-Python实现人脸美白算法的实例
Jun 11 Python
python MysqlDb模块安装及其使用详解
Feb 23 #Python
Python实现k-means算法
Feb 23 #Python
python语言中with as的用法使用详解
Feb 23 #Python
python实现定时自动备份文件到其他主机的实例代码
Feb 23 #Python
Python机器学习算法之k均值聚类(k-means)
Feb 23 #Python
python3调用R的示例代码
Feb 23 #Python
python中kmeans聚类实现代码
Feb 23 #Python
You might like
写一个用户在线显示的程序
2006/10/09 PHP
PHP远程连接MYSQL数据库非常慢的解决方法
2008/07/05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
php实现文本数据导入SQL SERVER
2015/05/17 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
js正确获取元素样式详解
2009/08/07 Javascript
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
给ListBox添加双击事件示例代码
2013/12/02 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
jquery实现input框获取焦点的简单实例
2017/01/26 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
JS动画实现回调地狱promise的实例代码详解
2018/11/08 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
vue setInterval 定时器失效的解决方式
2020/07/30 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
js实现扫雷源代码
2020/11/27 Javascript
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
在Python的循环体中使用else语句的方法
2015/03/30 Python
进一步了解Python中的XML 工具
2015/04/13 Python
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
python爬取各类文档方法归类汇总
2018/03/22 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL