Fuzzy C-Means读书笔记

一、算法简介



很显然,图中的数据集可分为两个簇。借鉴K-Means算法的思想,利用单个特殊的点(质心)表示一个簇。因此,我们用\(C_1\)和\(C_2\)分别表示簇1和簇2。现在我们将隶属度引入到K-Means中,这就是我们研究的模糊C-Means算法。

二、算法的目标函数

K-Means算法的评价指标:簇内样本之间的距离尽可能的小,簇间样本之间的距离尽可能的大。Fuzzy C-Means继承并发展了它的评价指标。在K-Means算法中,每个数据只能归属一个簇。而在Fuzzy C-Means算法中,每个数据归属C个类。例如,在上图中,第\(j\)个数据\(x_j\)与\(C_1\)和\(C_2\)的距离分别为\(||x_j - C_1||^2\)、\(||x_j - C_2||^2\)。由上图可知,\(x_j\)属于\(C_1\)。所以我们希望\(||x_j - C_1||^2\)比\(||x_j - C_2||^2\)更有用点。最简单的想法是引入权重,希望\(u_{1j}\)越大越好,\(u_{2j}\)越小越好。因此,我用使用\(u_{1j}+u_{2j}=1\)对目标函数\((u_{1j})^m||x_j - C_1||^2+(u_{2j})^m||x_j - C_2||^2\)进行约束。模糊指数\(m(m>1)\)控制距离重要性的大小。

假设我们有\(N\)个数据,那么这\(N\)个数据到第一类的距离为:

\[\sum_{j=1}^{N}{(u_{1j})^m||x_j - C_1||^2}
\]

\(N\)个数据到第二类的距离为:

\[\sum_{j=1}^{N}{(u_{1j})^m||x_j - C_2||^2}
\]

则Fuzzy C-Means的目标函数:

