聚类之K-means算法

  聚类是一种无监督学习,让相似的作为一类,不相似的当然不能归为一类.非常符合我们日常的认知行为.据悉,大多数聚类问题都是NP完全问题,即不存在能够找到全局最优解的有效解法.我们常常是将可能的聚类情况定义一个代价函数,问题就转化为寻找一个代价最小的划分,变成了一个优化问题了.目标函数是一个从输入(X,d)和聚类方案C=(C1, C2, C3, …, Cn)映射到正实数的函数G.我们的目标即找到合适的C使得G((X, d), C)最小.

  本次要讲的K-means算法的目标函数为

G((X,d),(C1,C2,C3,...,Cn))=i=1kxCid(x,ui(Ci)2)

=i=1kxCi||xu(Ci)||2

  其中
ui(Ci)=argminuCxCid(x,u)2=argminuCxCi||xu||2

  变量x表示集合X中的各个数据,变量u表示簇(簇指的是分出的类)的中心点,d(x, u)是x到簇中心u的欧式距离.
  即找到合适的C=(C1, C2, C3, …, Cn)使得所有簇中,找到的簇中心点到其簇中其余点的和最小.我们根据需求已经确定需要有n个簇,如此一来找到了这n个簇的中心点,那么对于原数据集的点或者新加入的点就可以通过计算该点到这n个簇中心点的欧式距离,最小的那个即是所归属的簇.

  该算法的一个应用方向是根据已知数据集进行聚类划分,从而判断数据集中的点属于哪一类,或者新来的一个点属于哪一类.
比如我们以此方法将2017年上映的所有电影分为爱情类,动作类,科幻类三大类(可以考虑根据电影中的有多少”爱情镜头”,”动作镜头”,”科幻镜头”进行三变量或三维的聚类).

  另一个应用方向是在数字通信中,将传输信号集合记作X,X会是一个很庞大的数据集合.显然某些场景下我们没有必要也不可能将X中所有元素全部传输完成.我们可以用此方法将数据集进行聚类,用簇的中心点来代替簇中其他点,进行传输.此时,目标函数G即为失真程度.

  算法解析:

  • 输入:已知的全部数据,记为X;已知的聚类数目k.
  • 初始化:随机初始化簇中心点:u1, u2, u3, …, uk.
  • 重复直到收敛(即u1, u2, u3, …, uk不再变化):将X中除去随机选取的初始化k个簇中心u值,逐一依据欧氏距离分配到k个簇中.每次分配一个x,更新一次各个簇中心:
    ui=1nixCix
    ,其中ni是第i个簇的元素个数.
  • 返回:u1, u2, u3, …, uk.

如此即得到了各个簇的中心点.

  该算法的优点是簇内各个点距离紧密而各个簇之间聚类较远,聚类效果较好.
  缺点是初始化步骤中,随机初始化的簇中心点u1, u2, u3, …, uk对聚类结果影响很大.这是由于该算法在几轮迭代后会收敛于某个驻点,而我们很难判断此驻点使得全局最优(大多数聚类问题的通病,也是NP完全问题的弊病).
  传统的解决方法为采取先验知识(即”我们认为”,呵呵)人为选取初始簇中心;或者多次实验,每次选择不同的簇中心,最后找一个使得目标函数G(即代价)最小的初始簇中心.
  我们实验室提出了依据Cfs算法大致选择初始簇中心,之后再进行K-means聚类.大大提高了准确度,而Cfs算法耗时也不大.有兴趣进一步交流的欢迎加我QQ:1127898216(请注明好友申请理由,谢谢).

你可能感兴趣的:(聚类算法学习,机器学习)