matlab---k-means算法与fuzzy-c-means算法详解与比较

 2024-01-29 00:01:54  阅读 0

k均值算法

(1)k-means算法和fuzzy-c-means算法都是聚类方法的一类。聚类就是通过静态分类的方法将相似的对象分为不同的组或者多个子集,使得同一子集中的成员对象具有相似的属性。属性。

(2)聚类中的划分方法:给定一个包含N个元组或记录的数据集,构造K(K<N)个组。 每组代表一个簇:每组至少包含一条数据。 对于给定的K,算法首先给出一个初始分组方法,然后通过反复迭代改变分组方式,使得每一种改进的分组方案都比前一种更好,而所谓的好标准就是:同一分组中的记录越接近越好,不同分组中的记录越远越好

聚类算法可以应用于很多领域,例如:

营销:找到具有相似行为的客户群,提供包含客户属性和过去购买情况的大型客户数据数据库;

生物学:植物和动物的分类;

图书馆:图书订购;

保险:识别平均索赔成本较高的汽车保险单位组; 识别欺诈

城市规划:根据住房类型、价值和位置确定住房组;

地震研究:地震震中集群观测,识别危险区域;

(3)k-means算法:该算法是一种硬聚类算法。 隶属度只有两个值0或1。它是基于原型的目标函数聚类方法的代表。 数据点到原型的一定距离为 优化后的目标函数采用求函数极值的方法来获得迭代运算的调整规则。 K-means 算法使用欧几里德距离作为相似性度量。 它寻求某个初始聚类中心向量V对应的最优分类,以最小化评价指标J。算法采用误差平方和准则函数作为聚类准则函数。

Ak-means的归属矩阵:

Bk-means实施步骤

(1) 随机选择k个数据点Ci, i=1, 2, 3, ..., k作为每个簇的初始中心。

(2)确定每个数据点所属的簇。 如果判断数据点X属于第i个簇,则权重值wji = 1,否则为0。

并满意

(3) 根据式(1)计算目标函数J。 如果J保持不变,则说明聚类结果已经稳定,迭代方法可以结束。 否则进入步骤(4)

(4)根据式(4)更新簇的中心点。 返回步骤(2)

CN迭代后

D.算法的优缺点:

优点:算法快速、简单; 对于大数据集具有高效率和可扩展性; 时间复杂度接近线性,适合大规模数据集的挖掘。 K-Means聚类算法的时间复杂度为O(nkt),其中n表示数据集中的对象数量,t表示算法迭代次数,k表示聚类数量。

缺点:K-means算法中,K是预先给定的。 这个K值的选择是非常难以估计的,因此事先并不知道给定的数据集应该分为多少个类别才是最合适的。

在K-means算法中,首先需要根据初始聚类中心确定初始划分,然后对初始划分进行优化。 如果初始值选择不好,可能得不到有效的聚类结果。

该算法需要不断调整样本分类,并不断计算调整后的新的聚类中心。 因此,当数据量非常大时,算法的时间开销就比​​较大。

设计步骤

要使用此计算,需要提前确定簇的数量 k。 如果初始聚类中心位置不理想,导致目标函数J陷入局部解,最终分类的聚类也不会理想。

(1) 设置簇数K、最大执行步长tmax、小容忍误差ε>0

(2)确定聚类中心起始位置Cj(0),0<j≤K

(3) 对于 t=1,…,tmax

(A) 对于 j=1,…,N

i 计算每个数据点到聚类中心的距离

ii 计算数据点属于哪个簇(隶属矩阵)

(B) 更新聚类中心

(C) 计算收敛准则,如果

如果成立则停止运行,否则进行下一轮迭代

使用k-means算法前后对比:

K-Means算法聚类是一种“硬划分”,将每个待识别的对象严格划分为某一类,具有非此即彼的性质。

例子

两种方法都迭代得到最终的聚类划分,即聚类中心和隶属度值。 它们都不能保证找到问题的最优解,并且都可能收敛到局部极值,模糊c均值甚至可能是鞍点。

例如:对于一维的例子,给定一个特定的数据集,分布如下:

k-means:图中有两类数据,A和B。使用k-means算法,每个数据都与特定的质心相关联。 隶属函数如下:

详细设计