\[J = \sum_{i=1}^{2}\sum_{j=1}^{N}{(u_{ij})^m||x_j - C_i||^2}=\sum_{j=1}^{N}{(u_{1j})^m||x_j - C_1||^2} + \sum_{j=1}^{N}{(u_{1j})^m||x_j - C_2||^2} \\
s.t.
\left\{
\begin{matrix}
\sum_{i=1}^{2}{u_{i1}}=u_{11}+u_{21}=1\\
\sum_{i=1}^{2}{u_{i2}}=u_{11}+u_{22}=1\\
...\\
\sum_{i=1}^{2}{u_{iN}}=u_{1N}+u_{2N}=1
\end{matrix}
\right.
\]

三、算法迭代公式推导

这里,我们对上述的目标函数中的类别数2扩展到任意数\(L\),即

\[J = \sum_{i=1}^{L}\sum_{j=1}^{N}{(u_{ij})^m||x_j - C_i||^2}\\
s.t.\ \ \ \ \sum_{i=1}^{L}{u_{ij}=1},\ \ \text{j=1,2,...,N}
\]

很显然,拉格朗日乘子法(Lagrange multipliers)是我们求解多元函数在一组约束下的极值的方法。

\[J(u_{ij},C_{i},\lambda_{j}) = \sum_{i=1}^{L}\sum_{j=1}^{N}{(u_{ij})^m||x_j - C_i||^2}+\lambda_{1}(\sum_{i=1}^{L}{u_{i1}}-1)+\lambda_{2}(\sum_{i=1}^{L}{u_{i2}}-1)+...+\lambda_{N}(\sum_{i=1}^{L}{u_{iN}}-1)\\
=\sum_{i=1}^{L}\sum_{j=1}^{N}{(u_{ij})^m||x_j - C_i||^2}+\sum_{j=1}^{N}\lambda_{j}(\sum_{i=1}^{L}{u_{ij}}-1)\\
=\sum_{i=1}^{L}\sum_{j=1}^{N}{(u_{ij})^m||x_j - C_i||^2}+\sum_{j=1}^{N}(\sum_{i=1}^{L}{\lambda{j}u_{ij}}-\lambda_{j})
\]

\(J\)对\(u_{ij}\)求偏导:

\[\frac{\partial{J}}{\partial{u_{ij}}}=mu_{ij}^{m-1}||x_j - C_i||^2+\lambda_{j}=0\\
mu_{ij}^{m-1}||x_j - C_i||^2=-\lambda_{j}\\
u_{ij}^{m-1}=\frac{-\lambda_{j}}{m||x_j - C_i||^2}\\
u_{ij}=(\frac{-\lambda_{j}}{m||x_j - C_i||^2})^{\frac{1}{m-1}}\\
u_{ij}=(-\frac{\lambda_{j}}{m})^{\frac{1}{m-1}}{\frac{1}{||x_j - C_i||^{\frac{2}{m-1}}}}
\]

将上式求出来的\(u_{ij}\)带入约束条件中:

\[1=\sum_{i=1}^{L}u_{ij}=\sum_{i=1}^{L}(-\frac{\lambda_{j}}{m})^{\frac{1}{m-1}}{\frac{1}{||x_j - C_i||^{\frac{2}{m-1}}}}\\
1=(-\frac{\lambda_{j}}{m})^{\frac{1}{m-1}}\sum_{i=1}^{L}{\frac{1}{||x_j - C_i||^{\frac{2}{m-1}}}}\\
(-\frac{\lambda_{j}}{m})^{\frac{1}{m-1}}=\frac{1}{\sum_{i=1}^{L}{\frac{1}{||x_j - C_i||^{\frac{2}{m-1}}}}}
\]

将上式求出来的结果带入\(u_{ij}\)中,可得

\[u_{ij}=\frac{1}{\sum_{k=1}^{L}{\frac{1}{||x_j - C_k||^{\frac{2}{m-1}}}}}{\frac{1}{||x_j - C_i||^{\frac{2}{m-1}}}}\\
u_{ij}=\frac{1}{\sum_{k=1}^{L}{(\frac{||x_j - C_i||}{||x_j - C_k||})^{\frac{2}{m-1}}}}
\]

\(J\)对\(c_{i}\)求偏导:

\[\frac{\partial{J}}{\partial{C_i}}=\sum_{j=1}^{N}{u_{ij}^{m}2(x_j-C_i)(-1)}=0\\
\sum_{j=1}^{N}{u_{ij}^{m}(x_j-C_i)}=0\\
\sum_{j=1}^{N}{u_{ij}^{m}}x_j - C_i\sum_{s=1}^{N}{u_{is}^{m}}=0\\
C_i=\frac{\sum_{j=1}^{N}{u_{ij}^{m}}x_j}{\sum_{s=1}^{N}{u_{is}^{m}}}\\
C_i=\sum_{j=1}^{N}{\frac{u_{ij}^{m}}{\sum_{s=1}^{N}{u_{is}^{m}}}x_j}
\]

四、Matlab实现

%% ------------------------ 编码信息 -------------------------
% Author: Lee Wen-Tsao
% Time: 2021-09-01
% Content: Fuzzy C-Means
% Parameter:
% n: 数据长度
% k: 分类数目
% m: 模糊指数,取值范围(1.5, 2.5) %% ----------------------- 清理运行环境 -----------------------
clc;
clear;
close all; %% 输入数据
Iris = uiimport('iris.data');
Iris = cellfun(@(x) regexp(x,',','split'), Iris.iris,'UniformOutput',false);
data = cellfun(@(x) x(:,1:4),Iris,'UniformOutput',false);
data = str2double(reshape([data{:}],4,150)'); %% 定义参数
[n, d] = size(data);
maxIter = 1000;
k = 3;
m = 2;
display = true;
epsilon = 0.01; %% 初始化隶属度矩阵
random_mat = rand(k,n);
sum_mat = sum(random_mat);
MembershipMat = random_mat ./ sum_mat; %% 拟合数据
obj_fcn = zeros(1,maxIter);
for it=1:maxIter
% 更新簇心
centers = updateCenter(MembershipMat, data, m, k);
% 更新隶属矩阵
[MembershipMat, dists] = updateMembershipMat(centers, data, k, n, m);
% 计算目标函数值
obj_fcn(it) = sum(sum((MembershipMat.^m).*(dists.^2)));
if display
fprintf('Iteration count=%d, obj_fcn=%f\n',it, obj_fcn(it))
end
if it > 1
if abs(obj_fcn(it)-obj_fcn(it-1))<epsilon, break;end
end
end
tatgets = getLabel(MembershipMat); %% 根据隶属度矩阵更新聚类中心
function Centroids = updateCenter(MembershipMat, data, m, k)
fm = MembershipMat.^m;
summation = sum(fm, 2).*ones(k, size(data,2));
Centroids = (fm*data)./summation;
end %% 更新隶属度矩阵
function [Membership, dist] = updateMembershipMat(Centroids, data, k, n, m)
dist = ones(k, n);
for i=1:k
dist(i,:) = vecnorm(data - Centroids(i,:), 2, 2)';
end
Mebership = dist.^(-2/(m-1));
summation = sum(Mebership);
Membership = (Mebership./summation);
end %% 获取标签
function labels = getLabel(MembershipMat)
[~, labels] = max(MembershipMat);
end

注意:鸢尾花(Iris)数据集来自UCI数据库。

模糊C均值算法的更多相关文章

  1. 模糊C均值聚类-FCM算法

    FCM(fuzzy c-means) 模糊c均值聚类融合了模糊理论的精髓.相较于k-means的硬聚类,模糊c提供了更加灵活的聚类结果.因为大部分情况下,数据集中的对象不能划分成为明显分离的簇,指派一 ...

  2. paper 104: 彩色图像高速模糊的懒惰算法

    工程及源代码:快速模糊.rar                            图像模糊算法有很多种,我们最常见的就是均值模糊,即取一定半径内的像素值之平均值作为当前点的新的像素值,在一般的工业 ...

  3. 多核模糊C均值聚类

    摘要: 针对于单一核在处理多数据源和异构数据源方面的不足,多核方法应运而生.本文是将多核方法应用于FCM算法,并对算法做以详细介绍,进而采用MATLAB实现. 在这之前,我们已成功将核方法应用于FCM ...

  4. 基于核方法的模糊C均值聚类

    摘要: 本文主要针对于FCM算法在很大程度上局限于处理球星星团数据的不足,引入了核方法对算法进行优化.  与许多聚类算法一样,FCM选择欧氏距离作为样本点与相应聚类中心之间的非相似性指标,致使算法趋向 ...

  5. 模糊C均值聚类的公式推导

    j=1...n,N个样本 i=1...c,C聚类 一.优化函数 FCM算法的数学模型其实是一个条件极值问题: 把上面的条件极值问题转化为无条件的极值问题,这个在数学分析上经常用到的一种方法就是拉格朗日 ...

  6. 聚类算法:K-means 算法(k均值算法)

    k-means算法:      第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设 ...

  7. R语言 模糊c均值(FCM)算法程序(转)

    FCM <- function(x, K, mybeta = 2, nstart = 1, iter_max = 100, eps = 1e-06) { ## FCM ## INPUTS ## ...

  8. 一句话总结K均值算法

    一句话总结K均值算法 核心:把样本分配到离它最近的类中心所属的类,类中心由属于这个类的所有样本确定. k均值算法是一种无监督的聚类算法.算法将每个样本分配到离它最近的那个类中心所代表的类,而类中心的确 ...

  9. 聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

    1.用python实现K均值算法 import numpy as np x = np.random.randint(1,100,20)#产生的20个一到一百的随机整数 y = np.zeros(20) ...

随机推荐

  1. cmd命令配置MySQL

    当安装完MySql后,每次windows启动的时候都会将MySql服务启动起来. 如果是winxp则不需要使用管理员权限既可以很简单的打开和关闭,具体在cmd中敲入命令: 1.启动MySql服务: n ...

  2. IPv6 寻址方式简介

     在计算机网络中,寻址模式是指在网络上托管地址的机制.IPv6 提供了多种类型的模式,可以通过这些模式对单个主机进行寻址.也可以同时对多个主机进行寻址或者寻址最近距离的主机. 单播寻址 在单播寻址方式 ...

  3. 7.5 实现基于探针对pod中的访问的健康状态检查

    1.pod的声明周期 取值 描述 Pending Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行.此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间, R ...

  4. [CSP-S2019] 树的重心

    也是一个很不错的题目. 考虑我们钦定重心为根. 那么就有这样一个性质: 如果我们断的边在一个点的子树里,则这个点不会成为断边后的分裂树的根. 所以我们就只要考虑断边在子树外即可. 那么我们设\(x\) ...

  5. [POI2002][HAOI2007]反素数

    题意 反素数 想法 证明这样一个结论 对于一个可行的反素数\(p\) \(p = \sum_{i}^{k} p_{k} ^ {c_k}\) 当 \(p_i > p_j 有 c_i < c_ ...

  6. MYSQL5.8---1

    主键不能为空,唯一键可以为空且可以多个唯一键 外键必须为另一个表中的主键 外键的用途是确保数据的完整性.它通常包括以下几种: 1 实体完整性,确保每个实体是唯一的(通过主键来实施) 2 域完整性,确保 ...

  7. Linux—su命令和su -命令的差别(切换登录账号)

    1.普通用户切换到root用户,命令su或su - 本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户是普通用户,而更改 ...

  8. Python爬虫3大解析库使用导航

    1. Xpath解析库 2. BeautifulSoup解析库 3. PyQuery解析库

  9. Java 读取TXT文件的多种方式

    1).按行读取TXT文件package zc;import java.io.BufferedReader;import java.io.File;import java.io.FileNotFound ...

  10. LeetCode:旋转图像

    题目描述 给定一个 n × n 的二维矩阵 matrix 表示一个图像.请你将图像顺时针旋转 90 度. 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要 使用另一个矩阵来旋转图 ...