import numpy def loadDataSet(fileName): # general function to parse tab -delimited floats dataMat = [] # assume last column is target value fr = open(fileName)#打开文件 for line in fr.readlines():#读取每一行数据 curLine = line.strip().split('\t')#去掉首位的空格,并且以‘\t’分割数据 fltLine = list(map(float, curLine)) # map all elements to float()使用map把函数转化为float类型 dataMat.append(fltLine) return dataMat def distEclud(vecA, vecB):#计算向量A和向量B之间的距离 return numpy.sqrt(numpy.sum(numpy.power(vecA - vecB, 2))) # la.norm(vecA-vecB) #随机生成中心 def randCent(dataSet, k): n = numpy.shape(dataSet)[1]#得到数据列的数量,即数据的维度 centroids = numpy.mat(numpy.zeros((k, n))) # create centroid mat创建一个由k个质心组成的零矩阵 for j in range(n): # create random cluster centers, within bounds of each dimension minJ = min(dataSet[:, j])#得到第j个维度的最小值 rangeJ = float(max(dataSet[:, j]) - minJ)#得到第j个维度的取值范围 centroids[:, j] = numpy.mat(minJ + rangeJ * numpy.random.rand(k, 1))#生成k*1的随机数(在数据该维度的取值范围内) return centroids def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):#输入变量有4个,数据集,聚类中心的个数,计算距离函数和随机生成聚类中心函数 m = numpy.shape(dataSet)[0]#得到数据的个数 clusterAssment = numpy.mat(numpy.zeros((m, 2))) # create mat to assign data points生成m*2的零矩阵 # to a centroid, also holds SE of each point centroids = createCent(dataSet, k)#随机创建k个中心 clusterChanged = True#中心是否改变的标志 while clusterChanged: clusterChanged = False for i in range(m): # for each data point assign it to the closest centroid循环每个数据点 minDist = numpy.inf minIndex = -1 for j in range(k):#循环每个聚类中心 distJI = distMeas(centroids[j, :], dataSet[i, :])#计算每个数据点到聚类中心的距离 if distJI < minDist:#选择距离最小的聚类中心 minDist = distJI#赋值 minIndex = j#最小的聚类中心的标志 if clusterAssment[i, 0] != minIndex: clusterChanged = True#该数据的最近的聚类中心不会发生变化,当所有的数据最
机器学习实战——第十章-聚类
最新推荐文章于 2022-09-10 10:08:40 发布