KMeans和二分KMeans

本文介绍了KMeans聚类算法的工作原理、迭代过程和优化问题,以及二分KMeans算法如何解决局部最优解的问题,通过SSE指标评估聚类效果,并给出了算法的伪代码和实际应用。
摘要由CSDN通过智能技术生成

聚类算法是机器学习中的一类无监督学习方法,用于将无标签的数据进行聚类划分。最简单的也最典型的一类算法就是KMeans算法。此处的K表示划分成K个聚类。利用各个点到质心之间的距离的平方和作为将节点划分到不同类的标准。当然也可以采用其他的距离计算方法,不一定是欧式距离方法。

一、KMeans

此方法一般是在数据分析前期使用,选取适当的K,将数据聚类后,研究不同聚类下数据的特点。

算法原理:

(1)随机选择K个中心点;

(2)在第j次迭代中,对于每个样本点,选取最近的中心点,归为该类;

(3)更新中心点为每类的均值;

(4)j < j-1,重复(2)(3)迭代更新,直到误差小到某个值或者达到一定的迭代步数,误差不变,也就是收敛为止;

空间复杂度为O(n),时间复杂度为O(l*K*N),其中N为样本个数,K为中心点个数,即聚类数,I为迭代次数


为什么迭代后误差逐渐减小:

SSE= 

对于 而言,求导后,当 时,SSE最小,对应第(3)步;

对于 而言,求导后,当 时,SSE最小,对应第(2)步。

因此KMeans迭代能使误差逐渐减少直到不变

代码如下所示:

from numpy import *

#general function to parse tab -delimited floats
 #assume last column is target value
def loadDataSet(fileName):     
    dataMat = []               
    fr = open(fileName)
    for line in fr.readlines():
        curLine = line.strip().split('\t')
        #笔者使用的是python3,需要将map映射后的结果转化为list
        #map all elements to float()
        fltLine = list(map(float,curLine)) 
        dataMat.append(fltLine)
    return dataMat

#样本距离计算函数
def distEclud(vecA, vecB):
    return sqrt(sum(power(vecA - vecB, 2))) #la.norm(vecA-vecB)
#创建簇中心矩阵,初始化为k个在数据集的边界内随机分布的簇中心
def randCent(dataSet, k):
    n = shape(dataSet)[1]
    #create centroid mat 
    centroids = mat(zeros((k,n)))
    #create random cluster centers, within bounds of each dimension
    for j in range(n):
        #求出数据集中第j列的最小值(即第j个特征)
        minJ = min(dataSet[:,j])
        #用第j个特征最大值减去最小值得出特征值范围
        rangeJ = float(max(dataSet[:,j]) - minJ)
        #创建簇矩阵的第J列,random.rand(k,1)表示产生(10,1)维的矩阵,其中每行值都为0-1中的随机值
        #可以这样理解,每个centroid矩阵每列的值都在数据集对应特征的范围内,那么k个簇中心自然也都在数据集范围内
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值