fcm算法的MATLAB实现

2023-11-10

fcm算法

分析:

1.算法中包含的参数:
a.模糊因子expo(expo>1)
b.最大迭代次数max_t
c.迭代终止条件ε

2.算法中包含的过程:
a.目标函数
b.欧式距离
c.隶属矩阵
d.聚类中心
e.迭代过程

还有  不要忘记!!初始化!!

3.实现代码过程中需要写成子函数的部分:
a.初始化函数initfcm() (主要实现隶属度矩阵的初始化)
b.一次聚类过程stepfcm()(包含目标函数,隶属矩阵的计算等等)
c.距离函数distfcm()
d.画图函数plotfcm()


代码实现:

· 函数定义–左边是输出参数,右边是函数名以及输入参数

主函数:

function[center, U, obj_fcn] = fcm_final(data,c,options)
% 输入:
% data 数据集 n行m列,n为样本数据数,m为数据的特征数
% c 聚类中心的个数
%options(1): 隶属度矩阵U的指数expo,>1(缺省值: 2.0)
%options(2): 最大迭代次数max_t(缺省值: 100)
%options(3): 隶属度最小变化量e,迭代终止条件(缺省值: 1e-5)
%options(4): 每次迭代是否输出信息标志(缺省值: 1)
% 输出:
% U 隶属度矩阵
% center 聚类中心
% obj_fcn 目标函数

if nargin ~= 2 && nargin ~= 3
    error('Too many or too few input argument! ');
end
data_n = size(data, 1);
data_m = size(data, 2);

default_options = [2; 100; 1e-5; 1];


if nargin == 2,
    options = default_options;
else 

    if length(options) < 4,
        temp = default_options;
        temp(1:length(options)) = options;
        options = temp;
    end
    
    nan_index = find(isnan(options) == 1);
    options(nan_index) = default_options(nan_index);
    if options(1) <= 1,
        error('The exponent should be greater than 1 !');
    end
    
end


expo = options(1);
max_t = options(2);
e = options(3);
display = options(4);

obj_fcn = zeros(maxt, 1);
U = initfcm(c, data_n);

for i = 1 : max_t
    [U, center, obj_fcn(i)] = stepfcm(data, U, c, expo);
    if display,
        fprintf('FCM:Iteration count = %d, obj_fcn = %f\n',i,obj_fcn(i));
        plotfcm(data,center,U,obj_fcn);
    end
    
    if i > 1,
        if abs(obj_fcn(i) - obj_fcn(i-1)) < e,
            break;
        end
    end
    
end
iter_n = i;

obj_fcn(iter_n + 1 : max_t) = [];
end



> 子函数:

**1.初始化函数initfcm()**

% U–> c * n(c行n列) ,c为聚类数, n为样本数
%% 初始化隶属矩阵时需要已知矩阵的行和列,因此输入应该为该矩阵的行和列

% 输入: c, data_n
% data_n 数据集data所含的样本数
% c 这组数据的聚类数
% 输出:U(初始化之后的隶属矩阵)

function[U] = initfcm(c, data_n)
U = rand(c, data_n);
col_sum = sum(U);

U = U./col_sum(ones(c,1), : );
end



**2.一次聚类过程stepfcm()**

% 一次聚类包含的过程:
% % (1)计算聚类中心,(2)目标函数,(3)距离函数,(4)计算新的隶属矩阵

% 输入:data,U,c,expo(模糊因子)
% 输出:U_new(新的隶属矩阵),center(聚类中心),obj_fcn(目标函数)

function[U_new, center, obj_fcn] = stepfcm(data, U, c, expo)
mf = U.^expo;
center = mf*data./((ones(size(data,2),1)*sum(mf’))’));
dist = distfcm(center, data);
obj_fcn = sum(sum(dist.^2 * mf));
temp = dist.^(-2/(expo-1));
U_new = temp./(ones(c,1)*sum(temp));
end




**3.距离函数distfcm()**

% 输入:data, center
% 输出:out

function out = disfcm(center,data)
out = zeros(size(center, 1), size(data, 1));
for k = 1:size(center, 1)
out(k,:) = sqrt(sum(((data - ones(size(data,1),1)*center(k,:)).^2)’,1));
end
end


**4.画图函数plotfcm()**

% 输入:data, center, U, obj_fcn
% 对fcmdata.dat(MATLAB自带的聚类数据集,有两个类)进行聚类

