精华内容
下载资源
问答
  • Szilagyi等人提出的EnFCM算法加快了灰度图像的聚类过程。通过对像素点及其8邻域像素的线性加权求和预处理原图像,形成了从原始图像到其局部的邻域像素的平均图像。由于像素的灰度级值一般是8位分辨率(256级灰度),...
  • FCM算法简单实现python

    2020-10-17 13:01:44
    使用python简单实现fuzzy c-means聚类函数,二维数据集和三维数据集,学习时可以简单使用
  • 博客:聚类之详解FCM算法原理及应用https://blog.csdn.net/on2way/article/details/47087201 的pdf版本,更清晰,易保存
  • FCM算法图像分割MATLAB代码
  • 实现SAR遥感图像变化检测,fcm算法,模糊c均值算法
  • FCM算法

    千次阅读 2020-02-10 13:26:06
    FCM算法 一、FCM简述 FCM算法是基于对目标函数的优化基础上的一种数据聚类方法。聚类结果是每一个数据点对聚类中心的隶属程度,该隶属程度用一个数值来表示。该算法允许同一数据属于多个不同的类。 FCM算法是一种无...

    FCM算法

    一、FCM简述

    FCM算法是基于对目标函数的优化基础上的一种数据聚类方法。聚类结果是每一个数据点对聚类中心的隶属程度,该隶属程度用一个数值来表示。该算法允许同一数据属于多个不同的类。
    FCM算法是一种无监督的模糊聚类方法,在算法实现过程中不需要人为的干预。
    这种算法的不足之处:首先,算法中需要设定一些参数,若参数的初始化选取的不合适,可能影响聚类结果的正确性;其次,当数据样本集合较大并且特征数目较多时,算法的实时性不太好。
    K-means也叫硬C均值聚类(HCM),而FCM是模糊C均值聚类,它是HCM的延伸与拓展,HCM与FCM最大的区别在于隶属函数(划分矩阵)的取值不同,HCM的隶属函数只取两个值:0和1,而FCM的隶属函数可以取[0,1]之间的任何数。K-means和FCM都需要事先给定聚类的类别数,而FCM还需要选取恰当的加权指数α,α的选取对结果有一定的影响,α属于[0,+∞)。

    二、算法描述

    1、目标函数

    在这里插入图片描述
    在这里插入图片描述

    2、算法优化

    对于FCM算法采用拉格朗日乘子法进行优化:
    在这里插入图片描述迭代公式:
    在这里插入图片描述

    3、算法流程

    在这里插入图片描述

    4、Matlab实现

    FCM1.m代码:

    clear all;
    close all;
    ClustringMethod = 'FCM_test';
    DataSet = input('input dataset:','s');
    %% 读入不同的数据集
    %% iris
    % data=importdata([DataSet,'iris_data.txt']);
    % id=importdata([DataSet,'iris_id.txt']);
    % [data_num,data_dim]=size(data);
    % id_label=min(id):max(id);
    % center_num=max(id)-min(id)+1;
    DataFile = ['D:\matlab_text\Data\',DataSet,'iris_data.txt'];
    data = load(DataFile);%data
    IdFile = ['D:\matlab_text\Data\',DataSet,'iris_id.txt'];
    id = load(IdFile);%id
    DataSet_name = 'iris';
    
    % 读取数据信息
    id_label = min(id):max(id);
    [data_num,data_dim] = size(data);
    center_num = max(id)-min(id)+1;
    %% 参数设置
    alpha=2;
    threshold=1e-6;
    loopnum = 100;
    %% 输出文件
    ResultDirection=['Result\',DataSet,'\',ClustringMethod,'\',DataSet_name];
    if ~exist(ResultDirection,'dir')
        mkdir(ResultDirection);
    end
    Resultfile = [ResultDirection,'\alpha',num2str(alpha),'_',DataSet_name,'.txt'];
    fp_result = fopen(Resultfile,'wt');
    %% 将数据归一化到[0,1],采用min_max方法
    data = (data-(ones(data_num,1)*min(data)))./(ones(data_num,1)*(max(data)-min(data)));
    % ***************************************************************************************
    % 避免陷入局部最优,重复计算100% ***************************************************************************************
    for loop = 1:loopnum
        U = zeros(data_num,center_num);
        C = zeros(center_num,data_dim);
        % 初始化聚类中心--根据类中心初始化
        for i = 1:center_num
            temp = find(id==id_label(i));
            C(i,:) = data(temp(ceil(rand(1,1)*length(temp))),:);
        end
        iteration = 0;
        objfunc_old=0;
        %% Start----------FCM
        while(1)
            % 根据初始化的C计算隶属度U
            % 计算数据到聚类中心的距离
            distance_C = zeros(center_num,data_num);
            for i = 1:center_num
                distance_C(i,:) = ((bsxfun(@minus,C(i,:),data)).^2)*ones(1,data_dim)';
            end
            U = 1./(bsxfun(@times,(distance_C').^(1/(alpha-1)),sum((distance_C').^(-1/(alpha-1)),2)));
            U(distance_C'==0)=1;
            % 计算目标函数
            objfunc=sum(sum((U.^alpha).*(distance_C')));
            % 判断迭代终止条件
            if (abs(objfunc-objfunc_old)<threshold)
                break;
            end
            objfunc_old = objfunc;
            iteration = iteration + 1;
            % 更新聚类中心C
            Um = U.^alpha;
            C = bsxfun(@times,(Um')*data,((sum(Um))').^(-1));
        end
        %% End----------FCM
        % 将输出的隶属度U转换成id形式
        [~,id_U] = max(U,[],2);
        id_U = id_U - 1;
        % Compute the ACC
        [ACC,id_U_result] = Function_ACC( center_num,data_num,id_U,id_label,id );
        % Compute the NMI
        NMI = Function_NMI( id_U_result,id );
        % Output the ITE
        ITE = iteration;
        % Calculate the average value of evaluation indexes
        ACC_max = max(ACC,ACC_max);
        ACC_average = ACC_average + ACC/loopnum;
        NMI_average = NMI_average + NMI/loopnum;
        ITE_average = ITE_average + ITE/loopnum;
    end
    %% Output final results to .txt
    fprintf(fp_result,'DataSet = %s\t',DataSet_name);
    fprintf(fp_result,'ACC_max = %f\t',ACC_max);
    fprintf(fp_result,'ACC_average = %f\t',ACC_average);
    fprintf(fp_result,'NMI_average = %f\t',NMI_average);
    fprintf(fp_result,'ITE_average = %f\n',ITE_average);
    %% Output final results to terminal
    fprintf('DataSet=%s\t ACC_max=%d\t ACC_average=%f\t NMI_average=%f\t ITE_average=%f\n',DataSet_name,ACC_max,ACC_average,NMI_average,ITE_average);

    Function_ACC代码:

    function [ accuracy_max,id_U_result ] = Function_ACC( center_num,data_num,id_U,id_label,id )
    accuracy_max = 0;
    % function_ACC 计算评价指标----准确率
    % 全排列
    id_permutation = perms(id_label);
    id_temp = zeros(data_num,factorial(center_num));
    for i = 1:factorial(center_num)
        for k = 1:center_num
            for j = 1:data_num
                if(id_U(j) == id_permutation(i,k))
                    id_temp(j,i)=id_label(k);
                end
            end
        end
    end
    %分别计算每一种排列组合下的准确率
    error = zeros(data_num,factorial(center_num));
    for i = 1:data_num
        error(i,:) = (abs(id_temp(i,:)-id(i))>0)*1;%错误数
    end
    accuracy = max((data_num-sum(error))/data_num);
    %得到准确率最高时的分类结果
    id_U_result = id_temp(:,find((data_num-sum(error))/data_num==accuracy));
    accuracy_max = max(accuracy,accuracy_max);
    end

    Function_NMI代码:

    function [ NMI ] = Function_NMI( id_new,id_real )
    % Function_NMI:hard clustering measure: normalized mutual information
    % [data_num,center_num]=size(U);
    data_num = length(id_real);
    center_num = max(id_real(:))-min(id_real(:))+1;
    id_label=min(id_real(:)):max(id_real(:));
    %% compute the number of each cluster
    Pn_id_new = zeros(1,center_num);
    Pn_id_real = zeros(1,center_num);
    P_id_new = zeros(1,center_num);
    P_id_real = zeros(1,center_num);
    for i = 1:center_num
        Pn_id_new(i) = length(find(id_new(:)==id_label(i)));
        Pn_id_real(i) = length(find(id_real(:)==id_label(i)));
        P_id_new(i) = length(find(id_new(:)==id_label(i)))/data_num;
        P_id_real(i) = length(find(id_real(:)==id_label(i)))/data_num;
    end
    %% compute entropy
    H_new = 0;
    H_real = 0;
    for i = 1:center_num
        H_new = H_new - P_id_new(i)*log2(P_id_new(i));
        H_real = H_real-P_id_real(i)*log2(P_id_real(i));    
    end
    %% compute the number of mutual information
    count_new_real=zeros(center_num,center_num);%同时隶属于Ri与Qj的数据点的个数
    for i = 1:center_num
        for j = 1:center_num
            for n = 1:data_num
                if ((id_new(n) == id_label(i)) && (id_real(n) == id_label(j)))
                    count_new_real(i,j) = count_new_real(i,j) + 1;
                end
            end
        end
    end
    P_new_real=count_new_real/data_num;
    NMI=0;
    for i=1:center_num
        for j=1:center_num
            if(P_new_real(i,j) ~= 0)
                NMI = NMI + P_new_real(i,j)*log2(P_new_real(i,j)/(P_id_new(i)*P_id_real(j)));
            end
        end
    end
    NMI = NMI/sqrt(H_new*H_real);
    end

    结果:
    在这里插入图片描述
    数据:
    iris

    三、参考文献

    1.认识FCM算法
    2.FCM算法的matlab程序
    3.FCM理论详解

    展开全文
  • FCM算法最优聚类数选取纵横谈,魏楠,吴文庆,本文基于FCM算法中最优聚类数的选择,总结和概括了基于此改进的FCM算法,并利用数值分析中先验以及后验估计的概念和特点对当前纷繁
  • 目的改进模糊c-均值FCM算法,并对SAR图像进行粗、细分类。方法对FCM算法从初始聚类中心、隶属度约束条件两个方面进行改进,并提出对SAR图像的粗、细分类。首先利用改进的FCM算法对图像进行聚类,然后在隶属度矩阵中设定...
  • fcm算法的代码

    2015-10-09 10:35:49
    采用模糊c均值聚类算法,对数据集进行准确率的聚类
  • fcm算法调用

    2017-09-04 21:49:57
    FCM算法是将N个L维向量分为C个模糊组,通过迭代不断更新隶属度以及聚类中心,最小化目标函数对数据进行聚类。
  • FCM算法及其推导过程

    2012-03-28 09:34:14
    在做一些涉及FCM算法的实验时,需要查阅FCM算法的一些基本资料。但是已有的文献资料常常不会涉及基本内容,或是中间略去了推导过程。这里,本人尝试着给出了推导,并整理出FCM算法的基本思想及步骤,给需要的朋友,以节省...
  • Matlab实现FCM算法

    2013-05-26 09:07:58
    Matlab代码实现的FCM算法,有例子,有图
  • fcm算法matlab

    2021-04-22 04:26:34
    7,4 3 fcm 函数源代码(在 MATLAB 中... 2页 2下载券 模糊c均值聚类+FCM算法的... 9页 2下载券 喜欢......K-means算法matlab的实现_数学_自然科学_专业资料。算法流程图开 始...17遗传算法改进的模糊C-均值聚类MAT...

    7,4 3 fcm 函数源代码(在 MATLAB 中输入 type fcm 可以...

    模糊C均值聚类matlab代码... 暂无评价 3页 免费 模糊聚类分析算法的MATL... 2页 2下载券 模糊c均值聚类+FCM算法的... 9页 2下载券 喜欢......

    K-means算法matlab的实现_数学_自然科学_专业资料。算法流程图开 始...

    17遗传算法改进的模糊C-均值聚类MATLAB源代码_工程科技_专业资料。模糊C-均值算法容易收敛于局部极小点,为了克服该缺点,将遗传算法应用于模糊C-均值算法(FCM)的......

    实现thln13算法的matlab程序_数学_自然科学_专业资料。clear a...

    遗传算法改进的模糊C-均值聚类MATLAB源码_IT/计算机_专业资料。模糊C-均值算法容易收敛于局部极小点,为了克服该缺点,将遗传算法应用于模糊C-均值算法(FCM)的优化......

    模糊c均值聚类+FCM算法的... 9页 2下载券 模糊聚类分析及matlab程... 3页 2下载券 遗传算法改进的模糊C-均... 2页 免费 matlab实现c均值聚类算法......

    FCM 算法;MATLAB 摘要:模糊聚类是一种科学有效的聚类方法,其中模糊 c...

    的算法之一 . 具有部分已知信息的模糊聚类不仅能够节省聚类时间 ,更能有效的检验聚类效果 . 通过用 MA T2 [ 关键词 ] 模糊聚类 ; FCM 算法 ;MA TL AB [ ......

    htteitouto fcmptr—addccltn ae iMATL ol a...

    一种改进的DFCM聚类算法及对wine数据的分类_计算机软件及应用_IT/计算机_专业资料。? 数据库技术 Data Base Technique 一种改进的 DFCM 聚类算法及对 wine 数据......

    模糊聚类分析matlab实现 AA=A./[ones(1400,1)*std(A)]; [c,u,fcn]=fcm(AA,3) [F,J]=sort(u); t1=find(J(3,:)==1), t2=find(J(3,:)==......

    fcmptrsltnaeas icse.euto oue iai r lodsu...

    采用 FCM(Fuzzy Cmean)聚类算法将滤波处理后的遥感影像中的像素分为...

    【总页数】4 页(12-15) 【关键词】模糊软划分;最佳分类数;遗传算法;MATLAB;ISODATA;FCM 【作者】郭海湘;诸克军;刘涛 【作者单位】中国地质大学,研究生院,湖北......

    3新型CMAC控制器的MATLAB 仿真3.1建立被控对象的数学模型 对所建立模型进行有模糊控制的FCMAC—PD仿真及无模 糊控制CMAC—PD仿真,采样周期为O.Ols,仿真时间8秒......

    {x1,x7} {x2, x4,x5,x6} {x3, x9} {x8, x11} {x10} 注:对于这类 C 均值模糊聚类问题,也可以直接调用 Matlab 自 带的模糊聚类函数 fcm.m 求解。调......

    anheillsiiainrnt mniefrneThemehodipre h ntreec. t movsteFCM. Kewodyrs:fz of ltrng;optma lseuzystcuseiilcass;getcalortm;MATLAB;Inei gihSODATA;FCM......

    {x1,x7} {x2, x4,x5,x6} {x3, x9} {x8, x11} {x10} 注:对于这类 C 均值模糊聚类问题,也可以直接调用 Matlab 自 带的模糊聚类函数 fcm.m 求解。调......

    例 6-23 >>data = rand(100, 2); 图 6-23 >>[center,U,obj_fcn] = fcm(data, 2); >>plot(data(:,1), data(:,2),'o'); >>maxU = max......

    展开全文
  • 数据挖掘作业FCM算法

    2021-04-15 18:39:40
    基于fcm的图像分割 FCM算法 与Kmeans算法对比 1.MATLAB程序实现 代码如下: %% 清空环境变量 clear; clc; close all; %% 初始化参数 data = rand(400, 2); figure; plot(data(:, 1), data(:, 2), 'ro', 'MarkerSize'...
      
    


    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));
        end
        J(i) = sum(sum((dist.^2).*mf));
        % 更新隶属度矩阵
        tmp = dist.^(-2/(alpha-1));
        U = tmp./(ones(K, 1)*sum(tmp));
        % 终止条件判断
        if i > 1
            if abs(J(i) - J(i-1)) < threshold
                break;
            end
        end
    end
    
    %% 绘图
    [max_vluae, index] = max(U);
    index = index';
    figure;
    for i = 1:K
        col = 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的第1for i=1:m
    str{i}=data{i,1};
    end 
    str=cell(m,2); %用于存储data的第2for i=1:m
    str{i}=data{i,2};
    end 
    str=cell(m,3); %用于存储data的第3for 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的第1for i=1:m
    str{i}=data{i,1};
    end 
    str=cell(m,2); %用于存储data的第2for i=1:m
    str{i}=data{i,2};
    end 
    str=cell(m,3); %用于存储data的第3for i=1:m
    str{i}=data{i,3};
    end 
    
    

    两种算法运行时间比较在这里插入图片描述Kmeans算法运行时间
    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:K
        clusters(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:iter
        pre_acc_err = 0;  % 上一次迭代中,累计误差
        acc_err = 0;  % 累计误差
        for j=1:sample_num
            x_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;
        end
        if(rem(i,10) ~= 0)
            continue
        end
        figure;
        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;
        end
        disp(['累计误差:', 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算法的负荷分类.pdf, 在建立了负荷分类五阶段过程模型的基础上,提出了用类内距离和与类间距离和之比作为负荷分类评价指标...
  • FCM算法(matlab)

    2018-10-17 15:31:37
    用matlab语言写成的FCM算法,注释明确,代码经典,适合初学者
  • FCM算法推导过程

    千次阅读 2020-02-22 22:46:43
    最近毕业,然后可能用到FCM,找了挺多博客论文,更多的是关于用法没有推导过程,于是自己总结写一篇详细版尽量小白也能看懂的fcm推导过程,加深对算法的理解。标题或内容可能会挺暴力,个人习惯问题哈哈哈。如果写的...

    FCM推导过程超详细

    最近毕业,然后可能用到FCM,找了挺多博客论文,更多的是关于用法没有推导过程,于是自己总结写一篇详细版尽量小白也能看懂的fcm推导过程,加深对算法的理解。标题或内容可能会挺暴力,个人习惯问题哈哈哈。如果写的有问题望各位多多指导,多多包涵。(好像有个别符号可能不规范,但应该不影响阅读,影响了请告知!)

    1、概述

    fcm是一个聚类算法。打些标签,模式分类,无监督学习,k-means,HCM(k-means),模糊-c均值算法。其他废话就不写了。
    本篇主要讲推导过程,当然不看过程也能使用fcm聚类,那么就把结果和迭代过程写在开头。

    1.1公式

    目标函数
    J m ( u , c ) = ∑ i = 1 K ∑ j = 1 N u i j m ∥ x j − c i ∥ 2 J_m(u,c)=\sum_{i=1}^{K}\sum_{j=1}^{N}u_{ij}^{m}\left \| x_j-c_i\right \|^{2} Jm(u,c)=i=1Kj=1Nuijmxjci2

    簇群中心
    c i = ∑ j = 1 N u i j m x j ∑ j = 1 N u i j m c_i=\frac{\sum_{j=1}^{N}u_{ij}^{m}x_j}{\sum_{j=1}^{N}u_{ij}^{m}} ci=j=1Nuijmj=1Nuijmxj

    隶属值
    u i j = 1 ∑ u = 1 k ( ∥ x j − c i ∥ ∥ x j − c u ∥ ) 2 m − 1 u_{ij}=\frac{1}{\sum_{u=1}^{k}(\frac{\left\| x_j-c_i \right\|}{\left \| x_j-c_u\right \|})^\frac{2}{m-1}} uij=u=1k(xjcuxjci)m121

    1.2迭代过程

    step1. 初始化赋值簇群中心或隶属度(这里先赋值隶属值)
    step2. 利用 c i c_i ci公式计算簇群中心
    step3. 根据得到的簇群中心利用 u i j u_{ij} uij公式更新隶属值
    step4. 计算目标函数 J m ( u , c ) J_m(u,c) Jm(u,c)的值记为 j ( t ) j^{(t)} j(t)(t为本次循环的意思)
    step5. If ∥ j ( t ) − j ( t − 1 ) ∥ \left\| j^{(t)}-j^{(t-1)}\right\| j(t)j(t1)<&,本次循环的值减上次的小于给定值,那么stop;否则 return to step 2.(给定值即为循环停止条件)
      迭代过程整体和HCM相似。在计算距离的时候添加了一个隶属值,也就是加权值,在HCM是直接计算距离的基础上,多了个权值。并且隶属值每次循环都会更新,所以在给定初始值时可以给随机值(一开始没想进去就是这里,脑子默认近大远小初始隶属值不知道怎么给定,但这实际是分类完成时的结果,分类开始时不需要考虑)。
      关于m值是一个加权指数,影响的是算法的性能,对于分类没有影响,条件是要大于1,本篇最后会提一下。

    2、推导过程

    2.1通式

    x j x_j xj,需分类的数据集,j = 1,2,……,N
    c i c_i ci,分类形成的簇群中心,i = 1,2,……,K
    u i j u_{ij} uij,隶属值 Membership Values
       x j x_j xj——> c 1 c_1 c1 u 1 j u_{1j} u1j x j x_j xj点归属于 c 1 c_1 c1群的隶属值记为 u i j u_{ij} uij
       x j x_j xj——> c 2 c_2 c2 u 2 j u_{2j} u2j x j x_j xj点归属于 c 2 c_2 c2群的隶属值记为 u i j u_{ij} uij
    m,Fuzzifier,加权指数(模糊控制),影响收敛速度,影响性能,我是这么理解。
    综上 x j x_j xj归属哪个 c i c_i ci群由 u i j ( x j − c i ) u_{ij}(x_j-c_i) uij(xjci)距离大小决定,归属于距离小的簇群,是不是和HCM很像。


    先举个例 (m的作用可以参考这个例子)
    假设要分成两类,分别为 c 1 c_1 c1 c 2 c_2 c2两个群,那么 u 1 j + u 2 j = 1 u_{1j}+u_{2j}=1 u1j+u2j=1
    u 1 j = 0.8 u_{1j}=0.8 u1j=0.8 u 2 j = 0.2 u_{2j}=0.2 u2j=0.2,m=2,那么 u 1 j m = 0.64 u_{1j}^m=0.64 u1jm=0.64 u 2 j m = 0.04 u_{2j}^m=0.04 u2jm=0.04 u 2 j m u_{2j}^m u2jm远小于 u 1 j m u_{1j}^m u1jm
    因为 u 1 j > u 2 j u_{1j}>u_{2j} u1j>u2j,可知 x j x_j xj c 1 c_1 c1 c 2 c_2 c2近,则 ∥ x j − c 2 ∥ 2 > ∥ x j − c 1 ∥ 2 \left\| x_j-c_2\right\|^2>\left\| x_j-c_1\right\|^2 xjc22>xjc12,再乘上 u 2 j m < u 1 j m u_{2j}^m<u_{1j}^m u2jm<u1jm,得到 u 2 j m ∥ x j − c 2 ∥ 2 u_{2j}^m\left\| x_j-c_2\right\|^2 u2jmxjc22远小于 u 1 j m ∥ x j − c 1 ∥ 2 u_{1j}^m\left\| x_j-c_1\right\|^2 u1jmxjc12,所以 x j x_j xj归属于 c 1 c_1 c1
    当m足够大时, u 2 j m ∥ x j − c 2 ∥ 2 u_{2j}^m\left\| x_j-c_2\right\|^2 u2jmxjc22趋近于0, x j x_j xj归属于 c 1 c_1 c1

    由此可得,m不影响聚类结果,影响过程。变量为 u i j u_{ij} uij c i c_i ci x j x_j xj已知,i为群个数,共K个,j为数据个数,共N个。

    继续,当按以上分类完成后:
    c 1 c_1 c1的模糊距离之和为 ∑ i = 1 N u 1 j m ∥ x j − c 1 ∥ 2 \sum_{i=1}^{N}u_{1j}^m\left\| x_j-c_1\right\|^2 i=1Nu1jmxjc12
    c 2 c_2 c2的模糊距离之和为 ∑ i = 1 N u 2 j m ∥ x j − c 2 ∥ 2 \sum_{i=1}^{N}u_{2j}^m\left\| x_j-c_2\right\|^2 i=1Nu2jmxjc22
    目标函数为 J = ∑ i = 1 2 ∑ j = 1 N u i j m ∥ x j − c i ∥ 2 J = \sum_{i=1}^{2}\sum_{j=1}^{N}u_{ij}^m\left\| x_j-c_i\right\|^2 J=i=12j=1Nuijmxjci2
    且满足 u 1 j + u 2 j = 1 u_{1j}+u_{2j}=1 u1j+u2j=1,即 ∑ i = 1 2 u i j = 1 \sum_{i=1}^{2}u_{ij}=1 i=12uij=1


    由上例可得通式(能不能得我也不晓得,憋杠我)
    目标函数:
    J m ( u i j , c i ) = ∑ i = 1 K ∑ j = 1 N u i j m ∥ x j − c i ∥ 2 J_m(u_{ij},c_{i})=\sum_{i=1}^{K}\sum_{j=1}^{N}u_{ij}^{m}\left \| x_j-c_i\right \|^{2} Jm(uij,ci)=i=1Kj=1Nuijmxjci2

    限制式
    ∑ i = 1 K u i j = 1   j = 1 , 2 , … … , N \sum_{i=1}^{K}u_{ij}=1 j=1,2,……,N i=1Kuij=1 =1,2,,N

    接下来求这个具有约束条件的目标函数的最小值,也就是极值点。目标函数最小就是分类的最优解,根据上例也可以得知。

    2.2Lagrangian Function找极值

    L ( u i j , c i , λ 1 , … … ) = ∑ i = 1 K ∑ j = 1 N u i j m ∥ x j − c i ∥ 2 − λ 1 ( ∑ i = 1 K u i 1 − 1 ) − λ 2 ( ∑ i = 1 K u i 2 − 1 ) … … − λ N ( ∑ i = 1 K u i N − 1 ) L(u_{ij},c_i,λ_1,……) = \sum_{i=1}^{K}\sum_{j=1}^{N}u_{ij}^m\left\| x_j-c_i\right\|^2-λ_1(\sum_{i=1}^{K}u_{i1}-1)-λ_2(\sum_{i=1}^{K}u_{i2}-1)……-λ_N(\sum_{i=1}^{K}u_{iN}-1) L(uij,ci,λ1,)=i=1Kj=1Nuijmxjci2λ1(i=1Kui11)λ2(i=1Kui21)λN(i=1KuiN1)

    L ( u i j , c i , λ j ) = ∑ i = 1 K ∑ j = 1 N u i j m ∥ x j − c i ∥ 2 − ∑ j = 1 N λ j ( ∑ i = 1 K u i j − 1 ) L(u_{ij},c_i,λ_j) = \sum_{i=1}^{K}\sum_{j=1}^{N}u_{ij}^m\left\| x_j-c_i\right\|^2-\sum_{j=1}^{N}λ_j(\sum_{i=1}^{K}u_{ij}-1) L(uij,ci,λj)=i=1Kj=1Nuijmxjci2j=1Nλj(i=1Kuij1)

    先求 u i j = × × × c i u_{ij}=×××c_i uij=×××ci
    d L d u i j = m u i j m − 1 ∥ x j − c i ∥ 2 − λ j = 0 \frac{dL}{du_{ij}} = mu_{ij}^{m-1}\left\| x_j-c_i\right\|^2-λ_j=0 duijdL=muijm1xjci2λj=0

    d L d λ j = ∑ i = 1 K u i j − 1 = 0 \frac{dL}{dλ_j} =\sum_{i=1}^{K}u_{ij}-1=0 dλjdL=i=1Kuij1=0

    化简
    u i j = ( λ i m ) 1 m − 1 1 ∥ x j − c i ∥ 2 m − 1 u_{ij}=(\frac {λ_i}{m})^{\frac{1}{m-1}}\frac{1}{\left\| x_j-c_i\right\|^{\frac{2}{m-1}}} uij=(mλi)m11xjcim121

    1 = ∑ i = 1 K u i j = ∑ i = 1 K ( λ i m ) 1 m − 1 1 ∥ x j − c i ∥ 2 m − 1 1=\sum_{i=1}^{K}u_{ij}=\sum_{i=1}^{K}(\frac {λ_i}{m})^{\frac{1}{m-1}}\frac{1}{\left\| x_j-c_i\right\|^{\frac{2}{m-1}}} 1=i=1Kuij=i=1K(mλi)m11xjcim121

    ( λ i m ) 1 m − 1 = 1 ∑ i = 1 K 1 ∥ x j − c i ∥ 2 m − 1 (\frac {λ_i}{m})^{\frac{1}{m-1}}=\frac{1}{\sum_{i=1}^{K}\frac{1}{\left\| x_j-c_i\right\|^{\frac{2}{m-1}}}} (mλi)m11=i=1Kxjcim1211

    把最后一个式子放到第一个式子中,可得
    u i j = 1 ∥ x j − c i ∥ 2 m − 1 ∑ i = 1 K 1 ∥ x j − c i ∥ 2 m − 1 u_{ij}=\frac{\frac{1}{\left\| x_j-c_i\right\|^{\frac{2}{m-1}}}}{\sum_{i=1}^{K}\frac{1}{\left\| x_j-c_i\right\|^{\frac{2}{m-1}}}} uij=i=1Kxjcim121xjcim121

    再化简后就是最上面的式子,但是这里我们先停在这里不继续化简。因为第3部分有用。

    再求 c i = × × × u i j c_i=×××u_{ij} ci=×××uij
    d L d c i = ∑ j = 1 N u i j m ( − 2 ) ( x j − c i ) = 0 \frac{dL}{dc_i} = \sum_{j=1}^{N}u_{ij}^m(-2)(x_j-c_i)=0 dcidL=j=1Nuijm(2)(xjci)=0

    化简
    ∑ j = 1 N u i j m x j − ∑ j = 1 N u i j m c i = 0 \sum_{j=1}^{N}u_{ij}^mx_j-\sum_{j=1}^{N}u_{ij}^mc_i=0 j=1Nuijmxjj=1Nuijmci=0

    c i = ∑ j = 1 N u i j m x j ∑ j = 1 N u i j m c_i=\frac{\sum_{j=1}^{N}u_{ij}^mx_j}{\sum_{j=1}^{N}u_{ij}^m} ci=j=1Nuijmj=1Nuijmxj

    到此 u i j u_{ij} uij c i c_i ci已经求出来了,那么该点为目标函数的极值点,目标函数J极小值,因为 x j x_j xj是离散的J就是最小值。(大概能这么说吧23333)

    2.3汇总

    三个公式分别为
    u i j = 1 ∥ x j − c i ∥ 2 m − 1 ∑ i = 1 K 1 ∥ x j − c i ∥ 2 m − 1 u_{ij}=\frac{\frac{1}{\left\| x_j-c_i\right\|^{\frac{2}{m-1}}}}{\sum_{i=1}^{K}\frac{1}{\left\| x_j-c_i\right\|^{\frac{2}{m-1}}}} uij=i=1Kxjcim121xjcim121

    c i = ∑ j = 1 N u i j m x j ∑ j = 1 N u i j m c_i=\frac{\sum_{j=1}^{N}u_{ij}^mx_j}{\sum_{j=1}^{N}u_{ij}^m} ci=j=1Nuijmj=1Nuijmxj

    J m ( u i j , c i ) = ∑ i = 1 K ∑ j = 1 N u i j m ∥ x j − c i ∥ 2 J_m(u_{ij},c_{i})=\sum_{i=1}^{K}\sum_{j=1}^{N}u_{ij}^{m}\left \| x_j-c_i\right \|^{2} Jm(uij,ci)=i=1Kj=1Nuijmxjci2

    3、m的取值

    关于m值,上面已经介绍过。这里要提及一下FCM的历史,毕竟都是大佬做出来,我们享享福。1974年,Dunn利用类内加权平方误差和函数定义了FCM算法的目标函数 J 2 J_2 J2,后来Bezdek通过引入一个加权指数m使 J 2 J_2 J2变为 J m J_m Jm m ∈ ( 1 , + ∞ ) m\in(1,+\infty) m(1,+)Bezdek认为参数m控制着模糊类间的分享程度。至于m该取多少为最优,有不少这方面的论文,自行查找。

    这里讲一下m=2的情况, u i j u_{ij} uij c i c_i ci不再复制了,就在上面。还是那两类举例。
    x j — > c 1       1 ∥ x j − c 1 ∥ 2 x_j—>c_1   \frac{1}{\left\| x_j-c_1\right\|^2} xj>c1   xjc121

    x j — > c 2       1 ∥ x j − c 2 ∥ 2 x_j—>c_2   \frac{1}{\left\| x_j-c_2\right\|^2} xj>c2   xjc221

    因为隶属值小于1且 u 1 j , u 2 j u_{1j},u_{2j} u1j,u2j和为1。我们对距离进行倒数,进的倒数变大,远的倒数变小,其让他们相加为1,那么就有如下。
    u 1 j = 1 ∥ x j − c 1 ∥ 2 1 ∥ x j − c 1 ∥ 2 + 1 ∥ x j − c 2 ∥ 2               u 1 j = 1 ∥ x j − c 2 ∥ 2 1 ∥ x j − c 1 ∥ 2 + 1 ∥ x j − c 2 ∥ 2 u_{1j} = \frac{\frac{1}{\left\| x_j-c_1\right\|^2}}{\frac{1}{\left\| x_j-c_1\right\|^2}+\frac{1}{\left\| x_j-c_2\right\|^2}}       u_{1j} = \frac{\frac{1}{\left\| x_j-c_2\right\|^2}}{\frac{1}{\left\| x_j-c_1\right\|^2}+\frac{1}{\left\| x_j-c_2\right\|^2}} u1j=xjc121+xjc221xjc121       u1j=xjc121+xjc221xjc221
    再看看2.3汇总,当m=2的时候,好这个相同,数学就是这么的魅力。
    同样 c i c_i ci也是,这里先写再解释,不写到K和N项了,有点麻烦意思一样。
    u 11 2 u 11 2 + u 12 2 + … … + u 1 j 2 x 1 + u 12 2 u 11 2 + u 12 2 + … … + u 1 j 2 x 2 + … … + u 1 j 2 u 11 2 + u 12 2 + … … + u 1 j 2 x j \frac{u_{11}^2}{u_{11}^2+u_{12}^2+……+u_{1j}^2}x_1+\frac{u_{12}^2}{u_{11}^2+u_{12}^2+……+u_{1j}^2}x_2+……+\frac{u_{1j}^2}{u_{11}^2+u_{12}^2+……+u_{1j}^2}x_j u112+u122++u1j2u112x1+u112+u122++u1j2u122x2++u112+u122++u1j2u1j2xj

    对照2.3汇总,当m=2时,展开式就是这个。 c i c_i ci为类中心,远的决定类中心取值的权值小,近的决定类中心权值大。这里可以明显看出和k-means的区别了,对于孤立点的处理更加的精确,不会因为孤立点对类中心的产生较大的偏差。
    对于m的取值问题,学的还不够深,这里不做回答。但是作用和取值范围应该挺明确了吧。

    4、总结

    通过对过程的了解,可以更加明白各参数的作用和影响。主要是看了很多没有但是没有找到满意的,可能我水平问题,于是自己写一个自己能看得懂的,当做记个笔记。至于FCM用什么地方,那还挺多的。
    还有就是第一次写博客,我先丢原创了,引用方面如果有问题,直接私,毕竟东拼西凑,然后自己写的。也不觉得有人会看= =,就这样了。

    展开全文
  • FCM算法改进点

    2014-03-07 20:19:03
    这里是对知识点的一般 概述和 提点,希望做图像处理方向的新手有一定的帮助,详细资料 可以自行查找相关资料
  • FCM算法中权重指数m的研究,许磊,吴晓娟,模糊c均值算法(FCM)是最常用的聚类算法之一。使用模糊c均值算法时,选取恰当的权重指数(m)是非常重要的。本文通过推导证明,得出�
  • 经典fcm算法程序+详细解释

    热门讨论 2011-05-12 13:23:50
    传统的fcm算法源程序,带有详细程序解释哦
  • FCM算法理论及其Python实现

    千次阅读 2019-03-05 15:00:25
    FCM算法 全名为Fuzzy C-Means,是一种聚类算法。 Fuzzy c-means (FCM) is a method of clustering which allows one piece of data to belong to two or more clusters. This method (developed by Dunn in 1973...
  • FCM算法中参数的优选方法及实例应用-FCM算法用于灰度图像分割的初始化方法的研究.pdf replyreload = ',' 51632;====在这个帖子中的内容,我六月份曾在 cinc 2009 上发表,在过几个月这篇文章就会被 EI Compendex, ...
  • 基于FCM算法的聚类算法

    千次阅读 多人点赞 2021-02-03 18:02:04
    文章目录一、模糊聚类分析二、案例背景1、问题描述2、模糊C--均值聚类算法(FCM)三、MATLAB程序实现1、初始化2、更新聚类中心、目标函数值、隶属度矩阵3、程序源码4、结果分析四、参考文献 一、模糊聚类分析 模糊聚类...
  • FCM算法FCM算法简介FCM算法原理FCM算法实现(matlab) FCM算法简介 FCM算法属于划分式聚类算法,用模糊的方法来处理聚类问题,他从一个初始划分开始,需要预先指定聚类数目,还需要定义一个最优化聚类标准,也就是目标...
  • 摘要:VC/C++源码,算法相关,fcm,算法 VC++实现的fcm算法演示程序,FCM算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的相似度最校FCM算法需要两个参数一个是聚类...
  • Matlab中的FCM算法代码及中文详解转自:http://xiaozu.renren.com/xiaozu/106512/336681453function [center, U, obj_fcn] = FCMClust(data, cluster_n, options)% FCMClust.m 采用模糊C均值对数据集data聚为cluster...
  • FCM算法分割图像代码

    2020-07-23 22:24:40
    FCM算法分割图像 1 clc clear close all %% create samples: img = imread(‘1.jpg’); %img为uint8类型的 subplot(1,2,1),imshow(img,[]) data = double(img(????); %将img转换成double类型的,用data表示,data是...
  • FCM算法与K-means 算法

    千次阅读 2019-10-27 13:31:42
    FCM算法 一.原理介绍 模糊C均值(Fuzzy C-means)算法简称FCM算法,是一种基于目标函数的模糊聚类算法,主要用于数据的聚类分析。理论成熟,应用广泛,是一种优秀的聚类算法。 首先介绍一下模糊这个概念,所谓...
  • 对模糊C均值算法进行了改进,采用更适合遥感图像的Mahalanobis距离代替欧氏距离,并在聚类中加入了先验信息。在聚类过程中,未标签的样本通过与已标签的样本进行相似性比较来提高算法的准确性。实验表明,改进的算法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,473
精华内容 989
关键字:

fcm算法

友情链接: PMSM.rar