zoukankan      html  css  js  c++  java
  • KMeans算法分析以及实现

    KMeans

    KMeans是一种无监督学习聚类方法, 目的是发现数据中数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好。

    无监督学习,也就是没有对应的标签,只有数据记录.通过KMeans聚类,可以将数据划分成一个簇,进而发现数据之间的关系.

    聚类过程

    原理

    KMeans算法是将数据({x^1, x^2 ,..., x^n})聚类成k个簇,其中每个(x^i in R^n), 算法具体描述:

    1. 随机选择k个聚类质心点:(mu_1, mu_2, ..., mu_k);
    2. 重复下面过程直到收敛{
      对于每一个数据i,计算其属于的簇:
      (c^{(i)} := argmin_j||x^{(i)}-mu_j||^2);
      对于每个簇j,重新计算簇质心:
      (mu_j=frac{sum_{i=1}^n1{(c^i==j)}x^i}{sum_{i=1}^n1{(c^{(i)}=j)}})
      }

    用语言描述来说,就是:随机确定k个初始点作为簇中心; 为每个数据分配簇[计算每条数据和簇中心的相似度,分配到最相似的簇上];根据簇中的数据点对每个簇中心进行更新.反复重复直到收敛为止.

    伪代码:

    创建k个点作为起始质心;
    当任意一个点的簇分配结果发生改变时:
        对数据集中的每个数据点:
            对每个质心: 
                计算质心和当前数据点的相似度 
            将数据点分配到最近的质心所代表的簇上 
        对于每个簇,计算簇中所有点的均值,并将均值作为新的簇中心[质心]
    

    存在问题及其处理方法

    • 必须事先给出k(要生成的簇的数目),而且对初值敏感,对于不同的初始值,可能会导致不同结果。
    • 不适合于发现非凸面形状的簇或者大小差别很大的簇。
    • 对于“躁声”和孤立点数据是敏感的,因为簇的中心是通过计算数据的平均值得到的,这些数据的存在会使聚类的中心发生很大的偏移;
    • 容易陷入到局部最优解.

    对于局部最优解的问题,一方面可以像决策树一样,对最后生成的聚类效果进行"剪枝"处理,但有所不同,因为要保证簇数目不变,所有处理进行"剪枝处理"外,还需要"增枝处理",具体可以依据某种指标[SSE sum of square errors]选择指标最大的簇尝试划分, 然后选择两个进行合并,保证簇的数目不变.

    另一方面,可以对kmeans进行优化处理,存在一种二分kMeans处理.

    二分k均值:首先将所有数据看成一个簇,然后将该簇一分为二,之后选择其中一个簇继续划分, 如何选择簇取决于对其划分是否可以最大程度的降低SSE的值;然后反复重复,直到得到K个簇为止.

    代码实现

    github地址: repository

  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    22. Generate Parentheses (backTracking)
    21. Merge Two Sorted Lists
    20. Valid Parentheses (Stack)
    19. Remove Nth Node From End of List
    18. 4Sum (通用算法 nSum)
    17. Letter Combinations of a Phone Number (backtracking)
    LeetCode SQL: Combine Two Tables
    LeetCode SQL:Employees Earning More Than Their Managers
  • 原文地址:https://www.cnblogs.com/ysugyl/p/10023306.html
Copyright © 2011-2022 走看看