K-MEANS算法是一种经典的聚类算法,在模式识别得到了广泛的应用。算法中有两个关键问题需要考虑:一是如何评价对象的相似性,通常用距离来度量,距离越近越相似;另外一个是如何评价聚类的效果,通常采用误差平方和函数来作为评价准则。

算法过程:

输入:簇的数目K和包含n个对象的数据库。

输出:K个簇,使平方误差和最小

算法步骤:

(1):为每个聚类确定一个初始聚类中心,这样就有K个初始聚类中心

(2:将样本集中的样本按照最小距离原则分配到最邻近聚类

(3);使用每个聚类中的样本均值作为新的聚类中心

(4):重复步骤(2)和(3),直到聚类中心不在变化

(5):结束,得到K个聚类

流程图

代码实现

 import numpy
import random
import codecs
import copy
import re
import matplotlib.pyplot as plt
#其次计算向量vecl和向量vec2之间的欧式距离
def calcuDistance(vec1,vec2):
return numpy.sqrt(numpy.sum(numpy.square(vec1-vec2)))
#载入数据测试数据集,数据由文本保存,为二维坐标
def loadDataSet():
inFile = "F:/testSet.txt" #数据集文件
inDate = codecs.open(inFile,'r','utf-8').readlines()
dataSet = list()
for line in inDate:
line = line.strip()
strList = re.split('[ ]+',line) #删除多余的空格
#print strList[0] ,strList[1]
numList = list()
for item in strList:
num = float(item)
numList.append(num) dataSet.append(numList)
return dataSet #初始化K个聚类中心,随机获取
def initCentroids(dataSet,k):
return random.sample(dataSet,k)#从dataSe中随机获取K个数据项返回
#对每个属于dataSet的item,计算item与centrodList中K个聚类中心的欧式距离,找出
#距离最小的,并将item加入相应的簇中
def minDistance(dataSet,centroidList):
clusterDict = dict() #用dict来保存聚类的结果
for item in dataSet:
vec1 = numpy.array(item) #转换成array形式
flag = 0 #簇分类标记,记录与相应的簇距离最近的那个簇
minDis = float("inf") #初始化为最大值
for i in range(len(centroidList)):
vec2 = numpy.array(centroidList[i])
distance = calcuDistance(vec1,vec2) #计算相应的欧拉距离
if distance < minDis:
minDis = distance
flag = i #循环结束时,flag保存的是与当前item距离最近的那个簇标记
if flag not in clusterDict.keys():#簇标记不存在,进行初始化
clusterDict[flag] = list()
clusterDict[flag].append(item) #加入相应的类别中
return clusterDict #计算每列的均值,即找到聚类中心
def getCentroids(clusterDict):
#得到K个质心
centroidList = list()
for key in clusterDict.keys():
centroid = numpy.mean(numpy.array(clusterDict[key]),axis=0)
centroidList.append(centroid)
return numpy.array(centroidList).tolist()
#计算簇集合间的均方误差,将簇类中各个向量与质心的距离进行累加求和
def getVar(clusterDict,centroidList):
sum = 0.0
for key in clusterDict.keys():
vec1 = numpy.array(centroidList[key])
distance = 0.0
for item in clusterDict[key]:
vec2 = numpy.array(item)
distance += calcuDistance(vec1,vec2)
sum += distance
return sum #展示聚类结果
def showCluster(centroidList,clusterDict):
colorMark = ['or','ob','og','ok','oy','ow']
#不同簇类的标记,'or'-->'o'代表圆形,’r'代表red,‘b’:blue
centroidMark = ['dr','db','dg','dk','dy','dw'] #簇类中心标记同上‘d’代表菱形
for key in clusterDict.keys():#画簇类中心点
plt.plot(centroidList[key][0],centroidList[key][1],centroidMark[key],markersize=12)
for item in clusterDict[key]:
plt.plot(item[0],item[1],colorMark[key])#画簇类下的点
plt.show() if __name__=='__main__':
# inFile = "F:/testSet.txt" #数据集文件
dataSet = loadDataSet() #载入数据集
centroidList = initCentroids(dataSet,4) #初始化质心,设置K=4
clusterDict = minDistance(dataSet,centroidList) #第一次聚类迭代
newVar = getVar(clusterDict,centroidList) #获得均方误差值,通过新旧均方误差来获得迭代终止条件
oldVar = -0.0001 #旧均方误差值初始化为-1
print("------第一次迭代------")
print( )
print("簇类")
for key in clusterDict.keys():
print(key,'---->',clusterDict[key])
print("K个均值向量:",centroidList)
print("平方均方误差:",newVar)
print( )
showCluster(centroidList,clusterDict) #展示聚类结果
k = 2
while abs(newVar-oldVar) >= 0.0001: #当两次聚类结果小于0.0001时,迭代结束
centroidList = getCentroids(clusterDict) #获得新的质心
clusterDict = minDistance(dataSet,centroidList) #新的聚类结果
oldVar = newVar
newVar = getVar(clusterDict,centroidList)
print("----第%d次迭代结果--------" %k)
print( )
print("簇类")
for key in clusterDict.keys():
print(key, '---->', clusterDict[key])
print("K个均值向量:", centroidList)
print("平方均方误差:", newVar)
print()
showCluster(centroidList, clusterDict) # 展示聚类结果
k += 1

目前,对于聚类算法的理解还不是很深刻。正在慢慢探索中。

K-means算法的实现的更多相关文章

  1. java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现

    java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...

  2. C++基础代码--20余种数据结构和算法的实现

    C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...

  3. Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

    Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...

  4. 图像数据到网格数据-2——改进的SMC算法的实现

    概要 本篇接上一篇继续介绍网格生成算法,同时不少内容继承自上篇.上篇介绍了经典的三维图像网格生成算法MarchingCubes,并且基于其思想和三角形表实现了对样例数据的网格构建.本篇继续探讨网格生成 ...

  5. Bug2算法的实现(RobotBASIC环境中仿真)

    移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...

  6. Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...

  7. SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)

    在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...

  8. 详解Linux内核红黑树算法的实现

    转自:https://blog.csdn.net/npy_lp/article/details/7420689 内核源码:linux-2.6.38.8.tar.bz2 关于二叉查找树的概念请参考博文& ...

  9. 详细MATLAB 中BP神经网络算法的实现

    MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤   这里 ...

  10. Python学习(三) 八大排序算法的实现(下)

    本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过 ...