clear all;close all;clc;
% µÚÒ»×éÊý¾Ý
mu1=[0 0 ];  %¾ùÖµ
S1=[.1 0 ;0 .1];  %Э·½²î
data1=mvnrnd(mu1,S1,100);   %²úÉú¸ß˹·Ö²¼Êý¾Ý
%µÚ¶þ×éÊý¾Ý
mu2=[1.25 1.25 ];
S2=[.1 0 ;0 .1];
data2=mvnrnd(mu2,S2,100);
% µÚÈý×éÊý¾Ý
mu3=[-1.25 1.25 ];
S3=[.1 0 ;0 .1];
data3=mvnrnd(mu3,S3,100);
% ÏÔʾÊý¾Ý
plot(data1(:,1),data1(:,2),'b+');
hold on;
plot(data2(:,1),data2(:,2),'r+');
plot(data3(:,1),data3(:,2),'g+');
grid on;
%  ÈýÀàÊý¾ÝºÏ³ÉÒ»¸ö²»´ø±êºÅµÄÊý¾ÝÀà
data=[data1;data2;data3]; 
N=3;%ÉèÖþÛÀàÊýÄ¿
[m,n]=size(data);
pattern=zeros(m,n+1);
center=zeros(N,n);%³õʼ»¯¾ÛÀàÖÐÐÄ
pattern(:,1:n)=data(:,:);
for x=1:N
    center(x,:)=data( randi(300,1),:);%µÚÒ»´ÎËæ»ú²úÉú¾ÛÀàÖÐÐÄ
end
while 1
distence=zeros(1,N);
num=zeros(1,N);
new_center=zeros(N,n);
 
for x=1:m
    for y=1:N
    distence(y)=norm(data(x,:)-center(y,:));%¼ÆË㵽ÿ¸öÀàµÄ¾àÀë
    end
    [~, temp]=min(distence);%Çó×îСµÄ¾àÀë
    pattern(x,n+1)=temp;         
end
k=0;
for y=1:N
    for x=1:m
        if pattern(x,n+1)==y
           new_center(y,:)=new_center(y,:)+pattern(x,1:n);
           num(y)=num(y)+1;
        end
    end
    new_center(y,:)=new_center(y,:)/num(y);
    if norm(new_center(y,:)-center(y,:))<0.1
        k=k+1;
    end
end
if k==N
     break;
else
     center=new_center;
end
end
[m, n]=size(pattern);
 
%×îºóÏÔʾ¾ÛÀàºóµÄÊý¾Ý
figure;
hold on;
for i=1:m
    if pattern(i,n)==1 
         plot(pattern(i,1),pattern(i,2),'r*');
         plot(center(1,1),center(1,2),'ko');
    elseif pattern(i,n)==2
         plot(pattern(i,1),pattern(i,2),'g*');
         plot(center(2,1),center(2,2),'ko');
    elseif pattern(i,n)==3
         plot(pattern(i,1),pattern(i,2),'b*');
         plot(center(3,1),center(3,2),'ko');
    elseif pattern(i,n)==4
         plot(pattern(i,1),pattern(i,2),'y*');
         plot(center(4,1),center(4,2),'ko');
    else
         plot(pattern(i,1),pattern(i,2),'m*');
         plot(center(4,1),center(4,2),'ko');
    end
end
grid on;

实验结果

初始数据:

当N=3时

N=4

N=5

结果分析

测试 k 均值算法时,两种类型的点重叠。 经过分析,我认为该算法不适合处理离散数据,但对于连续数据有很好的聚类效果。 不同的初始值可能会导致不同的结果。 设置更多不同的初始值会很耗时,而且浪费资源。

该算法得到的结果并不稳定。 原因是该算法对初始质心的选择非常敏感。 随机选择质心可能会得到错误的结果,迭代次数也会变大。 如果初始质心恰好在5个簇内,那么算法结果就会稳定。 初始质心之间的距离不宜太近,因此可以进行以下优化:

1.从输入数据点集中随机选择一个点作为第一个聚类中心

2.对于数据集中的每个点,计算它与所选聚类中心中最近的聚类中心之间的距离D(x)。

3. 选择一个新的数据点作为新的聚类中心。 选择原则是D(x)较大的点。

被选为聚类中心的概率较高

4. 重复2和3,直到选择k个聚类质心

5. 使用这k个质心作为初始质心来运行标准K-Means算法

模糊C均值算法

模糊聚类算法,是 k 均值聚类算法的推广形式。 成员资格值是区间 [0 1] 中的任意数字。 基本依据是“类内加权平方和误差最小化”准则。 ; 其目标函数的定义与K-Means聚类方法类似,但其权重矩阵W不再是二元矩阵,而是采用了模糊理论的概念,使得每个输入向量不再只属于特定的簇。 ,其归属度用来表示对每个簇的归属程度。

A.fuzzy-c-means算法实现步骤:

(1)设置类别数k,设置初始权重矩阵,随机赋予0到1之间的值,满足权重之和为1,如下式所示