function plotfcm(data,center,U,obj_fcn)

figure(1)
subplot(2,1,1);
plot(U(1,:),’-b’);
title(‘隶属度矩阵值’)
ylabel(‘第一类’)
subplot(2,1,2);
plot(U(2,:),’-r’);
ylabel(‘第二类’)
xlabel(‘样本数’)

figure(2)
grid on
plot(obj_fcn);
title(‘目标函数变化值’);
xlabel(‘迭代次数’)
ylabel(‘目标函数值’)

figure(3)
title(‘聚类图像’);
plot(data(:,1),data(:,2),’*r’);
maxU = max(U);
index1 = find(U(1,:)==maxU);
index2 = find(U(2,:)==maxU);
plot(data(index1,1),data(index1,2),’*g’);
hold on
plot(data(index2,1),data(index2,2),’*r’);
plot(center(1,1),center(1,2),‘oy’,‘Markersize’,5,‘linewidth’,3)
plot(center(2,1),center(2,2),‘ob’,‘Markersize’,5,‘linewidth’,3)
hold off;
end



> 聚类结果

![这里写图片描述](https://img-blog.csdn.net/20180730115135432?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2luX25vY2VuY2U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)




> 收获心得

%%   由于具有4个特征值的鸢尾花数据集是四维的,无法在图像中展示,可采用两两比对的方式展现。
%% 代码中的隶属度矩阵啊聚类中心啊目标函数啊等等这些表示实际上都是将算法中的数学计算式转化成矩阵问题,要注意理解。












本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fcm算法的MATLAB实现 的相关文章

  • 将 3d 矩阵重塑为 2d 矩阵

    我有一个 3d 矩阵 n by m by t 在 MATLAB 中表示n by m一段时间内网格中的测量值 我想要一个二维矩阵 其中空间信息消失了 只有n m随着时间的推移测量t剩下 即 n m by t 我怎样才能做到这一点 你需要命令r
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • 在 C/C++ 中调用 MATLAB API

    我刚刚从某处听说 对于数值计算 MATLAB 确实提供了一些用户友好的 API 如果你在 C C 代码中调用这些 API 你可以显着加快计算速度 但我在MATLAB文档中没有找到这样的信息 例如http www mathworks com
  • 这是 `min` 和 `nanmin` 之间的区别; Matlab 中的“max”和“nanmax”?

    Matlab描述nanmin and nanmax像这样 NANMIN最小值 忽略NaNs NANMAX最大值 忽略NaNs 但实际上 min and max ignore NaNs too 那我应该使用哪个 根据我的测试 nanmin a
  • 整数的十进制表示形式中的分隔数字

    例如 我想将用户输入作为整数输入 45697 并将前两位数字存储在数组 向量或其他内容中 例如 4 5 6 9 7 这样我就可以使用一些函数调用来检查前两个值 4 5 并对它们进行计算 问题 我不知道如何存储恢复前两个值 有没有简单的函数调
  • 如何从绘图处理程序中绘图?

    我有绘图的处理程序或图形的处理程序 例子 h plot 1 0 2 10 xx get h xx DisplayName Annotation 1x1 handle Color 0 0 1 LineStyle LineWidth 0 500
  • 优化 MATLAB 代码(嵌套 for 循环计算相似度矩阵)

    我正在 MATLAB 中基于欧几里德距离计算相似度矩阵 我的代码如下 for i 1 N M N is the size of the matrix x for whose elements I am computing similarit
  • 如何在Matlab中将世界坐标转换为像素索引

    我有 512x512x313 体积的 dicom 图像 并且我有一个以世界坐标表示的点 57 7475 63 4184 83 1515 我如何在 Matlab 中获得该世界坐标的相应像素坐标 我不想戳破你的幻想 但你所要求的是不可能的 我能
  • 使用 R2010b 中的符号工具箱来求解和/或 linsolve

    我前几天问了一个问题here https stackoverflow com questions 20317038 matlab linear congruence solver that supports a non prime modu
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 垂直子图的单一颜色条

    我想让下面的 MATLAB 图有一个沿着两个子图延伸的颜色条 像这样的事情 使用图形编辑器手动完成 Note 这与提出的问题不同here https stackoverflow com questions 39950229 matlab t
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • 如何使用Matlab将数据保存到Excel表格中?

    我想将数据以表格形式保存在 Excel 工作表中 它应该看起来像 Name Age R no Gpa Adnan 24 18 3 55 Ahmad 22 12 3 44 Usman 23 22 3 00 每次当我执行我的文件时类数据 m 下
  • Matlab 图像数据的 hist 函数

    我是 Matlab 新手 我想制作自己的函数 与 imhist 显示图像数据的直方图 完成相同的工作 但我对此完全是新手 我不知道如何做开发这样的功能 我开始做一些东西 但它非常不完整 function output args myhist
  • 命令 A(~A) 在 matlab 中的真正作用是什么

    我一直在寻找找到矩阵非零最小值的最有效方法 并在论坛上找到了这个 设数据为矩阵A A A nan minNonZero min A 这是非常短且高效的 至少在代码行数方面 但我不明白当我们这样做时会发生什么 我找不到任何关于此的文档 因为它
  • for 循环中的绘图没有可见点

    我正在努力解决我想使用 for 循环制作的情节 我知道当我在循环之后添加它时它会起作用 只是一个简单的图 但我想用另一种方式尝试一下 fib ones 1 10 for k 3 10 hold on fib k fib k 1 fib k
  • 获取向量幂的有效方法

    我编写了一个代码 在数值上使用勒让德多项式直至某个高 n 阶 例如 case 8 p 6435 x 8 12012 x 6 6930 x 4 1260 x 2 35 128 return case 9 如果向量x太长这会变得很慢 我发现说之
  • FMINCON 的替代方案

    除了 fmincon 之外还有其他更快 更高效的求解器吗 我正在使用 fmincon 来解决特定问题 但对于中等大小的向量变量来说 我的内存不足 我也没有任何超级计算机或云计算选项可供使用 我知道任何替代解决方案仍然会耗尽内存 但我只是想看
  • 通过多次合并相同的行向量来构建矩阵

    有没有一个matlab函数可以让我执行以下操作 x 1 2 2 3 然后基于x我想建立矩阵m 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 您正在寻找REPMAT http www mathworks com help t
  • MATLAB - 通过垂直连接子矩阵重新排列矩阵

    我在执行以下任务时遇到问题 假设一个 3x6 矩阵 A 0 2787 0 2948 0 4635 0 8388 0 0627 0 0435 0 6917 0 1185 0 3660 0 1867 0 2383 0 7577 0 6179 0

随机推荐

  • 程序环境和预处理详解

    你好 我是史丰源 欢迎你的来访 希望我的博客能给你带来一些帮助 我的Gitee 代码仓库 我的联系方式 QQ 1756786195 邮箱 Marksky126 outlook com 程序环境和预处理 一 程序的翻译环境和执行环境 二 详解
  • Linux中gcc的常用命令

    目录 一 简介 二 简单编译 1 预处理 2 编译 3 汇编 4 连接 5 执行 三 多个程序文件的编译 四 检错 五 库文件连接 1 编译成可执行文件 2 链接 3 强制链接时使用静态链接库 六 小结 七 参考文献 一 简介 GCC 是编
  • Ubuntu安装Python3

    Python2中文的解决 在py文件第一行添加 coding utf 8 规范的应该这么写 coding utf 8 安装python 系统默认安装Python2 安装Python3的命令 sudo apt get install pyth
  • Python实现爬虫的简单示例

    Python实现爬虫 一 介绍 网络爬虫是一种自动获取互联网信息的程序 可以用于抓取各种网站上的数据 本文将介绍如何使用Python编写一个简单的爬虫 来抓取文章 二 环境准备 在开始编写爬虫之前 需要安装Python和相关的第三方库 请确
  • 【Java】猜数字游戏(面向对象 封装成类)

    一 猜数字游戏类 menu 公开 方法 参数 无 返回值 无 主要是显示菜单 并决定是否进入游戏 guessNumber 私有 方法 参数1 生成的随机幸运数 0 100 参数2 Scanner对象 应为主方法中已生成过了 所以直接传进来用
  • Python+获取外网IP+并发送指定邮件 (一)

    需求 如果我们家里或者公司有nas服务器 或者其他需要外网访问的设备及应用 我们应怎么做 1 拉专线 运营商会给你公网ip 除大公司或企业以外不推荐 优点 网速快 带宽高 且ip固定 缺点 烧钱 2 使用软件做域名解析 如 某生壳 某桌互联
  • Kubernetes 的证书认证

    今天让我们聊聊 Kubernetes 的公私钥和证书认证 本文内容会提及如何根据需要对 CA 公私钥进行组织并对集群进行设置 Kubernetes 的组件中有很多不同的地方可以放置证书之类的东西 在进行集群安装的时候 我感觉有一百多亿个不同
  • JavaScript 闭包

    目录 全局变量 实例 实例 变量的生命周期 一个计数器的困境 实例 实例 实例 JavaScript 嵌套函数 实例 JavaScript 闭包 实例 例子解释 闭包的概念 闭包的特点 使用闭包的注意点 参考资料 JavaScript 变量
  • 文件IO(二.标准IO)

    标准IO 1 为什么需要标准IO 每个操作系统下面 对文件的管理和接口是不一样 linux open read write window winopen 同一个文件 在不同的操作系统下面 操作文件的代码是不一样 此时 代码就比较难写 我们在
  • 添加halcon图像显示控件_C#与Halcon联合编程步骤

    1 编程环境 Windows10 64位 VS2013 Halcon12 64位 2 第一步 配置环境变量 path C ProgramFilesMVTecHALCON 12 0bindotnet35 和 C Program FilesMV
  • 用这个工具,发朋友圈都可以自动了

    今天推荐是一个比较骚气的工具 自动发朋友圈 不用root手机 对于一天发10多条 甚至20条朋友圈的朋友 每次编辑比较麻烦 我之前也写过抢红包工具 当时上架应用市场时 又恰逢过年 那下载量 比我吃了一桶老坛酸菜面还爽 后来由于应用市场的限制
  • 14-QDockWidget

    QDockWidget QDockWidget border 1px solid red titlebar close icon url images 111 bmp titlebar normal icon url images clos
  • 2023!6招玩转 Appium 自动化测试

    Appium是个什么鬼 Appium是一个移动端的自动化框架 可用于测试原生应用 移动网页应用和混合型应用 且是跨平台的 可用于IOS和Android以及firefox的操作系统 原生的应用是指用android或ios的sdk编写的应用 移
  • 安装博图时出现缺少.net3.5sp1解决办法

    第一步 打开控制面板 点击程序 第二步 点击启用或关闭Windows功能 第三步 勾选如图所示的三个选择框 点击确定 第四步 点击让Windows更新为你下载文件 第五步 等待安装完成 安装过程失败出现错误的解决办法 作者安装失败的原因是因
  • ACmix 自注意力和卷积集成 On the Integration of Self-Attention and Convolution+

    自注意力和卷积 自注意力 1 1 卷
  • 去除 

    python 的strip 可以去除特殊空格 关于特殊空格 nbsp可以参考 http love67 net 2017 04 07 trim nbsp nbsp的unicode编码是160 正常的空格Unicode编码是32 gt gt g
  • Tomcat 弱密码爆破 漏洞复现

    Tomcat 弱密码爆破 漏洞复现 一 漏洞描述 二 漏洞影响 三 漏洞复现 1 环境搭建 2 漏洞复现 四 漏洞POC 五 参考链接 一 漏洞描述 Tomcat有一个管理后台 其用户名和密码在Tomcat安装目录下的conf tomcat
  • 处理点云数据(一):点云与生成鸟瞰图

    点云数据 点云数据一般表示为N行 至少三列的numpy数组 每行对应一个单独的点 所以使用至少3个值的空间位置点 X Y Z 来表示 如果点云数据来自于激光雷达传感器 那么它可能有每个点的附加值 在KITTI数据中就有一个 反射率 这是衡量
  • blockly开始使用

    开始使用 本文档面向希望创建自己的应用程序的开发人员 这些应用程序将Blockly集成为代码编辑器 假定人们通常熟悉Blockly的用法 并且对HTML和JavaScript有基本的了解 总览 Blockly旨在轻松安装到您的Web应用程序
  • fcm算法的MATLAB实现

    fcm算法 分析 1 算法中包含的参数 a 模糊因子expo expo gt 1 b 最大迭代次数max t c 迭代终止条件 2 算法中包含的过程 a 目标函数 b 欧式距离 c 隶属矩阵 d 聚类中心 e 迭代过程 还有 不要忘记 初始