K-均值聚类算法

来源:互联网 发布:js中sleep怎么使用 编辑:程序博客网 时间:2024/05/16 17:47
from numpy import *#创建元组dataSet = []#与我们所熟悉的矩阵类似,最终我们将获得N*2的矩阵,fileIn = open("/home/zengxl/PycharmProjects/test3/机器学习实战代码/Ch10/testSet.txt")  #是正斜杠for line in fileIn.readlines():    temp=[]    lineArr = line.strip().split('\t')  #line.strip()把末尾的'\n'去掉    temp.append(float(lineArr[0]))    temp.append(float(lineArr[1]))    dataSet.append(temp)    #dataSet.append([float(lineArr[0]), float(lineArr[1])])#上面的三条语句可以有这条语句代替fileIn.close()dataSet = mat(dataSet)  #mat()函数是Numpy中的库函数,将数组转化为矩阵#函数euclDistance()计算两个向量的欧式距离def euclDistance(vector1, vector2):    return sqrt(sum(power(vector2 - vector1, 2))) #使用了sqrt。#在样本集中随机选取k个样本点作为初始质心def initCentroids(dataSet, k):    numSamples, dim = dataSet.shape   #矩阵的行数、列数    centroids = mat(zeros((k, dim)))  #mat函数创建k行n列的矩阵,centroids存放簇中心    for i in range(k):        index = int(random.uniform(0, numSamples))  #uniform()随机生成一个[x, y)范围内实数,然后将其转化为int型        centroids[i, :] = dataSet[index, :]    return centroids#k为将dataSet矩阵中的样本分成k个类,数据集及簇的数目是必选参数。def kmeans(dataSet, k):    numSamples = dataSet.shape[0]  #读取矩阵dataSet的第一维度的长度,即获得有多少个样本数据    # clusterAssment创建一个m行2列的矩阵,第一列存放索引值,第二列存放误差,误差用来评价聚类效果    clusterAssment = mat(zeros((numSamples, 2)))  #得到一个N*2的零矩阵    #标志变量clusterChanged,如果该值为True,则继续迭代。    clusterChanged = True    ## step 1: init centroids    centroids = initCentroids(dataSet, k)  #样本集中随机选取k个样本点作为初始质心    while clusterChanged:        clusterChanged = False        ## for each sample        for i in range(numSamples):  #range            minDist  = 100000.0#或者inf为正无穷大            minIndex = 0 #创建索引            #计算每个样本点与质点之间的距离,将其归内到距离最小的那一簇            for j in range(k):                # 寻找最近的质心                distance = euclDistance(centroids[j, :], dataSet[i, :])#计算每个点到质心的欧氏距离                if distance < minDist:                    minDist  = distance                    minIndex = j            #如果任一点的簇分配结果发生改变,则更新clusterChanged标志。            if clusterAssment[i, 0] != minIndex:                clusterChanged = True                clusterAssment[i, :] = minIndex, minDist**2  #两个**表示的是minDist的平方        ## 更新质心的位置        for j in range(k):            #clusterAssment[:,0].A==j是找出矩阵clusterAssment中第一列元素中等于j的行的下标,返回的是一个以array的列表,第一个array为等于j的下标            pointsInCluster = dataSet[nonzero(clusterAssment[:, 0].A == j)[0]] #将dataSet矩阵中相对应的样本提取出来            centroids[j, :] = mean(pointsInCluster, axis = 0)  #计算标注为j的所有样本的平均值    print ('Congratulations, cluster complete!')    return centroids, clusterAssmentmyCentroids, clustAssing = kmeans(dataSet, 4)print("myCentroids:", myCentroids)print("clustAssing", clustAssing)

原创粉丝点击