本次实验打算实现的是分别用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赢
|
请发表评论