K-Means聚类算法小结

1.基本概念

K-Means算法是一种很典型的基于距离的聚类算法,采用距离作为相似性的评价标准,认为两个对象的距离越近,那么相似度就越大。把簇作为距离靠近的对象组成的,最终得到的是紧凑和独立的簇。对于聚类分析来说,用于发现数据对象之间的关系。组内的相似性越大,组间的相似性越小,可以说效果越好。K个初始类聚类中心点的选取对聚类结果具有比较大的影响。在算法的第一步中随机的选取了K个初始聚类的中心,代表了一个簇。在每次迭代的过程中,对数据集中剩余的每个对象。根据每个簇中心的距离将每个对象重新赋给最近的族。

2.算法的基本过程为:

1.首先从N个文档中选取K个文档

2.对剩余的每个文档测量其到质心的距离,并把它归到最近的质心的类。

3.重新计算已经得到的各个类的质心。

4.迭代2~3步直至新的质心与原质心相等或小于指定阈值。

3.工作原理

输入:聚类个数k,以及包含n个数据对象的数据库。

输出:满足方差最小标准的k个聚类。

K-Means聚类算法小结_第1张图片

相关代码:

from numpy import *
import kMeans

def Kmeans(dataSet,k,distMeans=distEclud,createCent = randCent):
    #样本数
    m = shape(dataSet)[0]
    #m*2的矩阵
    clusterAssment = mat(zeros(m,2))
    #初始化k个中心
    centroids = createCent(dataSet,k)
    clusterChanged = True
    #当聚类不在变化
    while clusterChanged:
        clusterChanged = False
        for i in range(m):
            minDist = inf
            minIndex = -1;
            #找到最近的距离
            for j in range(k):
                distJI = distMeas(centroids[j,:],dataSet[i,:])
                if distJI < minDist:
                    minDist = distJI
                    minIndex = j

            if clusterAssment[i,:] != minIndex:
                clusterChanged = True;
            #第一列为所属质心,第二列为距离
            clusterAssment[i,:] = minIndex,minDist**2;
        print(centroids)

        #更改质心位置
        for cent in range(k):
            ptsInClust = dataSet[nonzero(clusterAssment[:,0].A == cent)[0]]
            centroids[cent,:] = mean(ptsInClust,axis=0)
    return centroids,clusterAssment

def loadDataSet(fileName):
    dataMat = []
    fr = open(fileName)
    for line in fr.readline():
        curLine = line.strip().split('\t')
        fltLine = map(float,curLine)
        dataMat.append(fltLine)

def distEclud(vecA,vecB):
    return sqrt(sum(power(vecA - vecB,2)))

def randCent(dataSet,k):
    n = shape(dataSet)[i]
    #create centroid mat
    centroids = mat(zeros((k,n)))
    for j in range(n):
        minJ = min(dataSet[:,j])
        rangeJ = float(max(dataSet[:,j]) - min)
        centroids[:,j] = mat(minJ + rangeJ * random.rand(k,1))
    return centroids

a = array([1,0,0],[0,1,2],[2,0,0])
print(nonzero(a))

4.算法的优缺点:

优点在于:

1.算法快速,简单

2.对大数据集有较高的效率并且是可伸缩性的

3.时间复杂度近于线性、适合挖掘大规模数据集。

缺点在于:

1.k是要事先给定,导致非常难以估计

2.在初始聚类中心来确定一个初始划分,然后对初始划分进行优化。初始划分对结果有较大的影响。

3.不要不断的进行样本分类调整、不断的计算新的聚类中心、当数据量非常大时,算法的开销时间非常大。

你可能感兴趣的:(算法)