kmeans聚类算法的基本思想和算法描述,聚类分析kmeans算法步骤

  kmeans聚类算法的基本思想和算法描述,聚类分析kmeans算法步骤

  K-means聚类算法的机器学习有两大问题,一是分类问题,二是聚类问题。这是监督学习。对原始数据进行标注,可以根据原始数据建立模型,确定新数据属于哪一类。聚类是一种无监督学习。聚类是指在事先没有“标签”的情况下,发现数据中数据对象之间的关系,并对数据进行分组。一个分组也称为“一个簇”。组内相似度越大,组间差异越大,聚类效果越好,即一个簇内对象的相似度越高,簇间对象的相似度越低。K-means是一种聚类算法。

  在K-means聚类算法中,K表示将数据聚类成K个簇,means表示每个簇中数据的平均值就是该簇的中心,也称为质心。K-means聚类试图将相似的对象分类到同一个聚类中,将不同的对象分类到不同的聚类中。这里需要一种计算方法来衡量数据的相似性。K-means算法是一种典型的基于距离的聚类算法,它使用距离作为相似性的评价指标。默认情况下,欧氏距离被用作相似性度量,即两个对象之间的距离越近,它们的相似性就越大。

  聚类和分类最大的区别在于分类的对象是事先知道的,而聚类则不同。聚类事先不知道目标变量是什么,类别也不像分类那样预先定义,也就是聚类的组不需要事先被告知划分的组应该是什么。因为我们可能甚至不知道我们在寻找什么,所以聚类用于知识发现而不是预测。因此,聚类有时被称为无监督学习。

  Kmeans过程原理假设有一群计算机科学和数理统计相关的人才。这些人才包括计算机人才、机器学习人才、数学人才。那么如何对这些数据进行聚类呢?

  我们可以直观的感觉到应该分类如下:

  但是,问题是计算机不会直观地观察数据。首先,数据将被矢量化,K-means聚类将在这些点中随机找到三个点。然后计算所有样本与当前三点的距离,判断样本点与当前三点的距离。

  经过一次计算,就是一个迭代的过程。在一次迭代之后,它被分成三个类别(集群),每个类别都有一个质心。然后进行下一次迭代,不断计算所有点到三类中心点的距离。每个样本点根据离哪个质心最近的距离属于哪个聚类,以此类推,继续迭代。

  当这次计算的中心点的距离不再从上次计算的中心点的位置改变时,迭代停止。

  k值的选择(选择合适的聚类数肘法)k值的选择一般可以根据问题的内容或肘法来确定。如图:

横轴表示K值的选择,纵轴表示对应的K值下所有聚类的平均畸变程度

每个类的畸变程度是每个类别下每个样本到质心的位置距离的平方和

