Kmeans
来源:互联网 发布:数据管控流程 编辑:程序博客网 时间:2024/06/06 04:39
参考了N篇博客和机器学习实战写出来这个。
1.关于分类和聚类:
共同点是都是对数据进行分类。不同点:分类是事先知道分类数据具有哪些类型(特点、属性),然后对数据进行归类。聚类的已知信息只有数据,然后根据对数据的特点、属性将数据分出类别。
2.Kmeans:
(1)Kmeans算法原理:
初始条件:给出数据和**指定的K值**,K值是指这些数据需要分出多少类,**这里的类也被叫做簇**。 分类的依据:根据数据之间的相似程度,一般来说是把**数据点之间的距离大小作为数据间的相似程度**。
算法思想:选择K个点作为初始质心 repeat 将每个点指派到最近的质心,形成K个簇 重新计算每个簇的质心 until 簇不发生变化或达到最大迭代次数
(2)簇的介绍:
明显分离的
可以看到(a)中不同组中任意两点之间的距离都大于组内任意两点之间的距离,明显分离的簇不一定是球形的,可以具有任意的形状。
基于原型的
簇是对象的集合,其中每个对象到定义该簇的原型的距离比其他簇的原型距离更近,如(b)所示的原型即为中心点,在一个簇中的数据到其中心点比到另一个簇的中心点更近。这是一种常见的基于中心的簇,最常用的K-Means就是这样的一种簇类型。
这样的簇趋向于球形。
基于密度的
簇是对象的密度区域,(d)所示的是基于密度的簇,当簇不规则或相互盘绕,并且有早上和离群点事,常常使用基于密度的簇定义。
(3)距离类型的介绍:
常见的距离:
(4)质心的重新计算:
根据SSE公式来计算质心,全称是误差平方和公式,SSE值越小说明该质心越符合这些数据点的中心。最后的结果是取所有簇内点的平均值作为新的质点。
k表示k个聚类中心,ci表示第几个中心,dist表示的是欧几里得距离。
SSE决定了质心
Python代码:
from numpy import *import matplotlib.pyplot as pltdef creatCent(dataSet,k): n=shape(dataSet)[1] #数据维数 creatCents = mat(zeros((k,n))) #print('--------------') #print(creatCents) for j in range(n):#随机生成K个中心,一维一维的生成 minJ=min(dataSet[:,j]) rangeJ =float(max(dataSet[:,j])-minJ) creatCents[:,j] =mat(minJ+rangeJ*random.rand(k,1)) # print('--------------') # print(creatCents[:,j]) return creatCentsdef loadDataSet(filename): #读入数据存为一个Numpy矩阵 dataMat = [] fr = open(filename) for line in fr.readlines(): curLine = line.strip().split('\t') fltLine = list(map(float, curLine)) dataMat.append(fltLine) dataMat = array(dataMat) return dataMatdef distEclud(vecA,vecB): # 求欧几里得距离 # print(vecB) # print('--------------------') return sqrt(sum(power(vecA-vecB,2)))def Kmeans(dataSet,k): m=shape(dataMat)[0] clusterAssment = mat(zeros((m,2))) #print(clusterAssment) # print(m) # print(len(clusterAssment)) creatCents =creatCent(dataSet,k) #print(creatCents) clusterChanged = True#标记簇是否发生变化 while clusterChanged: clusterChanged =False for i in range(m): #inf在numpy中用来表示无穷大的 # print(dataSet[i, :]) # print('-------------') minDist = inf;minIndex = -1 for j in range(k): distJI = distEclud(creatCents[j,:],dataSet[i,:]) if distJI<minDist: minDist=distJI;minIndex=j if clusterAssment[i,0]!=minIndex: #如果这个点的分配结果发生改变 clusterChanged=True clusterAssment[i,:]=minIndex,minDist**2 # print('-------------------------------------------') # 第一个是该点分配到的簇的编号,第二个是该点到这个簇中心的距离 # print(clusterAssment) #print(creatCents) for cent in range(k): # 通过数组过滤得到簇中所有数据 # .A 方法将matrix类型元素转化为array类型 ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]] # 将质心更新为簇中所有数据的均值(mean函数的功能) creatCents[cent,:]=mean(ptsInClust,axis=0) return creatCents,clusterAssmentdef draw(data,center): length=len(center) fig=plt.figure # 绘制原始数据的散点图 plt.scatter(data[:,0],data[:,1],s=25,alpha=0.4) # 绘制簇的质心点 for i in range(length): plt.annotate('center',xy=(center[i,0],center[i,1]),xytext=\ (center[i,0]+1,center[i,1]+1),arrowprops=dict(facecolor='red')) plt.show()dataMat= loadDataSet('C:\\Users\\dell-pc\\Desktop\\TestSet.txt')# print(dataMat)center,clust = Kmeans(dataMat,4)# draw(dataMat,center)
Kmeans总结:
优缺点:
易于实现可能收敛于局部最小值,大规模数据收敛比较慢K值需要指定
在K值较小,关于K值的确定最简单的一种是分别计算不同K值下的误差平方和取最小那个。
收敛于局部最小值的问题,主要是初始点的选择是随机造成的。可以选择距离相对比较远的几个点,这样就不容易收敛于局部最小值。
更多解决方法参考这篇博客:
http://www.cnblogs.com/kemaswill/archive/2013/01/26/2877434.html?utm_source=tuicool
图片出处:
http://blog.csdn.net/taoyanqi8932/article/details/53727841
代码参考《机器学习实战》
参考博客:
http://blog.csdn.net/linzch3/article/details/57418531
http://blog.csdn.net/taoyanqi8932/article/details/53727841
阅读全文
0 0
- Kmeans
- KMeans
- Kmeans
- KMeans
- KMeans
- kmeans
- Kmeans
- Kmeans
- Kmeans
- Kmeans
- kmeans
- kmeans++
- Kmeans
- kmeans
- Kmeans++
- KMeans
- Kmeans
- Kmeans++
- 类和对象
- 唯快不破:TCP/IP详解--五层协议的作用以及对应的设备
- Uva3708 (一点处理技巧)
- 51nod 1185 威佐夫游戏 V2
- Windows10下一次解决python3.6中文乱码问题
- Kmeans
- 【Scikit-Learn 中文文档】随机梯度下降
- python3学习-requests使用
- 面向对象-类和对象的创建
- JAVA | 28
- VMware虚拟机模拟Ubuntu无法上网的解决办法
- Toolbar详解(二)
- Docker
- pta——电话聊天狂人(c二叉树实现)