• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

模糊算法--k-means算法和fuzzy-c-means算法的比较的matlab实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本次实验打算实现的是分别用k-means算法和fuzzy-c-means算法对客户群体消费水平进行分类,并比较两个算法的差异

输入:1000个90后群体的月收入和月消费和月在网购上的消费数据集三维输入。

输出:将这些群体分成五类以颜色区分输出类别

用途:公司可以根据这些群体的收入和消费水平和花在网购上的水平区分出自己想要的目标用户再进一步根据目标用户制定不同的销售策略


下面是实验的概要设计

   k-means算法:

      1.读取数据

      2.设置聚类数据

      3.初始化聚类中心

      4.随机产生聚类中心

      5.计算各点到每个类的距离

      6.求最小距离

      7.显示聚类后的数据  

   fuzzy-c-means算法:

      1、读取数据

      2、对给定的数据集应用模糊c均值聚类方法进行聚类

      3、满足停止误差准则时,聚类过程结束

      4、显示聚类后的数据


运行的K-means算法代码如下:

clear all;close all;clc;
%  三类数据合成一个不带标号的数据类
load('data1.mat');
data=unnamed; 
N=5;%设置聚类数目
[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');
    elseif pattern(i,n)==5
         plot(pattern(i,1),pattern(i,2),'m*');
         plot(center(5,1),center(5,2),'ko');
    else pattern(i,n)==6
         plot(pattern(i,1),pattern(i,2),'y*');
         plot(center(6,1),center(6,2),'ko');
    end
end
xlabel('收入')
ylabel('消费')
grid on;

运行的fuzzy c-means算法的代码如下:

load data1.mat
plot(unnamed(:,1),unnamed(:,2),'o')
 
[center,U,objFcn] = fcm(unnamed,5);
 
figure
plot(objFcn)
title('Objective Function Values')   
xlabel('Iteration Count')
ylabel('Objective Function Value')
 
maxU = max(U);
index1 = find(U(1,:) == maxU);
index2 = find(U(2,:) == maxU);
index3 = find(U(3,:) == maxU);
index4 = find(U(4,:) == maxU);
index5 = find(U(5,:) == maxU);
% index6 = find(U(6,:) == maxU);
figure
line(unnamed(index1,1), unnamed(index1,2), 'linestyle',...
                        'none','marker', '*','color','r')
line(unnamed(index2,1),unnamed(index2,2),'linestyle',...
                        'none','marker', '*','color','g')
line(unnamed(index3,1),unnamed(index3,2),'linestyle',...
                        'none','marker', '*','color','b')
line(unnamed(index4,1),unnamed(index4,2),'linestyle',...
                        'none','marker', '*','color','y')     
line(unnamed(index5,1),unnamed(index5,2),'linestyle',...
                        'none','marker', '*','color','m')  
% line(unnamed(index6,1),unnamed(index6,2),'linestyle',...
%                         'none','marker', '*','color','m')                                           
hold on
plot(center(1,1),center(1,2),'ko')
plot(center(2,1),center(2,2),'ko')
plot(center(3,1),center(3,2),'ko')
plot(center(4,1),center(4,2),'ko')
plot(center(5,1),center(5,2),'ko')
% plot(center(6,1),center(6,2),'ko')
xlabel('收入')
ylabel('消费')

运行的K-means算法结果图如下:

该实验中数据集中总共有1000个数据集:月收入、月消费、月网购消费。

将月收入和月消费水平进行分类将客户分成五个类别,蓝色代表低收入低消费,红色代表中等收入低消费,紫色代表中等收入中等消费,绿色代表高收入低消费,黄色代表高收入高消费。

将消费水平和网购消费水平进行分类将用户分成五个类别,紫色代表低消费低网购,红色代表中等消费低网购,绿色代表高消费低网购,黄色代表高消费中等网购,蓝色代表高消费高网购

算法中先读取数据集中的数据,然后设置聚类数目为5类后初始化聚类中心,然后第一次随机产生聚类中心,计算数据点到每个类的距离然后找到最小距离将该数据归为这个类,最后将聚类后的结果以颜色区分的方式显示出来。得到上图的结果图。


运行的fuzzy c-means算法的结果图如下:

在fuzzycm算法中对分类进行了改进,输入数据集和kmeans算法的一样,将结果多分成了七类使得群体可以有更多的细分。

从收入水平和消费水平来看,紫色1代表低收入低消费,绿色代表低收入中等消费,黄色代表中等收入低消费,红色1代表中等收入中等消费,红色2代表高收入低消费,紫色2代表高收入中等消费,蓝色代表高收入高消费。

从消费和网购消费来看,红色1和蓝色代表低消费低网购,紫色1代表中等消费低网购,绿色代表中等消费中等网购,红色2代表高消费低网购,紫色2代表高消费中等网购,黄色代表高消费高网购。

算法中先读取数据集中的数据,然后对给定的数据集应用模糊c均值聚类方法进行聚类并分为7个类,通过优化目标函数得到每个数据对所有类中心的隶属度,从而决定样本点的类以达到自动对样本数据进行分类的目的,最后显示聚类后的数据以颜色加以区分显示出来,如上图结果图所示。


两个算法的比较:

1.速度上:

 

根据运行速度结果显示:kmeans算法用时4.291s,fcm算法用时0.387s,fcm算法完胜。

 

2、精度上:

从两个算法的结果图来看,fcm算法的分类结果的类别更加明显一点,即精度更高,而且也几乎没有出现交叉的情况,fcm赢

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
奇异值分解在图像压缩中的应用(有MATLAB仿真程序)发布时间:2022-07-18
下一篇:
【源码】MATLAB图像分割入门发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap