分析kMeans、二分K-Means算法及肘部法则

K-Means算法是聚类中的基础算法,也是无监督学习里的一个重要方法。其基本原理是随机确定k(人为指定)个初始点作为簇质心,然后将数据样本中的每一个点与每个簇质心计算距离,依据此距离对样本进行分配;之后将每次簇的质心更改为该簇内所有点的平均值。
普通的K-Means算法因为初始簇质心的随机性,很可能会收敛到局部最优。为解决这一情况,可以随机初始化若干次,取最好结果,但这种方法在初始给定k值较大的情况下,可能只会得到比前一次好一点的结果(因为k值越大,簇质心越多,则随机性带来的不确定性越小。)
为得到更好的结果,我们尝试采用优化后的二分K-Means算法,它的主要原理是首先将所有样本点视为一个簇,然后用普通K-Means将其分为两个簇,在这两个簇中选择一个,对其继续分,如此循环,直至得到我们制定的簇数。在二分K-Means中,每次执行的“二选一”操作并非随机,而是通过对SSE(Sum of Squared Error)的判断,即:对哪一个簇进行划分能够最大程度降低SSE,就划分哪个簇。
无论是普通K-Means还是二分K-Means,都涉及到K值的指定。一般情况下K值的指定方式有两种,一种是通过对数据可视化结果的观察,另一种是根据输出结果指定(即根据分类后下一步用途来反向决定。)“肘部法则”可以基于对SSE图像的分析,给出一个选取K值的建议。
本文将对K-Means、二分K-Means及肘部法则依次进行介绍。

#载入数据
def loadDataSet(fileName):
    dataMat = []
    fr = open(fileName)
    for line in fr.readlines():
        curLine = line.strip().split('\t')
        fltLine = list(map(float,curLine))
        dataMat.append(fltLine)
    return dataMat

#距离计算
def distEclud(vecA, vecB):
    return sqrt(sum(power(vecA - vecB, 2)))

#随机初始化k个簇质心
def randCent(dataSet, k):
    n = shape(dataSet)[1]
    centroids = mat(zeros((k,n)))
    for j in range(n):
        minJ = min(dataSet[:,j])
        rangeJ = float(max(dataSet[:,j]) - minJ)
        centroids[:,j] = minJ + rangeJ * random.rand(k,1)
    return centroids

#K-Means算法
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
    m = shape(dataSet)[0]    #m个样本点
    clusterAssment = mat(zeros((m,2)))  #初始化矩阵,两列分别为簇号、距离
    centroids = createCent(dataSet, k)  #随机初始化k个簇质心
    clusterChanged = True        #标志位默认为True,以进入While循环
    while clusterChanged:   #While循环开始
        clusterChanged = False   #防止运行完后再次进入,将标志位改为False
        for i in range(m):    #对每一个样本进行访问
            minDist = inf   #将最小误差先设为∞
            minIndex = -1   #将默认的簇分类结果设为-1
            for j in range(k):  #对每一个簇质心进行访问
                distJI = 
  • 6
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值