zoukankan      html  css  js  c++  java
  • kmeans++

    在k-means算法里开始选取的聚类中点是随机的,每次都会照成不同的聚类结果。有一个解决方案叫做k-means++,可以有效的选择初始聚类中心点。参考 http://theory.stanford.edu/~sergei/papers/kMeansPP-soda.pdf


    在《白话大数据与机器学习》里使用了sklearn里的KMeans来处理数据, 默认使用的就是k-means++:
    训练模型 clf = KMeans(n_clusters=3, init=’k-means++’).fit(x, y)


    这里我们来实现一下k-means++算法,看看该算法具体是如何实现的。

    1 训练模型
    使用kmeans++算法初始化聚类中点:
    假设有一个数据集合X,里面有N条记录。

    [x1, x2, x3, x4, x5, x6, ...]

    第一次从X中随机取一条记录xi,当做聚类的第一个中心点。
    然后重复以下步骤:
    对每条记录,计算其与最近的一个中点之间的距离D(xn)并保存到一个数据组里,计算距离公式有很多,欧式距离,曼哈顿距离等。

    D(x) = [D(x1), D(x2), D(x3), D(x4), D(x5), D(x6), ...]

    对计算得到的距离加和

    Sum(D(x))

    然后再用D(x)里的各条记录分别除以距离加和值 D(xn)/Sum(D(x))

    [D(x1)/Sum(D(x)),   
    D(x2)/Sum(D(x)),  
    D(x3)/Sum(D(x)),  
    D(x4)/Sum(D(x)),  
    D(x5)/Sum(D(x)),  
    D(x6)/Sum(D(x)),   ... ...]

    得到下面这样的概率分布数组

    [P(x1), 
    P(x2),
    P(x3),
    P(x4),
    P(x5),
    P(x6),
    ...]

    接着计算累加和

    [P(x1),  
    P(x1) + P(x2),  
    P(x1) + P(x2) + P(x3),  
    P(x1) + P(x2) + P(x3) + P(x4),  
    P(x1) + P(x2) + P(x3) + P(x4) + P(x5),  
    P(x1) + P(x2) + P(x3) + P(x4) + P(x5) + P(x6),  
    ... ...]

    从该数组中随机取一条记录,用它的下标在记录X中取值 当做下一个聚类中心点。


    当聚类中心点初始完毕之后接下来就是使用k-means算法,聚拢各类:
    计算所有点和各个中心点之间的距离,取离自己最近的中心点归为那个聚类。

    {0: [x1, x2, x3],  
    1: [x4, x5, x6],  
    ......}

    重新计算各个簇的中点,取各个特征列的均值,得到新的中心点。

    [(x1 + x2 + x3) / 3, 
    (x4 + x5 + x6) / 3,
    ...]

    重复上述步骤 直到没有中心点移动。


    完整代码可以访问https://github.com/azheng333/Ml_Algorithm.git进行下载。

    (完)
                        关注大数据尖端技术发展,关注奇点大数据

  • 相关阅读:
    Redis
    Linux 命令
    Linux 命令
    Networking
    Networking
    MySQL(5.6) 函数
    MySQL 中事务、事务隔离级别详解
    程序人生:搜索引擎被禁用,你还会写代码吗?
    程序人生:搜索引擎被禁用,你还会写代码吗?
    程序员幽默:老板让明天带条鱼来大家观察
  • 原文地址:https://www.cnblogs.com/azheng333/p/5796255.html
Copyright © 2011-2022 走看看