文章目录

    • 1.MATLAB程序实现
    • 2.基于fcm的图像分割
    • FCM算法
  • 与Kmeans算法对比

1.MATLAB程序实现

代码如下:

%% 清空环境变量
clear;
clc;
close all;%% 初始化参数
data = rand(400, 2);
figure;
plot(data(:, 1), data(:, 2), 'ro', 'MarkerSize', 8);
xlabel '横坐标X'; ylabel '纵坐标';
title '样本数据';
K = 4;              % 分类个数
maxgen = 100;       % 最大迭代次数
alpha = 3;          % 指数的次幂
threshold = 1e-6;   % 阈值
[data_n, in_n] = size(data);   % 行数,即样本个数/列数,即样本维数
% 初始化隶属度矩阵
U = rand(K, data_n);
col_sum = sum(U);
U = U./col_sum(ones(K, 1), :);%% 迭代
for i = 1:maxgen% 更新聚类中心mf = U.^alpha;center = mf*data./((ones(in_n, 1)*sum(mf'))');% 更新目标函数值dist = zeros(size(center, 1), data_n);for k = 1:size(center, 1)dist(k, :) = sqrt(sum(((data-ones(data_n, 1)*center(k, :)).^2)', 1));endJ(i) = sum(sum((dist.^2).*mf));% 更新隶属度矩阵tmp = dist.^(-2/(alpha-1));U = tmp./(ones(K, 1)*sum(tmp));% 终止条件判断if i > 1if abs(J(i) - J(i-1)) < thresholdbreak;endend
end%% 绘图
[max_vluae, index] = max(U);
index = index';
figure;
for i = 1:Kcol = find(index == i);      % max(U)返回隶属度列最大值所在行一致的分为一类plot(data(col, 1), data(col, 2), '*', 'MarkerSize', 8);hold on
end
grid on
% 画出聚类中心
plot(center(:, 1), center(:, 2), 'p', 'color', 'm', 'MarkerSize', 12);
xlabel '横坐标X'; ylabel '纵坐标Y';
title 'FCM优化后的聚类图';
% 目标函数变化过程
figure;
plot(J, 'r', 'linewidth', 2);
xlabel '迭代次数'; ylabel '目标函数值';
title 'FCM聚类目标函数变化过程';
grid on

FCM优化后的聚类图如图所示
成功聚类

FCM聚类目标函数值变化过程如图所示

2.基于fcm的图像分割

一个小例子
代码如下:

clc
clear
close all
img = double(imread('lena.jpg'));
subplot(1,2,1),imshow(img,[]);
data = img(:);
%分成4类
[center,U,obj_fcn] = fcm(data,4);
[~,label] = max(U); %找到所属的类
%变化到图像的大小
img_new = reshape(label,size(img));
subplot(1,2,2),imshow(img_new,[]);

需要自己下载图片转到MATLAB目录下

FCM算法

数据来源网址
http://archive.ics.uci.edu/ml/datasets/seeds#
这个数据库是关于种子分类的,里面共包含3类种子,采集他们的特征,每个种子共有7个特征值来表示它(也就是说在数据里面相当于7维),每类种子又有70个样本,那么整个数据集就是210*7的样本集。从上面那个地方下载完样本集存为txt文件,并放到matlab工作目录下

代码如下:

clc
clear
close all
data = importdata('data.txt');
%data中还有第8列,正确的标签列
subplot(2,2,1);
gscatter(data(:,1),data(:,6),data(:,8)),title('choose:1,6 列')
subplot(2,2,2);
gscatter(data(:,2),data(:,4),data(:,8)),title('choose:2,4 列')
subplot(2,2,3);
gscatter(data(:,3),data(:,5),data(:,8)),title('choose:3,5 列')
subplot(2,2,4);
gscatter(data(:,4),data(:,7),data(:,8)),title('choose:4,7 列')

将七个特征一起 代码如下:

clc
clear
close all
data = importdata('seeds_dataset.txt');
%data中还有第8列,正确的标签列
[center,U,obj_fcn] = fcm(data(:,1:7),3);
[~,label] = max(U); %找到所属的类
subplot(1,2,1);
gscatter(data(:,4),data(:,7),data(:,8)),title('choose:4,7列,理论结果')
% cal accuracy
a_1 = size(find(label(1:70)==1),2);
a_2 = size(find(label(1:70)==2),2);
a_3 = size(find(label(1:70)==3),2);
a = max([a_1,a_2,a_3]);
b_1 = size(find(label(71:140)==1),2);
b_2 = size(find(label(71:140)==2),2);
b_3 = size(find(label(71:140)==3),2);
b = max([b_1,b_2,b_3]);
c_1 = size(find(label(141:210)==1),2);
c_2 = size(find(label(141:210)==2),2);
c_3 = size(find(label(141:210)==3),2);
c = max([c_1,c_2,c_3]);
accuracy = (a+b+c)/210;
% plot answer
subplot(1,2,2);
gscatter(data(:,4),data(:,7),label),title(['实际结果,accuracy=',num2str(accuracy)])

有个问题,我跑出来accuracy=1,按照原作者的说法应该是达不到这样的准确率


与Kmeans算法对比

1.1数据来源
该数据来源于UCI数据库,UCI数据库是加州大学欧文分校(University of CaliforniaIrvine)提出的用于机器学习的数据库,UCI数据集是一个常用的标准测试数据集。
网址:http://archive.ics.uci.edu/ml/datasets/Solar+Flare

1.2数据描述
太阳耀斑数据集:每一类属性统计一个24小时周期太阳耀斑数据集中某一类耀斑的数量

代码如下:FCM算法

m=1389;
n=13;
data=cell(m,n);%定义cell矩阵,存储文件内容
fid=fopen('solar.txt','r');%以只读方式打开文件
for i=1:m
for j=1:n
data{i,j}=fscanf(fid,'%s',[1,1]);%以字符方式读取每个值,遇空格完成每个值的读取
end
end
fclose (fid);
for i=1:m
for j=4:n
data{i,j}=str2double(data{i,j});%将文本格式转为数字格式
end
end
str=cell(m,1); %用于存储data的第1列
for i=1:m
str{i}=data{i,1};
end
str=cell(m,2); %用于存储data的第2列
for i=1:m
str{i}=data{i,2};
end
str=cell(m,3); %用于存储data的第3列
for i=1:m
str{i}=data{i,3};
end 

代码如下:Kmeans算法

m=1389;
n=13;
data=cell(m,n);%定义cell矩阵,存储文件内容
fid=fopen('solar.txt','r');%以只读方式打开文件
for i=1:m
for j=1:n
data{i,j}=fscanf(fid,'%s',[1,1]);%以字符方式读取每个值,遇空格完成每个值的读取
end
end
fclose (fid);
for i=1:m
for j=4:n
data{i,j}=str2double(data{i,j});%将文本格式转为数字格式
end
end
str=cell(m,1); %用于存储data的第1列
for i=1:m
str{i}=data{i,1};
end
str=cell(m,2); %用于存储data的第2列
for i=1:m
str{i}=data{i,2};
end
str=cell(m,3); %用于存储data的第3列
for i=1:m
str{i}=data{i,3};
end 

两种算法运行时间比较
Kmeans聚类代码如下:

% 簇心数目k
K = 3;
data  = importdata('flare1.txt');
x = data(:,1);
y = data(:,2);
% 绘制数据,2维散点图
% x,y: 要绘制的数据点  20:散点大小相同,均为20  'blue':散点颜色为蓝色
s = scatter(x, y, 20, 'blue');
title('原始数据:蓝圈;初始簇心:红点');
% 初始化簇心
sample_num = size(data, 1);       % 样本数量
sample_dimension = size(data, 2); % 每个样本特征维度
% 暂且手动指定簇心初始位置
% clusters = zeros(K, sample_dimension);
% 簇心赋初值:计算所有数据的均值,并将一些小随机向量加到均值上
clusters = zeros(K, sample_dimension);
minVal = min(data); % 各维度计算最小值
maxVal = max(data); % 各维度计算最大值
for i=1:Kclusters(i, :) = minVal + (maxVal - minVal) * rand();
end
hold on; % 在上次绘图(散点图)基础上,准备下次绘图
% 绘制初始簇心
scatter(clusters(:,1), clusters(:,2), 'red', 'filled'); % 实心圆点,表示簇心初始位置
c = zeros(sample_num, 1); % 每个样本所属簇的编号
PRECISION = 0.001;
iter = 100; % 假定最多迭代100次
% Stochastic Gradient Descendant 随机梯度下降(SGD)的K-means,也就是Competitive Learning版本
basic_eta = 1;  % learning rate
for i=1:iterpre_acc_err = 0;  % 上一次迭代中,累计误差acc_err = 0;  % 累计误差for j=1:sample_numx_j = data(j, :);     % 取得第j个样本数据,这里体现了stochastic性质% 所有簇心和x计算距离,找到最近的一个(比较簇心到x的模长)gg = repmat(x_j, K, 1);gg = gg - clusters;tt = arrayfun(@(n) norm(gg(n,:)), (1:K)');[minVal, minIdx] = min(tt);% 更新簇心:把最近的簇心(winner)向数据x拉动。 eta为学习率.eta = basic_eta/i;delta = eta*(x_j-clusters(minIdx,:));clusters(minIdx,:) = clusters(minIdx,:) + delta;acc_err = acc_err + norm(delta);c(j)=minIdx;endif(rem(i,10) ~= 0)continueendfigure;f = scatter(x, y, 20, 'blue');hold on;scatter(clusters(:,1), clusters(:,2), 'filled'); % 实心圆点,表示簇心初始位置title(['第', num2str(i), '次迭代']);if (abs(acc_err-pre_acc_err) < PRECISION)disp(['收敛于第', num2str(i), '次迭代']);break;enddisp(['累计误差:', num2str(abs(acc_err-pre_acc_err))]);pre_acc_err = acc_err;
end
disp('done');

参考文献
[1]丁震,胡钟山,杨静宇,唐振民,邬永革.一种基于模糊聚类的图象分割方法[J].计算机研究与发展,1997(07):58-63.
https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=CJFD&dbname=CJFD9697&filename=JFYZ707.010&v=w6SVTbw2DI2U34NVEeHDiFy05S7tiJCXLSfhjzv1%25mmd2FMSAC%25mmd2B9EffWET8YmGo7%25mmd2BGjxA
[2]聚类之详解FCM算法原理及应用.CSDN
本文链接:https://blog.csdn.net/on2way/article/details/47087201
[3]FCM聚类与K-means聚类的实现和对比分析.CSDN
本文链接:https://blog.csdn.net/weixin_45583603/article/details/102773689
[4]基于FCM算法的聚类算法.CSDN
本文链接:https://blog.csdn.net/weixin_43821559/article/details/113616617

数据挖掘作业FCM算法相关推荐

  1. fcm算法c语言实现,基于特征权重的FCM算法研究及应用

    摘要: 模糊C-均值(FCM)聚类算法是非监督模式识别中应用范围最广泛的算法之一.但是传统的FCM算法中,设定样本的各维特征对分类效果的贡献水平是相同的.在实际中,由于特征提取不够完善,使得特征矢量中 ...

  2. FCM算法实现Python(简洁版)

    FCM算法 关于聚类的所有项目都放到了这个上面 https://github.com/Sean16SYSU/MachineLearningImplement/tree/master/Clusterin ...

  3. 聚类之 FCM 算法原理及应用(Java可视化实现)

    模糊 C 均值(Fuzzy C-means)算法简称 FCM 算法,是一种基于目标函数的模糊聚类算法,主要用于数据的聚类分析. 限于篇幅和数学公式的表达,笔者誊写了一篇文档用于介绍FCM的数学推导,这 ...

  4. 基于FCM算法优化的图像分割研究(附源代码)

    摘要: 图像分割是指把图像分解成各具特性的区域并提取出有用目标的技术, 它是由图像处理到图像分析的一个关键步骤, 已在诸如计算机视觉.图像编码.模式识别和医学图像分析等很多领域有着实际的应用.根据图像 ...

  5. FCM算法与K-Means算法的聚类

    1.FCM算法原理 模糊C均值(Fuzzy C-means)算法简称FCM算法,是一种基于目标函数划分的模糊聚类算法,主要用于数据的聚类分析.它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同 ...

  6. 详解FCM算法原理及应用

     (一)原理部分 模糊C均值(Fuzzy C-means)算法简称FCM算法,是一种基于目标函数的模糊聚类算法,主要用于数据的聚类分析.理论成熟,应用广泛,是一种优秀的聚类算法.本文关于FCM算法 ...

  7. 模糊聚类FCM算法和基于GA遗传优化的FCM聚类算法matlab仿真

    目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 在各种糊聚类算法中 ,模糊C -均值聚类算法FCM (FuzzyC MeanClusteri ...

  8. fcm算法的MATLAB实现,FCM算法的matlab程序(初步)

    FCM算法的matlab程序 1.采用iris数据库 iris_data.txt 5.1 3.5 1.4 0.2 4.9 3 1.4 0.2 4.7 3.2 1.3 0.2 4.6 3.1 1.5 0 ...

  9. 基于 PacBio 测序数据的纠错算法评测与剪切位点识别研究

    基于 PacBio 测序数据的纠错算法评测与剪切位点识别研究 摘 要 高通量测序技术的产生和发展催生了许多大规模基因测序项目, 如国际千人基 因组计划. 英国 UK10K 计划以及中国的百万人群基因组 ...

  10. 大数据与智能算法(二-应用级技术)-SMU在线学习笔记

    [课程来源]感谢B站Up主leonding1018的分享,老师的课程内容非常精彩. 本文是观看网络视频课程后的笔记,如涉及版权问题,请及时留言或私信与我联系. 上一篇讲述了一些基本算法,详见<大 ...

最新文章

  1. 2020Alibaba数学竞赛预选赛第二轮参考答案
  2. Controller FioriTest.view.LineItem couldn't be instantiated
  3. mysql序列increment_MySQL 序列 AUTO_INCREMENT
  4. Android Studio下载、安装和配置+SDK+tools下载(无敌超级详细版本)
  5. 二进制二进制编辑器_为什么十六进制编辑器称为二进制编辑器?
  6. 134安装教程_最新市政造价教程
  7. NRF51822基于蓝牙协议栈SDK+FDS-Flash data storage 的使用及应用例程
  8. android webview浏览器下载文件,Android 浏览器 —— 使用 WebView 实现文件下载
  9. SDN介绍(什么是SDN)
  10. 麒麟案例 | 南浔电商领头羊+麒麟计划,碰撞出了企业下一个10年增长之路!
  11. namespace MyProject 买来的二手车怎么查询是否发生过违章或交通事故,要查二手车的维修保养记录和出险记录?
  12. 【编程题】【Scratch一级】2020.12 小猫当裁判
  13. Android 10 解决无法通过adb install 安装persistent app
  14. Android_广播机制实战演练(数鸭子)
  15. 利用pandas实现json文件转化成csv文件
  16. 安装计算机的程序包,win10电脑中安装office提示无法打开此安装包请确认该程序包存在如何解决...
  17. 图像处理 OpenCV简介
  18. 2024合肥工业大学计算机考研信息汇总
  19. 同济大学21年计算机考研情况 招生人数较少,难度较大
  20. 蓝桥 迷宫寻宝 记忆化搜索

热门文章

  1. 2020年杭州电子科技大学计算机考研经验分享
  2. 电子设计教程42:限流软启动电路
  3. 2.1_7 Oracle 执行计划之1_优化器(Optimizer - CBORBO)
  4. 时间序列分解 | Python实现奇异谱分析(SSA)分解时间序列
  5. App测试之性能测试流畅度fps测试
  6. 出去计算机写保护,u盘写保护怎么去掉
  7. 京瓷打印机m5521cdn_京瓷Kyocera ECOSYS M5521cdn 驱动
  8. 当年,我为何关停了亲手创建的“北京圣思园”
  9. ROS时钟--支持时间倒计时小工具
  10. 软件构造-线程安全性