当前位置: 首页 > 后端技术 > Python

100天搞定机器学习-day44k-means聚类数学推导与python实现

时间:2023-03-26 14:40:44 Python

【如何正确使用“K-means聚类”?[](http://mp.weixin.qq.com/s?__b...1、k均值聚类模型给定样本,每个样本有m个特征向量,模型目标是将n个样本分成在k个不间断的类或簇中,每个样本到所属类中心的距离最小,每个样本只能属于一个类。用C表示划分,是多对-onefunction,k-meansclusteringClass是样本到类的函数2.K-means聚类策略k-means聚类的策略是通过最小化损失函数来选择最优的划分或函数,首先计算距离样本之间,这里选择欧几里德距离的平方。然后定义样本与其所属类的中心之间的距离之和作为损失函数,即第l类的均值或中心,即一个指标函数,取值为1或0。k-means聚类是为了解决优化问题:3.K-means聚类算法k-means聚类算法是一个迭代过程。首先,对于给定的中心值,求分度C,也就是目标函数的最小化:即类中心确定后,将样本划分到一个类中,样本与类中心的距离之和它所属类别的中心被最小化。然后:对于给定的划分C,然后找到每个类的中心,也就是目标函数的最小化。即划分C确定的情况接下来,最小化样本与所属类中心的距离之和。求解结果,对于包含nl个样本的每个类Gi,更新其均值ml:重复以上两步,直到微分不再变化。frommyUtilimport*defkMeans(dataSet,k):m=shape(dataSet)[0]#返回矩阵的行数#该算法的核心数据结构:行数与数据集相同#第一列:数据集中心对应的聚类,第二列:数据集的行向量到聚类中心的距离ClustDist=mat(zeros((m,2)))#随机生成a的一个聚类中心数据集:这个例子是一个4*2的矩阵#保证这个聚类中心位于min(dataSet[:,j])和max(dataSet[:,j])之间clustercents=randCenters(dataSet,k)#随机生成clustercenterflag=True#初始化标志位,开始迭代到这个中心的距离小于其他k-1个中心的距离whileflag:flag=False#预设的flag为False#----1.BuildClustDist:遍历DataSet数据集,计算DataSet每一行与簇之间的最小欧氏距离----##将结果赋给ClustDist=[minIndex,minDist]foriinxrange(m):#遍历k个簇中心求最短距离ClustDist[i,0]!=minIndex:#找到新的簇中心flag=True#重新设置flag为True,继续迭代#结合minIndex和minDist**2赋值第i行ClustDist#表示数据集第i行对应的聚类中心为minIndex,最短距离为minDistClustDist[i,:]=minIndex,minDist#----2.如果执行到这里,说明还需要更新clustercents值:循环变量为cent(0~k-1)----##1.使用聚类中心cent划分ClustDist,returndataSet的行索引#从dataSet中提取对应的行向量,组成新的ptsInClust#计算分离后ptsInClust的每一列的均值,从而更新clustercents的值对于centinxrange(k):#从ClustDistValue行下标的第一列过滤掉centdInx=nonzero(ClustDist[:,0].A==cent)[0]#从数据集中提取行下标==dInx组成一个新的datasetptsInClust=dataSet[dInx]#计算ptsInClust列的均值:mean(ptsInClust,axis=0):axis=0按列clusterc计算ents[cent,:]=mean(ptsInClust,axis=0)returnclustercents,ClustDist参考:https://jakevdp.github.io/pyt...https://www.cnblogs.com/eczho...统计学习方法14.3