失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 聚类分析原理(及Python实现K-means代码详解)

聚类分析原理(及Python实现K-means代码详解)

时间:2024-07-16 12:28:43

相关推荐

聚类分析原理(及Python实现K-means代码详解)

聚类分析概念

聚类分析(cluster analysis ):是一组将研究对象分为相对同质的群组(clusters)的统计分析技术。聚类分析也叫分类分析,或者数值分类。聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或者相似度将其划分成若干个组,划分的原则是组内距离最小化而组间(外部)距离最大化。聚类和分类的不同在于:聚类所要求划分的类是未知的。

距离量度

不同的距离量度会对距离的结果产生影响,常见的距离量度如下所示:

聚类研究分析的方法

1.层次的方法(hierarchical method)2.划分方法(partitioning method)3.基于密度的方法(density-based method)DBSCAN4.基于网格的方法(grid-based method)5.基于模型的方法(model-based method)

K-means算法

K-means算法是经典的聚类分析划分方法之一。其优缺点如下:

优点:原理简单速度快对大数据集有比较好的伸缩性缺点:需要指定聚类 数量K对异常值敏感对初始值敏感

受离群点的影响较大,由于其迭代每次的中心点到全部样本点的距离和的平均值。

以欧式距离来衡量距离大小,使用误差平方和(Sum of the Squared Error,SSE)作为聚类的目标函数:

k表示k个聚类中心,ci表示第几个中心,dist表示的是欧几里得距离。该公式表示求每个点到自己所属聚类中心的距离之和。即先把每个点到自己聚类中心的距离求出来,然后将所有距离相加。要让SSE最小,需每个点到自己聚类中心的距离最短。

由上可以看出,簇的最佳质心是簇中各点的均值。

K-means算法思想如下:

任选k个初始点作为质心repeat :数据集中每一个数据点每一个初始质心计算数据点与质心的距离将数据点分配到距离最近的簇对每个簇计算簇的均值,将均值作为簇的新的质心until:任一数据点的簇分配结果没有发生改变,或者达到最大迭代次数

具体实现代码如下:

(光看代码没用,可将下面代码直接copy到IDE中跑下,看看效果。也可通过IDE单步运行功能看看程序的具体的走向)

#-*- coding: utf-8 -*-#python实现聚类#import numpy as npfrom numpy import *#加载数据集def loadDataSet(fileName):dataMat = []fr = open(fileName)for line in fr.readlines():"""strip()将line行开头和结尾的空白符号删掉。split('\t') 函数以‘\t’为切分符号对每行切分split函数返回的结果是一个列表,赋值给curLine """curLine = line.strip().split('\t')"""#map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。"""fltLine = map(float, curLine)dataMat.append(fltLine)return dataMat#计算欧式距离的函数def countDist(vecA,vecB):return sqrt(sum(power(vecA-vecB,2)))#测试countDist# vecA,vecB = np.array([1,2]),np.array([3,4])# x = countDist(vecA,vecB)# print(x)#随机设置k个质心def randCent(dataSet,k):n = shape(dataSet)[1]#初始化一个k行n列的二维数组,数组初始值全部为0,然后用mat函数将其转化为矩阵centroids = mat(zeros([k,n]))for j in range(n):minj = min(dataSet[:,j])rangej = float(max(dataSet[:,j])-minj)centroids[:, j] = mat(minj + rangej * random.rand(k, 1))return centroids#k-Means算法核心部分def kMeans(dataSet, k, distMeas=countDist, createCent=randCent):#将函数distEclud和randCent作为参数传进来,可以更好的封装kMeans函数m = shape(dataSet)[0] """ clusterAssment是一个m行2列的矩阵,第一列存放每个样本所属聚类中心的下标,第二列存放该样本与该聚类中心的距离"""clusterAssment = mat(zeros((m,2)))centroids = createCent(dataSet, k)clusterChanged = Truewhile clusterChanged:clusterChanged = False#下面两个for循环计算每一个样本到每一个聚类中心的距离for i in range(m): #遍历样本minDist = inf#inf表示无穷大,-inf表示负无穷minIndex = -1for j in range(k): #遍历聚类中心distJI = distMeas(centroids[j,:],dataSet[i,:])if distJI < minDist:minDist = distJI; minIndex = jif clusterAssment[i,0] != minIndex:clusterChanged = TrueclusterAssment[i,:] = minIndex,minDist**2print(centroids)for cent in range(k):#重新计算聚类中心,cent从0遍历到kptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]] #nonzero函数:返回不为0元素的行列下标组成的元组""" #clusterAssment[:,0]:取得clusterAssment中第0列元素。#clusterAssment[:,0].A:转置成一个1行m列的行矩阵#clusterAssment[:,0].A==cent :将行矩阵中每一个元素与cent进行比较,得到一个1行m列、元素取值为True和false的矩阵,元素为true表示该样本是第cent个聚类中心的点#nonzero(clusterAssment[:,0].A==cent)[0]:获得元素值为True的元素下标,这些下标集合即为所有属于cent类的样 本下标#整句含义:取得数据集中属于第cent个簇的样本集"""centroids[cent,:] = mean(ptsInClust, axis=0)return centroids, clusterAssment#显示结果def show(dataSet, k, centroids, clusterAssment):from matplotlib import pyplot as pltnumSamples, dim = dataSet.shape #dataSet.shape返回两个值,分别赋给numSamples和dimmark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr'] #样本集的显#示样式for i in range(numSamples):markIndex = int(clusterAssment[i, 0])plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb'] #聚类中#心的显示样式for i in range(k):plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize = 12)plt.show()def main():#dataMat = mat(loadDataSet('testSet.txt')) #加载数据集。若没有源数据,可用下面两句随机生成数据dataMat = random.rand(100,2) #随机生成100行2列的数据dataMat = mat(dataMat)myCentroids, clustAssing = kMeans(dataMat,4)print(myCentroids)show(dataMat, 4, myCentroids, clustAssing)if __name__ == '__main__':""" python代码按照顺序从头到尾执行,不执行def开头的函数,def函数只有被调用时才执行。本句意思是:判断正在执行的程序是否有主函数,若有,则不执行下面这行语句;若没有,则调用main函数"""main()

参考:

k-means聚类算法python实现

数据挖掘-聚类分析(Python实现K-Means算法)

如果觉得《聚类分析原理(及Python实现K-means代码详解)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。