• k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远——sklearn内置该算法


    k-means ++介绍:

    k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。

    算法步骤:
    (1)从输入的数据点集合中随机选择一个点作为第一个聚类中心
    (2)对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
    (3)选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
    (4)重复2和3直到k个聚类中心被选出来
    (5)利用这k个初始的聚类中心来运行标准的k-means算法

      从上面的算法描述上可以看到,算法的关键是第3步,如何将D(x)反映到点被选择的概率上,一种算法如下:
    (1)先从我们的数据库随机挑个随机点当“种子点”
    (2)对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。
    (3)然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。
    (4)重复2和3直到k个聚类中心被选出来
    (5)利用这k个初始的聚类中心来运行标准的k-means算法
    可以看到算法的第三步选取新中心的方法,这样就能保证距离D(x)较大的点,会被选出来作为聚类中心了。至于为什么原因比较简单,如下图 所示:
    这里写图片描述

    假设A、B、C、D的D(x)如上图所示,当算法取值Sum(D(x))*random时,该值会以较大的概率落入D(x)较大的区间内,所以对应的点会以较大的概率被选中作为新的聚类中心。
    sklearn.cluster.KMeans 参数介绍

    为什么要介绍sklearn这个库里的kmeans?
      这个是现在python机器学习最流行的集成库,同时由于要用这个方法,直接去看英文文档既累又浪费时间、效率比较低,所以还不如平时做个笔记、打个基础。
      这里还有一个原因,上面介绍了k-means++,sklearn.cluster.KMeans这个类对于初始聚类中心的选择刚好默认选择的就是k-means ++。
    参数:

    n_clusters:整形,缺省值=8 【生成的聚类数,即产生的质心(centroids)数。】
    max_iter:整形,缺省值=300
    执行一次k-means算法所进行的最大迭代数。
    n_init:整形,缺省值=10
    用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。
    init:有三个可选值:’k-means++’, ‘random’,或者传递一个ndarray向量。
    此参数指定初始化方法,默认值为 ‘k-means++’。
    (1)‘k-means++’ 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛(即上文中的k-means++介绍)
    (2)‘random’ 随机从训练数据中选取初始质心。
    (3)如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。
    precompute_distances:三个可选值,‘auto’,True 或者 False。
    预计算距离,计算速度更快但占用更多内存。
    (1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。This corresponds to about 100MB overhead per job using double precision.
    (2)True:总是预先计算距离。
    (3)False:永远不预先计算距离。
    tol:float形,默认值= 1e-4 与inertia结合来确定收敛条件。
    n_jobs:整形数。 指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。
    (1)若值为 -1,则用所有的CPU进行运算。若值为1,则不进行并行运算,这样的话方便调试。
    (2)若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。
    random_state:整形或 numpy.RandomState 类型,可选
    用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。
    copy_x:布尔型,默认值=True
    当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据
    上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。
    属性:

    cluster_centers_:向量,[n_clusters, n_features] (聚类中心的坐标)

    Labels_: 每个点的分类
    inertia_:float形
    每个点到其簇的质心的距离之和。

    Notes:
      这个k-means运用了 Lioyd’s 算法,平均计算复杂度是 O(k*n*T),其中n是样本量,T是迭代次数。
      计算复杂读在最坏的情况下为 O(n^(k+2/p)),其中n是样本量,p是特征个数。(D. Arthur and S. Vassilvitskii, ‘How slow is the k-means method?’ SoCG2006)
      在实践中,k-means算法时非常快的,属于可实践的算法中最快的那一类。但是它的解只是由特定初始值所产生的局部解。所以为了让结果更准确真实,在实践中要用不同的初始值重复几次才可以。
    Methods:

    fit(X[,y]):
     计算k-means聚类。
    fit_predictt(X[,y]):
     计算簇质心并给每个样本预测类别。
    fit_transform(X[,y]):
    计算簇并 transform X to cluster-distance space。
    get_params([deep]):
     取得估计器的参数。
    predict(X):predict(X)
     给每个样本估计最接近的簇。
    score(X[,y]):
     计算聚类误差
    set_params(**params):
     为这个估计器手动设定参数。
    transform(X[,y]): 将X转换为群集距离空间。
     在新空间中,每个维度都是到集群中心的距离。 请注意,即使X是稀疏的,转换返回的数组通常也是密集的。
    参考文献:

    1、http://blog.csdn.net/loadstar_kun/article/details/39450615
    2、http://blog.csdn.net/xiaoyi_zhang/article/details/52269242
    ————————————————
    版权声明:本文为CSDN博主「二当家的掌柜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/github_39261590/article/details/76910689

  • 相关阅读:
    osg 导入模型发黑
    osg 拖拽器
    osgearth viewpoint 视点
    win10下无进程占用端口但是又提示端口占用的解决办法
    c++如何将指针 转为 引用 传递给方放参数
    【北亚数据恢复】服务器raid阵列瘫痪导致ZFS文件系统元文件损坏的数据恢复
    【北亚数据恢复】IBM DS系列存储服务器硬盘故障、映射出错的数据恢复
    【北亚数据恢复】存储服务器热备盘同步数据过程中硬盘掉线导致卷无法挂载的数据恢复案例
    【北亚数据恢复】IBM服务器raid5硬盘离线,热备盘未激活导致raid崩溃的数据恢复案例
    【北亚数据恢复】昆腾系列存储服务器StorNext文件系统数据恢复案例
  • 原文地址:https://www.cnblogs.com/bonelee/p/15107608.html
Copyright © 2020-2023  润新知