Matlab中的FCM算法代码及中文详解

2023-11-13

Matlab中的FCM算法代码及中文详解

转自:http://xiaozu.renren.com/xiaozu/106512/336681453

function [center, U, obj_fcn] = FCMClust(data, cluster_n, options)
% FCMClust.m   采用模糊C均值对数据集data聚为cluster_n类
%
% 用法:
%   1.  [center,U,obj_fcn] = FCMClust(Data,N_cluster,options);
%   2.  [center,U,obj_fcn] = FCMClust(Data,N_cluster);
%  
% 输入:
%   data        ---- nxm矩阵,表示n个样本,每个样本具有m的维特征值
%   N_cluster   ---- 标量,表示聚合中心数目,即类别数
%   options     ---- 4x1矩阵,其中
%       options(1):  隶属度矩阵U的指数,>1                  (缺省值: 2.0)
%       options(2):  最大迭代次数                           (缺省值: 100)
%       options(3):  隶属度最小变化量,迭代终止条件           (缺省值: 1e-5)
%       options(4):  每次迭代是否输出信息标志                (缺省值: 1)
% 输出:
%   center      ---- 聚类中心
%   U           ---- 隶属度矩阵
%   obj_fcn     ---- 目标函数值
%   Example:
%       data = rand(100,2);
%       [center,U,obj_fcn] = FCMClust(data,2);
%       plot(data(:,1), data(:,2),'o');
%       hold on;
%       maxU = max(U);
%       index1 = find(U(1,:) == maxU);
%       index2 = find(U(2,:) == maxU);
%       line(data(index1,1),data(index1,2),'marker','*','color','g');
%       line(data(index2,1),data(index2,2),'marker','*','color','r');
%       plot([center([1 2],1)],[center([1 2],2)],'*','color','k')
%       hold off;

 

if nargin ~= 2 & nargin ~= 3,    %判断输入参数个数只能是2个或3个
 error('Too many or too few input arguments!');
end

data_n = size(data, 1); % 求出data的第一维(rows)数,即样本个数
in_n = size(data, 2);   % 求出data的第二维(columns)数,即特征值长度
% 默认操作参数
default_options = [2; % 隶属度矩阵U的指数
    100;                % 最大迭代次数
    1e-5;               % 隶属度最小变化量,迭代终止条件
    1];                 % 每次迭代是否输出信息标志

if nargin == 2,
 options = default_options;
 else       %分析有options做参数时候的情况
 % 如果输入参数个数是二那么就调用默认的option;
 if length(options) < 4, %如果用户给的opition数少于4个那么其他用默认值;
  tmp = default_options;
  tmp(1:length(options)) = options;
  options = tmp;
    end
    % 返回options中是数的值为0(如NaN),不是数时为1
 nan_index = find(isnan(options)==1);
    %将denfault_options中对应位置的参数赋值给options中不是数的位置.
 options(nan_index) = default_options(nan_index);
 if options(1) <= 1, %如果模糊矩阵的指数小于等于1
  error('The exponent should be greater than 1!');
 end
end
%将options 中的分量分别赋值给四个变量;
expo = options(1);          % 隶属度矩阵U的指数
max_iter = options(2);  % 最大迭代次数
min_impro = options(3);  % 隶属度最小变化量,迭代终止条件
display = options(4);  % 每次迭代是否输出信息标志

obj_fcn = zeros(max_iter, 1); % 初始化输出参数obj_fcn

U = initfcm(cluster_n, data_n);     % 初始化模糊分配矩阵,使U满足列上相加为1,
% Main loop  主要循环
for i = 1:max_iter,
    %在第k步循环中改变聚类中心ceneter,和分配函数U的隶属度值;
 [U, center, obj_fcn(i)] = stepfcm(data, U, cluster_n, expo);
 if display,
  fprintf('FCM:Iteration count = %d, obj. fcn = %f\n', i, obj_fcn(i));
 end
 % 终止条件判别
 if i > 1,
  if abs(obj_fcn(i) - obj_fcn(i-1)) < min_impro,
            break;
        end,
 end
end

iter_n = i; % 实际迭代次数
obj_fcn(iter_n+1:max_iter) = [];


% 子函数
function U = initfcm(cluster_n, data_n)
% 初始化fcm的隶属度函数矩阵
% 输入:
%   cluster_n   ---- 聚类中心个数
%   data_n      ---- 样本点数
% 输出:
%   U           ---- 初始化的隶属度矩阵
U = rand(cluster_n, data_n);
col_sum = sum(U);
U = U./col_sum(ones(cluster_n, 1), :);

 

