机器学习笔记----Fuzzy c-means(FCM)模糊聚类详解及matlab实现
前言:这几天一直都在研究模糊聚类。感觉网上的文档都没有一个详细而具体的讲解,正好今天有时间,就来聊一聊模糊聚类。
一:模糊数学
我们大家都知道计算机其实只认识两个数字0,1。我们平时写程序其实也是这样if 1 then do.永远这种模式,在这种模式中,一个元素要么属于这个集合,要么不属于这个集合,但是对我们现在介绍的模糊集来说,某个元素可能部分属于这个集合,又可能部分属于另外的集合,显然,例如,一个男人(1表示),一个女人(0表示),但是随着科学技术的发展,出现了人妖这个生物(可能0.3属于男人,0.7属于女人).这样如果用0,1就显得不太恰当了,那我们该如何表示呢,且听我慢慢道来。
开始之前先介绍模糊数学几种不同的名称:
模糊集:给定一个论域 U ,那么从 U 到单位区间 [0,1] 的一个映射称为 U 上的一个模糊集,或 U 的一个模糊子集. 模糊集可以记为 A 。 映射(函数) μA(·) 或简记为 A(·) 叫做模糊集 A 的隶属函数。 对于每个 x ∈ U , μA(x) 叫做元素 x 对模糊集 A 的隶属度。
模糊逻辑:它是一种相对于传统是或者不是的二值逻辑而言的。例如下图:,如果这个人在B里面,那么很好理解,人在B里面为1,但是如果出现下列这种情况呢:
,显然用上述的逻辑就行不通了,但是可以这样表示在(A,B)=(0,6,0.4),o,6在A, 0,4在B,这样完美解决。其实拓展成3,4,5也都一样。类似于,我们看周星驰的赌侠,反派用电脑分析,牌的可能性。其实跟这个道理差不多
模糊矩阵:设R=(rij)mxn,若0<=rij<=1,那么称该矩阵为模糊矩阵。若矩阵元素只有0,1的时候成为布尔矩阵。如果对角线上都是一,则这个矩阵称为自反矩阵、
模糊矩阵的关系以及并交与计算:
假设,
都是模糊矩阵。
交运算:
并运算:
余运算:
例子如下(画的比较丑,请见谅):
模糊矩阵的合成:
设为模糊矩阵,
,为A与B的合成,其中
为模糊矩阵的幂。
定义:若A为n阶方阵,定义:
首先模糊数学的基础就补充到这里了。下面来看看。FCM算法。
二 FCM算法
2.1 FCM算法简介
FCM算法首先是由E. Ruspini提出来的,后来J. C. Dunn与J. C. Bezdek将E. Ruspini算法从硬聚类算法推广成模糊聚类算法。FCM算法是基于对目标函数的优化基础上的一种数据聚类方法。聚类结果是每一个数据点对聚类中心的隶属程度,该隶属程度用一个数值来表示。FCM算法是一种无监督的模糊聚类方法,在算法实现过程中不需要人为的干预。这种算法的不足之处:首先,算法中需要设定一些参数,若参数的初始化选取的不合适,可能影响聚类结果的正确性;其次,当数据样本集合较大并且特征数目较多时,算法的实时性不太好。
2.2 FCM算法的实现原理
我们的FCM算法是从硬划分而来的。
硬划分FCM算法的目标函数: 。U表示原矩阵,p表示聚类中心,dik表示样本点xk与第i个类的样本原型pi之间的失真度,一般是用两个向量之间的距离表示。
软划分FCM的目标函数:。Uik表示xk与第i类样本的隶属度。
一般性模糊聚类分析的目标函数: ,其中m>1.dik是一种距离范数,可以表示为
,A表示权重。
求解过程如下(把我以前写的截图发来):
得到:
求解聚类中心:
得到聚类中心:
FCM算法执行流程:
安利一波(百度脑图,这是我认为百度做的比较有良心的东西了。我这个就是用百度脑图画的)
三 FCM的Matlab实现
function [U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm(Data,C,plotflag,M,epsm)
% 模糊 C 均值聚类 FCM: 从随机初始化划分矩阵开始迭代
% [U,P,Dist,Cluster_Res,Obj_Fcn,iter] = fuzzycm(Data,C,plotflag,M,epsm)
% 输入:
% Data: N×S 型矩阵,聚类的原始数据,即一组有限的观测样本集,
% Data 的每一行为一个观测样本的特征矢量,S 为特征矢量
% 的维数,N 为样本点的个数
% C: 聚类数,1
% plotflag: 聚类结果 2D/3D 绘图标记,0 表示不绘图,为缺省值
% M: 加权指数,缺省值为 2
% epsm: FCM 算法的迭代停止阈值,缺省值为 1.0e-6
% 输出:
% U: C×N 型矩阵,FCM 的划分矩阵
% P: C×S 型矩阵,FCM 的聚类中心,每一行对应一个聚类原型
% Dist: C×N 型矩阵,FCM 各聚类中心到各样本点的距离,聚类中
% 心 i 到样本点 j 的距离为 Dist(i,j)
% Cluster_Res: 聚类结果,共 C 行,每一行对应一类
% Obj_Fcn: 目标函数值
% iter: FCM 算法迭代次数
% See also: fuzzydist maxrowf fcmplot
if nargin<5
epsm=1.0e-6;
end
if nargin<4
M=2;
end
if nargin<3
plotflag=0;
end
[N,S]=size(Data);m=2/(M-1);iter=10000;
Dist(C,N)=0; U(C,N)=0; P(C,S)=0;
% 随机初始化划分矩阵
U0 = rand(C,N);
U0=U0./(ones(C,1)*sum(U0));
% FCM 的迭代算法
while true
% 迭代计数器
iter=iter+1;
% 计算或更新聚类中心 P
Um=U0.^M;
P=Um*Data./(ones(S,1)*sum(Um'))';
% 更新划分矩阵 U
for i=1:C
for j=1:N
Dist(i,j)=fuzzydist(P(i,:),Data(j,:));
end
end
U=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m))));
% 目标函数值: 类内加权平方误差和
if nargout>4 | plotflag
Obj_Fcn(iter)=sum(sum(Um.*Dist.^2));
end
% FCM 算法迭代停止条件
if norm(U-U0,Inf) break
end
U0=U;
end
% 聚类结果
if nargout > 3
res = maxrowf(U);
for c = 1:
v = find(res==c);
Cluster_Res(c,1:length(v))=v;
end
end
% 绘图
if plotflag
fcmplot(Data,U,P,Obj_Fcn);
end
我用的数据集聚类结果:
感觉效果好挺好的。
今天的模糊聚类就讲到这里了希望大家点个关注,以及批评指正。
机器学习笔记----Fuzzy c-means(FCM)模糊聚类详解及matlab实现的更多相关文章
- Ext.Net学习笔记22:Ext.Net Tree 用法详解
Ext.Net学习笔记22:Ext.Net Tree 用法详解 上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat=&q ...
- Ext.Net学习笔记23:Ext.Net TabPanel用法详解
Ext.Net学习笔记23:Ext.Net TabPanel用法详解 上面的图片中给出了TabPanel的一个效果图,我们来看一下代码: <ext:TabPanel runat="se ...
- Elastic Stack 笔记(六)Elasticsearch5.6 搜索详解
博客地址:http://www.moonxy.com 一.前言 Elasticsearch 主要包含索引过程和搜索过程. 索引过程:一条文档被索引到 Elasticsearch 之后,默认情况下 ES ...
- web前端学习(三)css学习笔记部分(4)-- CSS选择器详解
4. 元素选择器详解 4.1 元素选择器 4.2 选择器分组 用英文逗号","相连,使用相同的样式表 使用通配符对所有元素进行通用设定. 4.3 类选择器详解 4.3.1. ...
- Mybatis-生成逆向工程后对数据库的模糊查询详解
MyBatis-使用逆向工程中方法进行模糊查询 1.应用mybatis逆向工程会大大的提高我们的开发效率,如何应用mabatis 逆向生成的代码进行模糊查询那. 2.首先看一下pojo 层中examp ...
- [原创]java WEB学习笔记55:Struts2学习之路---详解struts2 中 Action,如何访问web 资源,解耦方式(使用 ActionContext,实现 XxxAware 接口),耦合方式(通过ServletActionContext,通过实现 ServletRequestAware, ServletContextAware 等接口的方式)
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Ext.Net学习笔记07:Ext.Net DirectMethods用法详解
使用DirectMethods在JS中调用C#方法 我承认,这个标题有点噱头,其实应该是通过DirectMethods,在JS中通过异步调用的方式执行服务器端的方法. 来看一个例子吧: [Direct ...
- Spark应用HanLP对中文语料进行文本挖掘--聚类详解教程
软件:IDEA2014.Maven.HanLP.JDK: 用到的知识:HanLP.Spark TF-IDF.Spark kmeans.Spark mapPartition; 用到的数据集:http:/ ...
- 基于机器学习和TFIDF的情感分类算法,详解自然语言处理
摘要:这篇文章将详细讲解自然语言处理过程,基于机器学习和TFIDF的情感分类算法,并进行了各种分类算法(SVM.RF.LR.Boosting)对比 本文分享自华为云社区<[Python人工智能] ...
随机推荐
- 关于Xcode8打印一堆log问题
最近太忙了,一直没时间 写博客,项目基本搞完了,这几天没事多写几篇博客.欢迎加群交流iOS技术,QQ交流群:45992174. 刚装的xcode8,不知道从哪来的一堆log 去除方法:Xcode8-- ...
- Java多线程中的死锁问题
Java程序基本都要涉及到多线程,而在多线程环境中不可避免的要遇到线程死锁的问题.Java不像数据库那么能够检测到死锁,然后进行处理,Java中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能 ...
- github入门到上传本地项目
GitHub是基于git实现的代码托管.git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好. GitHub可以免费使用,并且快速稳定.即使是付费帐户,每个月不超过10美刀的费用也非常便宜. ...
- Java Web中的中文编码
Java Web开发中经常会遇到中文编码问题,那么为什么需要编码呢?因为人类需要表示的符号太多,无法用1个字节来表示,而计算机中存储信息最小单元为1个字节.所以必须指定char与byte之间的编码规则 ...
- [AR]高通Vuforia Getting Started
Vuforia Getting Started 简介 Vuforia创建增强现实应用程序是一个软件平台.开发人员可以轻松地将先进的计算机视觉功能添加到任何应用程序中,允许它识别图像和对象,或在现实 ...
- [收集]MVC3 HTML辅助方法集录
1.跳转链接 @Html.ActionLink("linkText","actionName",routeValues,htmlAttributes) e.g& ...
- Spring Mock
今天看别人的测试代码,发现有 MockMvc.MockHttpServletRequest.MockHttpServletResponse ,不知道是干啥的,百度下下才知道 Mock这个东东. 下 ...
- /var/log/messages
messages 该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵,包括整体系统信息,是系统最核心的日志.它包含了系统启动时的引导消息,以及系统运行时的其他状态消息.IO ...
- Android 6.0 运行时权限处理完全解析
一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http:// ...
- SpringMVC(五) RequestMapping 请求参数和请求头
可以通过在@RequestMapping的params参数中设置可以传入的参数,且支持简单的表达式,如以下格式: @RequestMapping(value="helloRWorld&quo ...