聚类FCM算法

聚类FCM算法


个人博客,想要搭建个人博客的可以进来看看: http://www.ioqian.top/

在科研生活中,学习算法的时间不是很多,毕竟不是主要搞算法的,但是作为读研狗毕竟还是要毕业写论文的,算法还是要慢慢积累。
学习算法的目的很清晰,主要分为三点:一是扩展知识面,在这个AI如此火爆的年代,搞技术的出去别人聊AI要能听得懂,明白一些算法的思路才可以和别人正常交流;二是活跃思维,学习算法的创新点,锻炼大脑;三是学习解决问题的方法,码农工作中有的问题也需要高逼格的算法。
在科研过程中,每个人自己主攻方向,但是其他的方向都是有必要了解的,当然没必要花费太多的时间,拿算法来看,专门搞算法的算法大牛可能优化一种算法需要几个月去不断尝试,但是对于我来说,花半天时间看看博客,论文综述了解思路就可以了,知道这个算法干嘛的,抽象为什么数学问题,怎么解决完全够了。最后说一句,学过的东西都是有用的,行业都有共性,思路很重要。

参考博客:
http://blog.csdn.net/on2way/article/details/47087201 公式推导
http://www.cnblogs.com/ybjourney/p/4735335.html matlab版本实现
http://blog.csdn.net/cuifengqinghan/article/details/52725242 java版本有可视化界面

下面介绍我们的FCM算法,大致分为下面3个部分,有了下面的三个问题思路会很清晰

  • FCM算法是什么,用来做什么?
  • FCM的数学模型,如何求解数学模型?
  • FCM的编码实现?

1. FCM简介

FCM算法,模糊C均值(Fuzzy C-means)算法,是基于目标函数的模糊聚类算法,主要用于数据的聚类分析。

      模糊就是这个算法的重点和特点,模糊就是不确定的。拿人来举例子,人的年龄,一个人20岁就是20岁,18岁就是18岁所以人的年龄是确定的;人的外貌是不确定的,一个人漂亮不漂亮没办法直接给出一个确定的答复,只能说0.8分漂亮,0.2分不漂亮,这就是模糊。模糊有一个重要的感念隶属度,一般用u表示,表示一个样本属于这种结果的程度,漂亮不漂亮的问题就可以这样描述了

      看了上图,只需要明白怎么表示隶属度就可以了,其中i代表了样本,a,b代表2中分类,一个样本属于不同分类点的求和等于1(0.8+0.2=1),这个很好想的。最后不要问为什么用Uai表示而不是Uia

Fcm算法的优点是什么?
      传统的聚类分析是把每个元素严格的划分到一个类中,属于硬划分。模糊聚类分析将聚类生成的每个簇均看做模糊集合,通过隶属度来确定聚类关系,是一种柔性划分,得到元素属于各个簇的不确定性程度,使得聚类结果更加准确灵活,因此,模糊聚类分析逐渐成为聚类分析的主流。

2.FCM的属性模型

具体的推导公式看<<参考博客1>>

现在提出一个具体的问题,我们有数据集X,有n个数据,要把这些数据化成c类,每个类都有一个对应的中心C,每个样本j属于某一类i的隶属度为uij,所以我们可以得到一个目标函数J(1)和约束条件(2),我们要做的就是求取目标函数的极值?

上述公式中各个符合的意义
- J     代表了目标函数
- c     最后聚合的分类数目
- n     数据集中的数据个数
- uij     样本j属于类i的隶属度
- xj     数据集j的位置
- Ci     类i的中心位置
- m     结合代码发现取(2-6)都可以,是样本的轻缓程度

我们可以发现公式(1)就是由样本的隶属度与样本到类中心的欧氏距离相城组成,公式(2)就是说一个样本属于所有类的隶属度之和为1,公式(1)的物理意义就是当分类

如何解决这个非线性规划问题?
      采用拉格朗日乘数法把约束条件拿到目标函数中去,再把得到的公式分别对Uij,Ci求导数,利用约束条件消减就可以得到下列的结论

      上面两个公式是算法的关键

  • Uij        物理意义是Uij越大,表示点j到i之外的类中心的距离乘积越大,就是远离其他类中心而靠近i类中心,也和隶属度的意义一致
  • Ci       本质上是对样本点加权平均,当i类中心确定后,首先将所有点到该类的隶属度u求和,隶属度除以这个和就是所占的比重乘以xj就是这个点对于这个类i的贡献值

3.FCM的编码

上面的最后两个公式Uij和ci公式中互相包含,所以我们可以随便给一个赋值,然后开始迭代,用U算C,再用C算U…,结束条件可以是迭代多少次或者两次迭代后J值变化小于一个误差

FCM算法的一般步骤为:
**1.确定分类数c,指数m的值,迭代次数(防止达不到所需精度时停止迭代)
2.随机产生Uij,归一化(因为约束条件(2))
—开始循环迭代指定次数
3.根据U计算聚类中心C的位置
4.再根据C去计算U
5.计算目标函数J的大小和上一次迭代J的大小进行,小于要求精度就退出迭代,否则退出迭代
—迭代次数达到要求或者两次J之差小于精度要求
6,计算每个点到所有类Uij的最大值来决定这个点属于哪个类,标识**

具体的代码实现由Matlab的版本<<参考博客2>>和Java可视化版本<<参考博客3>>

你可能感兴趣的:(算法学习,fcm算法,聚类算法,代码实现,Java可视化)