(2)计算聚类中心点

(3)根据目标函数公式计算目标函数值。 当目标函数值小于设定的容差误差时,迭代过程即可结束。 否则,执行

(4)重新计算权重矩阵W并返回步骤B进行操作

B.算法的优缺点:

Fuzzy-c-means算法是一种基于目标函数优化的数据聚类方法。 该算法是一种无监督的模糊聚类方法,在算法实现过程中不需要人为干预。该算法的缺点:首先,算法中需要设置一些参数。 如果参数的初始化选择不当,可能会影响聚类结果的正确性; 其次,当数据样本集较大、特征数量较多时,算法的实时性不是很好。 另外,该算法容易陷入局部极小值,且对初始值敏感。

设计步骤

同样,簇的数量也需要提前确定。 与K-Means不同的是,Fuzzy C-Means聚类方法增加了模糊概念,使得每个输入向量不再只属于某个特定的簇,而是用其隶属度来表示

(1) 设置簇数K、最大执行步长tmax、小容忍误差ε>0

(2)确定聚类中心起始位置Cj(0),0<j≤K

(3)对于 t=1,…,tmax

A.对于j=1,…,N,计算隶属度矩阵

B.对于i=1,…,K,更新簇中心点。

C. 计算收敛准则。 如果以下等式成立,则停止操作,否则继续下一次迭代。

例子

模糊c-means:相同的数据不单独属于一类,而是可以出现在中间。 在这个例子中,隶属函数变得更加平滑,表明每个数据可能属于多个类别。

详细设计

function [U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm(Data,C,plotflag,M,epsm)
% 模糊 C 均值聚类 FCM: 从随机初始化划分矩阵开始迭代
% [U,P,Dist,Cluster_Res,Obj_Fcn,iter] = fuzzycm(Data,C,plotflag,M,epsm)
% 输入:
% Data: N×S 型矩阵,聚类的原始数据,即一组有限的观测样本集,
% Data 的每一行为一个观测样本的特征矢量,S 为特征矢量
% 的维数,N 为样本点的个数
% C: 聚类数,1
% plotflag: 聚类结果 2D/3D 绘图标记,0 表示不绘图,为缺省值
% M: 加权指数,缺省值为 2
% epsm: FCM 算法的迭代停止阈值,缺省值为 1.0e-6
% 输出:
% U: C×N 型矩阵,FCM 的划分矩阵
% P: C×S 型矩阵,FCM 的聚类中心,每一行对应一个聚类原型
% Dist: C×N 型矩阵,FCM 各聚类中心到各样本点的距离,聚类中
% 心 i 到样本点 j 的距离为 Dist(i,j)
% Cluster_Res: 聚类结果,共 C 行,每一行对应一类
% Obj_Fcn: 目标函数值
% iter: FCM 算法迭代次数
% See also: fuzzydist maxrowf fcmplot
if nargin<5
epsm=1.0e-6;
end
if nargin<4
M=2;
end
if nargin<3
plotflag=0;
end
[N,S]=size(Data);m=2/(M-1);iter=10000;
Dist(C,N)=0; U(C,N)=0; P(C,S)=0;
% 随机初始化划分矩阵
U0 = rand(C,N);
U0=U0./(ones(C,1)*sum(U0));
% FCM 的迭代算法
while true
% 迭代计数器
iter=iter+1;
% 计算或更新聚类中心 P
Um=U0.^M;
P=Um*Data./(ones(S,1)*sum(Um'))';
% 更新划分矩阵 U
for i=1:C
for j=1:N
Dist(i,j)=fuzzydist(P(i,:),Data(j,:));
end
end
U=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m))));
% 目标函数值: 类内加权平方误差和
if nargout>4 | plotflag
Obj_Fcn(iter)=sum(sum(Um.*Dist.^2));
end
% FCM 算法迭代停止条件
if norm(U-U0,Inf) break
end
U0=U;
end
% 聚类结果
if nargout > 3
res = maxrowf(U);
for c = 1:
v = find(res==c);
Cluster_Res(c,1:length(v))=v;
end
end
% 绘图
if plotflag
fcmplot(Data,U,P,Obj_Fcn);
end

实验结果

N=3

N=4

模糊聚类是一种识别模式中的无监督学习。 它不需要训练样本,可以直接通过机器学习实现自动分类。 模糊c均值算法的隶属度是0到1之间的任意数字,它反映了数据点与类中心之间的实际关系。 从程序运行结果可以看出,在两种不同的距离参数下,点的聚类中心粒子是不同的。 根据生成的图,可以观察到划分为簇的三个类别之间的点数存在细微差异。 。

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码