FuzzyC-Means

模糊c-均值聚类算法 fuzzy c-means algorithm(FCMA)或(FCM)。模糊c均值聚类算法,是当前模糊系统里表现比较好的算法之一 其特征与k-means相似,也是基于距离来判断分类。模糊c均值需要用户提供除数据之外至少一个参数,而这个参数与k-means中的k类似。

模糊c-均值聚类算法意在求解一个最小化问题即:

其中,uij为样本xj属于第i类的隶属度,故u是一个c×n的矩阵,xj就是第j个样本数据,ci为第i个聚类中心一共有c个,m则是一个大于1的加权常数一般取2,可由用户定义。 在这里每个样本对于不同类的隶属度之和被限制为1,但一般情况下模糊集合的隶属度通常加起来不为1。接下来我们需要把这个条件极值问题转化为无条件的极值问题, 这里用到的方法就是拉格朗日乘子法:

然后需要对各个变量求导,以求得使得原式最小的变量值。对聚类的中心C求导:

其中,

故:

然后,

最后,

至此聚类中心C的迭代公式已确认,接下来就是模糊矩阵u的迭代推导。

第一部分,先对条件式的前半部分对u进行求导。

然后再求后半部分。

将两部分叠加。

最后u的迭代公式:

(以上参考至:https://www.cnblogs.com/wxl845235800/p/11053261.html)

接下来我们就可以根据两个迭代公式将算法轻松地编程。初始模糊矩阵取随机数,采用的分类数据为鸢尾花数据集,m设置为2,截至条件为u的二范数变化小于1e-4.

function [V,F]=FSC(X,C,m)
[n,D]=size(X);
if D>nX=X';[n,D]=size(X);
end
if nargin==2m=2;
end
old=0;
A=rand(C,n);
A=oneness(A,n);
new=norm(A);
while abs(new-old)>1e-4
old=new;
V=updataV(A);
A=updataA(X,V);
new=norm(A);
[~,index]=max(A);
end
F=zeros(C,n);
for f=1:nF(index(f),f)=1;
end
if D>2X=zscore(X); %数据标准化[~,~,latent]=pca(X); %PCA降维[~,b]=sort(latent,'descend');X=X(:,b(1:2)); %取前两维绘图PlotClusterinResult(X,index);
end
if D==2PlotClusterinResult(X,index);
end
function A=oneness(A,n)
for i=1:n %模糊矩阵概率归一A(:,i)=A(:,i)/sum(A(:,i));
end
endfunction V=updataV(A)
V=zeros(D,C);
for i=1:CV(:,i)=(A(i,:).^m*X)'/sum(A(i,:).^m);
end
endfunction A=updataA(X,V)
A=zeros(C,n);
for i=1:Cfor j=1:nA(i,j)=1/sum((norm(X(j,:)'-V(:,i))./norm(X(j,:)'-V)).^(1/(m-1)));end
end
A=oneness(A,n);
end
end
function PlotClusterinResult(X, IDX)
k=max(IDX);
Colors=hsv(k);
Legends = {};
for i=0:k        Xi=X(IDX==i,:);        if i~=0            Style = 'x';            MarkerSize = 8;            Color = Colors(i,:);            Legends{end+1} = ['Cluster #' num2str(i)];        elseStyle = 'o';MarkerSize = 6;            Color = [0 0 0];            if ~isempty(Xi)                Legends{end+1} = 'Noise';            endendif ~isempty(Xi)            plot(Xi(:,1),Xi(:,2),Style,'MarkerSize',MarkerSize,'Color',Color);        endhold on;
end
hold off;
axis equal;
grid on;
legend(Legends);
legend('Location', 'NorthEastOutside');
end

测试Matlab自带fisheriris数据集。

FSC(meas,3)

结果如下图:

FuzzyCMeans算法相关推荐

  1. 图像处理之K-Means算法演示

    一:数学原理 K-Means算法的作者是MacQueen, 基本的数学原理很容易理解,假设有一个像素 数据集P.我们要根据值不同将它分为两个基本的数据集合Cluster1, Cluster2,使 用K ...

  2. 常见空间聚类算法优劣概述

    1.        空间数据对空间聚类算法的要求 1)       空间拓扑关系 2)       密度问题 3)       空间簇形态多样性 2.        空间聚类算法分析 1)       ...

  3. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  4. 通用解题法——回溯算法(理解+练习)

    积累算法经验,积累解题方法--回溯算法,你必须要掌握的解题方法! 什么是回溯算法呢? 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就&quo ...

  5. 伍六七带你学算法 进阶篇-生命游戏

    有趣的算法题–生命游戏 难度-中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 想要体验生命游戏的小伙伴可以到这里-->生命游戏 进入 ...

  6. 伍六七带你学算法 进阶篇-排序算法

    给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 各排序算 ...

  7. 伍六七带你学算法 入门篇-卡牌分组

    力扣-914. 卡牌分组 难度-简单 这是一道非常有趣的题,提交通过率令人深思 ,思考它是不是一道简单的题- 开始正题: 给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以 ...

  8. 伍六七带你学算法 入门篇-最小的k个数

    java面试题-最小的k个数 难度-简单 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:a ...

  9. 十大算法,描述+代码+演示+分析+改进(赶紧收藏!)

    十大算法 1.冒泡排序 ​ (1)算法描述 ​ 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要 ...

最新文章

  1. gis 大屏_胡中南:Web端GIS技术新进展 | (PPT+速记)
  2. android实现计算器功能吗,利用Android实现一个简单的计算器功能
  3. QoS是否提供更多带宽?-Vecloud
  4. python的引用计数分析(二)
  5. 2、异步HTTP编程
  6. LeetCode 题 - 88. 合并两个有序数组
  7. 概率论和数理统计 - 03 - 多维随机变量及其分布
  8. java 数组的应用(一维)
  9. ORA-28000 the account is locked的解决办法
  10. Web编程学习一: 使用JSF来创建Web应用
  11. 上帝掷骰子吗--量子物理史话
  12. git bash批量dos2unix
  13. pcs9000系统plat服务器,CSD361現场调试手册.docx
  14. 前端工程师的摸鱼日常(1)
  15. php fpdf生成个人简历,php生成PDF文件(FPDF)
  16. sqli-labs 8
  17. 工业路由器的端口映射方法 NAT/DMZ/UPNP
  18. 恒生电子实习记录-14
  19. 如何从RNN起步,一步一步通俗理解LSTM
  20. BetaFlight模块设计之三十二:MSP协议模块分析

热门文章

  1. 使用第三方SDK(如微信、qq、快看、头条等),调用接口405 Method Not Allowed
  2. MybatisPlus忽略实体类中的非数据库字段、JPA忽略实体类中的非数据库字段、HeHibernate忽略实体类中的非数据库字段
  3. Mysql,SqlServer,Oracle主键自动增长的设置
  4. Go 语言同一个包内函数调用、包名和实际路径最后一个目录不一致问题
  5. docker 常用命令集合
  6. mapreduce理解_大数据
  7. 当pip安装因为网络超时而无法安装的时候慢
  8. Google Colab 免费GPU服务器使用教程 挂载云端硬盘
  9. AndroidSDK结合SpringBoot实现支付宝支付功能
  10. LeetCode简单题之找到小镇的法官