• K-Mean聚类算法


    K-Means 是发现给定数据集的 K 个簇的聚类算法, 之所以称之为 K-均值 是因为它可以发现 K 个不同的簇, 且每个簇的中心采用簇中所含值的均值计算而成.

    优缺点:

    优点:
    属于无监督学习,无须准备训练集
    原理简单,实现起来较为容易
    结果可解释性较好
    
    缺点:
    需手动设置k值。 在算法开始预测之前,我们需要手动设置k值,即估计数据大概的类别个数,不合理的k值会使结果缺乏解释性
    可能收敛到局部最小值, 在大规模数据集上收敛较慢
    对于异常点、离群点敏感

    流程伪代码:

    创建 k 个点作为起始质心(通常是随机选择)
    当任意一个点的簇分配结果发生改变时(不改变时算法结束)
        对数据集中的每个数据点
          对每个质心
            计算质心与数据点之间的距离
            将数据点分配到距其最近的簇
        对每一个簇, 计算簇中所有点的均值并将均值作为质心            

    二分K-Mean聚类算法流程:

    将所有点看成一个簇
    当簇数目小于 k 时
        对于每一个簇
            计算总误差
            在给定的簇上面进行 KMeans 聚类(k=2)
            计算将该簇一分为二之后的总误差
        选择使得误差最小的那个簇进行划分操作            

    核心代码:

     1 def kMeans(dataMat, k, distMeas=distEclud, createCent=randCent):
     2     '''
     3     创建K个质心,然后将每个店分配到最近的质心,再重新计算质心。
     4     这个过程重复数次,直到数据点的簇分配结果不再改变为止
     5     :param dataMat: 数据集
     6     :param k: 簇的数目
     7     :param distMeans: 计算距离
     8     :param createCent: 创建初始质心
     9     :return:
    10     '''
    11     # 获取样本数和特征数
    12     m, n = shape(dataMat)
    13     # 初始化一个矩阵来存储每个点的簇分配结果
    14     # clusterAssment包含两个列:一列记录簇索引值,第二列存储误差(误差是指当前点到簇质心的距离,后面会使用该误差来评价聚类的效果)
    15     clusterAssment = mat(zeros((m, 2)))
    16     # 创建质心,随机K个质心
    17     centroids = createCent(dataMat, k)
    18     # 初始化标志变量,用于判断迭代是否继续,如果True,则继续迭代
    19     clusterChanged = True
    20     while clusterChanged:
    21         clusterChanged = False
    22         # 遍历所有数据找到距离每个点最近的质心,
    23         # 可以通过对每个点遍历所有质心并计算点到每个质心的距离来完成
    24         for i in range(m):
    25             minDist = inf
    26             minIndex = -1
    27             for j in range(k):
    28                 # 计算数据点到质心的距离
    29                 # 计算距离是使用distMeas参数给出的距离公式,默认距离函数是distEclud
    30                 distJI = distMeas(centroids[j, :], dataMat[i, :])
    31                 # 如果距离比minDist(最小距离)还小,更新minDist(最小距离)和最小质心的index(索引)
    32                 if distJI < minDist:
    33                     minDist = distJI
    34                     minIndex = j
    35             # 如果任一点的簇分配结果发生改变,则更新clusterChanged标志
    36             if clusterAssment[i, 0] != minIndex: clusterChanged = True
    37             # 更新簇分配结果为最小质心的index(索引),minDist(最小距离)的平方
    38             clusterAssment[i, :] = minIndex, minDist ** 2
    39         # print(centroids)
    40         # 遍历所有质心并更新它们的取值
    41         for cent in range(k):
    42             # 通过数据过滤来获得给定簇的所有点
    43             ptsInClust = dataMat[nonzero(clusterAssment[:, 0].A == cent)[0]]
    44             # 计算所有点的均值,axis=0表示沿矩阵的列方向进行均值计算
    45             centroids[cent, :] = mean(ptsInClust, axis=0)
    46     # 返回所有的类质心与点分配结果
    47     return centroids, clusterAssment
  • 相关阅读:
    IDEA 2017 安装和破解
    Linux新增开放端口
    ping指定IP的指定端口号
    Ubuntu防火墙常用命令
    Ubuntu端口常用命令
    File Zilla连接Ubuntu 失败
    Docker常用命令详解
    Linux的vi常用命令详解
    Qt事件系统之二:鼠标事件和滚轮事件
    Qt事件系统之一:Qt中的事件处理与传递
  • 原文地址:https://www.cnblogs.com/eastblue/p/11634369.html
Copyright © 2020-2023  润新知