随机推荐

  1. kafka 消息系统

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  2. 【Selenium-WebDriver自学】Log4J的设置(十五)

    ==================================================================================================== ...

  3. spring事务传播实现源码分析

    转载. https://blog.csdn.net/qpfjalzm123/article/details/83717367 本文只是对spring事务传播实现的流程进行简单的分析,如有不对之处请指出 ...

  4. android开发 写一个自定义形状的按键

    步骤: 1.在drawable 文件夹中创建一个xml布局文件. 2.修改布局文件 3.在需要使用背景的按键中导入布局. 创建布局文件: 修改布局文件: <?xml version=" ...

  5. gentoo kvm qemu virt-manager - Unable to complete install: error creating macvtap interface macvtap0@: Operation not supported'

    碰到这个一般是内核没有开启相应的 macvtap 选项,开启相应选项后,就不会报错了. Device Drivers ---> Network Device Support ---> &l ...

  6. 正则表达式-使用说明Regular Expression How To (Perl, Python, etc)

    notepad++ wiki about regular expression 正则表达式-使用说明Regular Expression How To (Perl, Python, etc) http ...

  7. nginx 服务器常见配置以及负载均衡

    # 配置启动用户,用户权限不够会出现访问 403 的情况 user root; # 启动多少个工作进程 worker_processes 1; # 错误日志文件进程文件的保存地址 error_log ...

  8. php有效防止同一用户多次登录

    PHP实现同一个帐号不允许多人同时重复登陆 数据库表 user_login_info字段:id,user_ip,user_id,last_access_timeuser_id 做唯一性索引1. 用户登 ...

  9. Java快速开发平台,JEECG 3.7.6性能增强版本发布

    JEECG 3.7.6 性能增强版本发布 导读       ⊙Vue SPA单页面应用 ⊙Datagrid标签实现不同风格切换,支持BootstrapTable.EasyUI ⊙灵活通用代码生成器工厂 ...

  10. Zookpeer集群节点

    Adaptive Communication Environment(自适配通信环境),简称ACE. reference artfile:zookeeper单节点与集群的安装https://blog. ...