。一个类的内部成员越紧密,类的失真越低,类内的相似度越大,聚类越好。如图所示,在k=1的情况下,类的平均失真度与k=2的情况相比变化很大,这说明k=2的情况下的类比k=1的情况下的类要紧凑得多。同样,发现当k=3时,随着k的增加,类的平均失真度变化不大,说明k=3是一个较好的k值。后一个k3类的平均失真度变化不大。聚类越多,类间的相似性越大,但类内没有相似性。这种聚类也不好。举个极端的例子,如果有1000个数据分成1000个类,那么类的平均失真度为0,那么每一个数据都是一个类,类间相似度大,但类内没有相似度。

  K-means算法的主要思想K-means算法的思想是对空间中的K个点进行聚类,对靠近它们的对象进行分类,通过迭代更新聚类中心(质心)的值,直到获得最佳的聚类结果。k均值过程:

  1.首先,选择K个类别的中心点。

  2.对于任何样本,找出它到各种中心的距离,并对s进行分类

  4.重复步骤2和3,直到K个类的中心点位置不变,或者达到一定的迭代次数,则迭代结束,否则继续迭代。

  K-means算法K-means算法假设聚类分为三类,每类的中心点在开始时随机选取。有可能三个点的位置非常接近,导致每个聚类寻找每个类中心的迭代次数增加。当选择第一个聚类中心点时,K-means也是随机选择的。在选择第二个聚类中心点时,离当前选择的聚类中心点越远,被选择的概率就越大。假设已经选择了N个点,当选择第N个聚类中心点时,离当前N个聚类中心点越远的点将被选择。这种思想是离聚类中心点越远越好,从而大大减少了寻找最终聚类中心点的迭代。

  一般来说,kmeans算法就是kmeans算法。

  Python数据

  1.6589854.285136-3.4536873.4243214.38138-1.151539-5.379713-3.362104 .............

  #编码:UTF-8 import numpy as NP #将每一行数据放入数组列表并返回一个二维列表def loadDataSet(fileName): #为fr.readlines()中的line创建一个空列表dataMat=[] fr=open(fileName,Rb ):#按tab剪切每一行并返回一个列表listcurve=line.decode (UTF-8 )。剥离()。Split ( t) #以float的形式返回每个列表中分段后的元素。map()有内置函数,返回一个map对象[注意在python2.7版本中,map直接返回list],这里需要包装一个list fltLine=list(map(float,Curline)) datamat。append (fltline)返回datamat #两点欧氏距离def dis clud(veca,vecb): # np.power (x1,x2)求x1中每个元素的x2次方,它不会改变x1。返回NP。SQRT (NP。SUM (NP。POWER (veca-vecb,2)) #随机寻找3个中心点的位置坐标,返回一个3*2的矩阵def randCent(dataSet,k): #返回数据集列数,Column=NP . shape(dataSet)[1] Centerids是一个3*2的矩阵,用于存储范围(N)中j的三个中心点的坐标 centerids=np.mat(np.zeros((k,N)):#统计每列的最小值minJ=min(dataSet[: j]) #每列的最大值和最小值之差rangej=float (max (dataset [:j])-minj)# NP . rand(k,1)生成k . Array 2=minjrangej * NP . rand(k,1) #转换成k*1矩阵并赋给centers [:j]=np.mat (array2)返回centers def k means (dataset,k,Distmeas=disteclud, createcent=randcent): #计算矩阵M=80m=NP . shape(dataSet)[0]# zeros((M,2))创建一个80行2列的二维数组# numpy.mat将二维数组转换为矩阵[类别号,当前点到类别号中心点的距离]cluster assessment=NP . mat(NP . zeros((M,2)) # CreateCent查找k个随机中心点的坐标centerids=createCent(dataSet, k)# print centers cluster changed=true while cluster changed:cluster changed=false #遍历范围内I从80个数据到每个中心点的距离(m): # np.inf float最大值,minDist=np.inf #当前点的类别号属于minIndex=-1 #范围内j从每个样本点到三个中心点的距离(k): # x=centers [j,] # print x #返回两点间的距离值distji=distmeas (centers [j,dataset [i,)if distjimist:#当前最小距离的值minDist=distJI #当前最小值属于哪个聚类? minIndex=j #如果聚类[I=min index:cluster changed=True]将当前点的类别号和最小距离分配给clusterteacher [I,]=minindex,minDist for cent in range(k):# array=cluster assment[:0],则存在与上次迭代中计算的当前点类别不同的点。A==cent # result=np .非零(clusterAssment[:0])。A==cent)[0] # clusterAssment[:0]。a将0列(即类别号)转换为数组# clusterAssment[:0]。A==cent [:0]。A==cent返回一个列,列中的每个元素为True或False,True表示当前遍历的cent类别# np .非零(ClusterAssessment [:0])。A==cent)返回数组中值不为False的元素对应的行号下标数组和列号下标数组# currNewcenter取出一个由当前遍历Cent类别的所有行数据组成的矩阵。Currnewcenter=dataset [np .非零(聚类[:0])。A==cent)[0]] # numpy.mean计算矩阵的平均值,axis=0计算每列的平均值,axis=1计算每行的平均值。

  #这里是每次while计算后将再次找到每个类别中中心点的坐标的位置,axis=0是每列的平均值Centerids [cent,]=np.mean (currnewcenter,axis=0)# Return[当前三个中心点的坐标][每个点的类别号,以及到当前中心点的最小距离] return centers,clusterssmentif _ _ name _ _= _ _ main _ :# numpy . mat将数据转换为80*2的矩阵datamat=np.mat (loaddataset/testset.txt)) k=3 #个中心。每个点的聚类类编号距当前中心点的最小距离Centerids,clusterAssment (datamat,k,distmeas=disteclud,create cent=rand cent)print(Centerids)print(cluster)

  斯卡拉数据k的意思是数据

  0.0 0.0 0.1 0.1 0.10 .2 0.2 0.29 .0 9.0 9.09 .1 9.1 9.19 .2 9.2 9.2包ml。kmeansimport Scala。工具。scalap。主进口组织。阿帕奇。火花。spark confimport组织。阿帕奇。火花。spark上下文导入组织。阿帕奇。火花。SQL。sqlcontext导入组织。阿帕奇。火花。ml lib。聚类。kmeansmod导入通过数据集使用聚类训练模型*/object KMeansScala { def main(args:Array[String]):Unit={//1构建火花对象val conf=new SparkConf().setAppName(KMeans ).set master( local )val sc=新火花上下文(conf)//读取样本数据1,格式为支持向量机格式val数据=sc。textfile( k表示_ data。txt )val解析数据=数据。地图(s=向量。密集(s . split()).地图(_。toDouble))).cache()有效数量簇=2有效数量=100有效型号=新k均值().//设置聚类的类数setK(集群数量).//设置找中心点最大的迭代次数setMaxIterations(numIterations).run(parsedData) //2个中心点的坐标价值中心=模型。聚类中心值k=模型。k中心。foreach(println)println(k)//保存模型model.save(sc, 1 ./Kmeans_model) //加载模型val same model=kmeansmodel。负载(sc, 1 ./k means _ model )println(同型号。预测(向量。dense(1,1,1))//spark SQL读取显示2个中心点坐标val sqlContext=new sqlContext(sc)sqlContext。阅读。拼花地板(./k表示_模型/数据’).show() }}可以设置中心点

  包装ml。kmeansimport组织。阿帕奇。火花。sparkconfimport组织。阿帕奇。火花。spark上下文导入组织。阿帕奇。火花。ml lib。聚类。kmeansmodeimport组织。阿帕奇。火花。ml lib。利纳格。向量导入org.apache.spark.mllib.linalg.Vector/** *给聚类指定中心点的位置*/object k表示2 { def main(args:Array[String]){ val conf=new spark conf().setAppName(KMeans2 ).set master( local )val sc=新火花上下文(conf)val rdd=sc。并行化(列表(向量。dense(数组(-0.1,0.0,0.0))、Vectors.dense(数组(9.0,9.0,9.0))、Vectors.dense(数组(3.0,2.0,1.0))//指定文件kmeans_data.txt中的六个点为中心点坐标英国压力单位质心:数组[向量]=sc。textfile( k表示_ data。txt’).地图(_。拆分("")。地图(_。toDouble)).map(Vectors.dense(_)).collect()val model=new KMeansModel(cluster centers=centroids)println(聚类个数= model.k) //模型中心点模型。集群中心。foreach { println }//预测指定的三条数据val结果=模型。预测(rdd)结果。收集().foreach(println(_)} }

kmeans聚类算法的基本思想和算法描述,聚类分析kmeans算法步骤