数据挖掘十大经典算法之二:K-means

来源:互联网 发布:堆垛机用与单片机 编辑:程序博客网 时间:2024/09/21 11:17

概念和原理

k-means是无监督聚类算法,主要是根据样本的相似度或者样本之间的距离进行自动分类。
首先,初始化聚类中心,可以随机选择K个样本,也可以固定选择其中的k个样本作为初始化的聚类中心。
其次,计算各样本到所有的聚类中心的相似度(此处用距离表示),将样本分到与聚类中心相似的最大即距离最小的中心所在的类中。
再次,更新聚类中心,可以通过样本的平均值计算
最后,循环迭代,直至满足停止条件。

Code

import numpy as npfrom operator import itemgetterdef loadData(filename):    dataset = []    file = open(filename)    for line in file.readlines():        dataset.append(map(float,line.strip().split('\t')))    return np.array(dataset)def computeDistence(dataset,centre):    return np.sqrt(((dataset-centre)**2).sum(axis=1))def computeCentre(dataset,k):    n = dataset.shape[1]    centreSet = np.zeros((k,n))    minvalue = dataset.min(axis=0)    maxvalue = dataset.max(axis=0)    chageRange = maxvalue-minvalue    centreSet = minvalue + chageRange*np.random.rand(k,2)    return centreSetdef kmeans(dataset,k):    m = dataset.shape[0]    clusterResult = np.zeros((m,3))    centres =computeCentre(dataset,k)    clusterChanged = True    while clusterChanged:        clusterChanged=False        for i in range(m):            distence = computeDistence(dataset[i],centres)            indexes, sortedDistence = zip(*sorted(enumerate(distence), key=itemgetter(1)))            if(clusterResult[i,1] !=indexes[0]):                clusterChanged = True            clusterResult[i,:] = i,indexes[0],sortedDistence[0]        for i in range(k):            tmp = dataset[np.array((clusterResult[clusterResult[:,1] == i])[:,0]).astype(np.int32)]            meanvalue = np.mean(tmp,axis=0)            centres[i,:] = np.mean(tmp,axis=0)    return centres,clusterResultdef main():    dataset = loadData('testSet.txt')    centres = computeCentre(dataset,4)    centres,clusterResult = kmeans(dataset,4)if __name__ == '__main__':    main()
0 0
原创粉丝点击