使用matlab绘制2维、3维气泡图

在学习模糊c均值聚类时,突然想到能否将每个样本对所属簇的奴属度(C)用气泡图的形式表示出来,这样就可以在一张图上同时获得分类与奴属度(C)两类信息。在matlab中没有绘制气泡图的专用函数,不过可以通过手动设置参数,来最终达到气泡图的效果。以下是实现代码。

二维气泡图的绘制

% 这个脚本用来对模糊c均值聚类生成二维气泡图
clc
clear 
%% 获得模糊c均值聚类的结果数据
load fcmdata.dat
[centers,U] = fcm(fcmdata,2); % 返回聚类中心信息以及每个数据点奴属与各聚类中心的值
index1 = find(U(1,:)==max(U));% 使用find()函数找到属于第一个聚类中心的元素序号
index2 = find(U(2,:)==max(U));% 获得属于第二个聚类中心的元素序号

%% 绘制二维bubble图
figure
weight = normalize(max(U),'range')*600; % 一种扩大一组数据之间差距的方法,否则气泡效果不明显
weight(weight==0)=(1/20)*mean(weight);% 粗略将0值转化为1/20的均值(这是估计出来的)
% 绘制第一个簇的气泡图
for i=1:length(index1)
    scatter(fcmdata(index1(i),1),fcmdata(index1(i),2),weight(index1(i)),...
        'MarkerEdgeColor','k','MarkerEdgeAlpha',0,'MarkerFaceColor','r',...
        'MarkerFaceAlpha',0.3);
    hold on % 别忘了这句,要不然总是一个点
end
% 绘制第二个簇的气泡图
for i=1:length(index2)
    scatter(fcmdata(index2(i),1),fcmdata(index2(i),2),weight(index2(i)),...
        'MarkerEdgeColor','k','MarkerEdgeAlpha',0,'MarkerFaceColor','b',...
        'MarkerFaceAlpha',0.3);
    hold on % 别忘了这句,要不然总是一个点
end
plot(centers(:,1),centers(:,2),'xk','markersize',10,'linewidth',3);
hold off

最终绘制效果如下图所示:
在这里插入图片描述
气泡的大小代表每个样本的奴属度(C)但可以看出大部分气泡大小差距不大,只有在两分类交界处出现奴属度较小的气泡,这是符合实施规律的。事实上,图中气泡的大小差距是经过放大处理的,若不经历此步操作,气泡的大小是差不多的。

三维气泡图的绘制

原理同二维气泡图一样,直接上代码。

% 使用这个脚本创建三维气泡图
clc
clear
%% 数据集的创建
rng default; % For reproducibility
X = [randn(20,3)*0.75+ones(20,3);randn(20,3)*0.5-ones(20,3)]; % 创建20个样本的二分类数据集
%% 进行模糊c均值聚类
Numclust = 2;
[centers,U] = fcm(X,Numclust);
index1 = find(U(1,:)==max(U)); % 获取簇1的标号
index2 = find(U(2,:)==max(U)); % 获取簇2的标号
weight = normalize(max(U),'range')*800; % 获取气泡权重
weight(weight==0) = (1/20)*mean(weight);  % 调好看一点
%% 绘制3维气泡图
figure
for i = 1:length(index1)
   scatter3(X(index1(i),1),X(index1(i),2),X(index1(i),3),weight(index1(i)),...
       'MarkerEdgeColor','k','MarkerEdgeAlpha',0,'MarkerFaceColor','r',...
        'MarkerFaceAlpha',0.3);
    hold on
end

for i = 1:length(index2)
   scatter3(X(index2(i),1),X(index2(i),2),X(index2(i),3),weight(index2(i)),...
       'MarkerEdgeColor','k','MarkerEdgeAlpha',0,'MarkerFaceColor','b',...
        'MarkerFaceAlpha',0.3);
    hold on
end
plot3(centers(:,1),centers(:,2),centers(:,3),'xk','markersize',10,'linewidth',3);
hold off

最终绘制效果图如下图所示:
在这里插入图片描述

后续

冷静下来想了想,将c值以气泡图形式表示出来似乎有点画蛇添足,不过作为日常编程练习还是有帮助的。matlab入门小白,欢迎大家多多指教!

发布了5 篇原创文章 · 获赞 6 · 访问量 2218

猜你喜欢

转载自blog.csdn.net/qq_35000721/article/details/100133142