% 子函数
function [U_new, center, obj_fcn] = stepfcm(data, U, cluster_n, expo)
% 模糊C均值聚类时迭代的一步
% 输入:
%   data        ---- nxm矩阵,表示n个样本,每个样本具有m的维特征值
%   U           ---- 隶属度矩阵
%   cluster_n   ---- 标量,表示聚合中心数目,即类别数
%   expo        ---- 隶属度矩阵U的指数                     
% 输出:
%   U_new       ---- 迭代计算出的新的隶属度矩阵
%   center      ---- 迭代计算出的新的聚类中心
%   obj_fcn     ---- 目标函数值
mf = U.^expo;       % 隶属度矩阵进行指数运算结果
center = mf*data./((ones(size(data, 2), 1)*sum(mf'))'); % 新聚类中心(5.4)式
dist = distfcm(center, data);       % 计算距离矩阵
obj_fcn = sum(sum((dist.^2).*mf));  % 计算目标函数值 (5.1)式
tmp = dist.^(-2/(expo-1));    
U_new = tmp./(ones(cluster_n, 1)*sum(tmp));  % 计算新的隶属度矩阵 (5.3)式

 

% 子函数
function out = distfcm(center, data)
% 计算样本点距离聚类中心的距离
% 输入:
%   center     ---- 聚类中心
%   data       ---- 样本点
% 输出:
%   out        ---- 距离
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


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

Matlab中的FCM算法代码及中文详解 的相关文章

  • ResNet50 结构

    ResNet有2个基本的block 一个是Identity Block 输入和输出的dimension是一样的 所以可以串联多个 另外一个基本block是Conv Block 输入和输出的dimension是不一样的 所以不能连续串联 它的
  • centos7 无法启动网络(systemctl start network.service )错误解决办法

    大家安装Centos7 系统后 可能会出现 网卡无法自动启动 需要在图形界面点击有线链接 才能正常上网 在这里就简单说下NetworkManager service 和network service的区别 前者是图像化管理网络连接的网络服务
  • SpringBoot定时任务设置

    1 主启动类加上注解 开启定时任务 EnableScheduling 2 创建定时任务类 import org springframework beans factory annotation Autowired import org sp
  • GAN的编写 - tensorflow形式(tensorflow与GAN同学习,重点分析训练过程)

    20200901 本文完成于20200902下午 前面内容还算整洁 越到后面因为都是自己思考的过程 就导致文章越来越乱 就算是把自己思考的过程给记录下来吧 0 引言 之前的时候对keras框架编写的GAN网络进行了介绍 GAN的学习 训练过
  • 基于控制的角度无人机集群——目标追踪

    无人机集群 目标追踪 前言 一 轨迹预测 二 单目标追踪 三 多目标追踪 前言 关于目标追踪问题 有一些研究是从视觉的角度展开 而我研究的是基于控制的角度 关于多无人机集群的一些知识点 已经在上一篇文章有了简单介绍 这次我想着重介绍一下 目
  • 4.抽样分布的概念与Python实现抽样

    1 总体与样本 在实际中 总体的分布一般是未知的 或只知道它具有某种形式而其中包含着未知参数 这时 常用的办法就是根据样本来推断总体 总体 个体 样本 总体 通常把研究对象的全体称为总体 一个总体对应于一个随机变量X 个体 把组成总体的每个
  • CTFshow 信息收集 web 6 7 8 9 10

    目录 第六关 提示 flag 第七关 提示 知识点 flag 第八关 提示 知识点 flag 第九关 提示 知识点 flag 第十关 提示 flag 第六关 提示 解压源码到当前目录 测试正常 收工 这道题考的是备份文件www zip 根据
  • 解决mysql占用IO过高

    created 2023 01 30T10 14 00 UTC 08 00 tags source https www bbsmax com A Ae5RyA0AJQ author 解决mysql占用IO过高 Excerpt 1 日志产生的

随机推荐

  • 西门子HMI设备与V20变频器如何实现通讯?

    通常情况下 要实现HMI设备与V20变频器的通讯 需要一个支持USS通讯或MODBUS通讯的PLC 比如S7 200系列PLC 其通讯电缆连接如图1所示 PLC的一个通讯端口与触摸屏连接 可以采用PPI协议通讯 PLC的另一个通讯端口与V2
  • C语言自定义类型-结构体

    一 结构体声明 C语言中为我们准备了许多现成的数据类型例如 int short float double char long long long 等等 但是我们描述一些复杂的事物 光靠上述的数据类型是描述不清的 例如 我们描述一个大学生 可
  • 安卓Android_手机安装burp的https_CA证书

    安卓Android 手机安装burp的https CA证书 文章目录 安卓Android 手机安装burp的https CA证书 1 打卡电脑wif热点 手机连上电脑的热点 2 burp点击 Proxy settings 3 点击add 新
  • java 数组中插入元素_Java数组添加元素

    java 数组中插入元素 How to add elements to an array in java We know that java array size is fixed so we can t add elements to a
  • jvm虚拟机所有垃圾回收器详细介绍

    jvm虚拟机所有垃圾回收器详细介绍 文章目录 jvm虚拟机所有垃圾回收器详细介绍 垃圾回收器概述 1 Serial回收器 串行回收 总结 2 ParNew回收器 并行回收 3 Parallel Scavenge回收器 吞吐量优先 4 CMS
  • 论文解读 《Enhancing Underwater Imagery using Generative Adversarial Networks》ICRA2018

    项目 http irvlab cs umn edu enhancing underwater imagery using gans 论文 https arxiv org pdf 1801 04011 pdf 代码 https github
  • 算法精解_C语言 链表_单链表(接口定义+类型实现)

    链表可以说是一种最为基础的数据结构 链表由一组元素以一种特定的顺序组合或链接而成 在维护数据的集合时很有用 这一点同我们常用的数组很相似 然而 链表在很多情况下比数组更有优势 特别是在执行插入和删除操作时链表拥有更高的效率 链表需要动态的开
  • 组件化依赖管理办法

    theme channing cyan 在组件化过程中 面临着非常多的复用 切换等场景 对于组件化中的dsl文件 也可以尝试将其组件出来 更好的复用 更好的管理 一 利用buildSrc buildscript 对dsl 文件进行组件化 1
  • org.postgresql.util.PSQLException: 错误: 关系 “courseinformation“ 不存在

    问题描述 在java项目中连接PSQL数据库 对courseinformation表进行操作时 运行报错 org postgresql util PSQLException 错误 关系 courseinformation 不存在 已知解决方
  • BUUCTF系列 // [极客大挑战 2019] LoveSQL

    前言 本题知识点 SQL注入 WP 这题居然是个连续剧 首先尝试使用上一题的解法绕过看看 上一题 WP 的 传送门 结果如下 注意到密码有些奇怪 尝试着用 MD5 解码失败 也没啥思路 最后事实证明确实也用不到这玩意 故回到 SQL 注入上
  • 人工智能数学基础8:两个重要极限及夹逼定理

    点此跳转到老猿Python博文目录 一 极限公式1 二 极限公式2 e为常数2 71828 变体 使用案例 三 夹逼定理 夹逼定理英文原名Squeeze Theorem 也称两边夹定理 夹逼准则 夹挤定理 挟挤定理 三明治定理 是判定极限存
  • JAVA程序设计:最短回文串(LeetCode:214)

    给定一个字符串 s 你可以通过在字符串前面添加字符将其转换为回文串 找到并返回可以用这种方式转换的最短回文串 示例 1 输入 aacecaaa 输出 aaacecaaa 示例 2 输入 abcd 输出 dcbabcd 思路 这题O N 2
  • python-selenium-运行js代码--下拉操作

    使用python selenium运行js代码完成下拉操作 在某些情况 当我们下拉到浏览器 浏览器才会给我们加载数据 所有我们需要js带代码 driver execute script 写入你要执行的js代码 下拉的js代码 documen
  • 什么是CRUD( What is CRUD)?

    在很多技术性的文章 特别是有关数据库类的文章中 经常会看到一个缩写 CRUD 那什么是CRUD呢 CRUD其实是数据库基本操作中的Create 创建 ReadRetrieve 读取 Update 更新 Delete 删除 而这里的Creat
  • pycharm中pygame模块的安装与用法

    一 pygame的安装 本文章主要展示pycharm中的pygame模块的安装 打开pycharm 在左上角点file 找到settings 如图 进入后 找到Project untitled下的Project interperter 右边
  • 谷歌VAD静音检测py-webrtcvad使用详解

    一 前言 不知道有没有人和我一样看的官方示例一脸蒙 什么采样率除以时间 看到就头大 还是英文头更大了 好了废话结束 上翻译改编版 二 人话翻译版代码 如果你问我有些行为什么没有注释 import collections import con
  • 小记stm32实现串口接收的四种方法(hal库)

    开发环境 STM32CUBMX 正点原子STM32F407ZGT6探索者开发板 MDK ARM 5 31 第一种方式 直接接收 配置外部时钟源 2 配置时钟树 3 配置串口一 生产代码后进入工程 重定向printf到串口1 建议在usart
  • 攻防世界(pwn)Recho(XCTF 3rd-RCTF-2017) writeup

    64位程序 保护如上 可以分析出程序大意 先读取字符串长度存入nptr与v7中 如果字符串长度小于15时将v7设为16 大于15则不变 然后读取v7个字符放入buf中 最后在末尾添上0并打印出来 漏洞很显然 如果v7很大 则read会造成溢
  • ChatGPT实战:创业咨询,少走弯路,少踩坑

    用九死一生形容创业再适合不过 不过一旦成功回报也很诱人 这也是为什么那么多人下场创业 纸上得来终觉浅 绝知此事要躬行 创过业的人都知道其中的心酸 而他们也建议你去创业 因为那真不是一般人能干的事 又想创业 又想少踩坑 创业者肯定是想多向走过
  • Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自 http xiaozu renren com xiaozu 106512 336681453 function center U obj fcn FCMClust data cluster n