作为一个CUMCM的rookie,我参加这个比赛的起因就是想学习可视化工具,建模知识只是附带的,不过在学习之后,我反倒感到建模思维才是我最大的收获。今年的国赛还没有打,我会不定期的记录一点学习过程。今天尝试了调用matlab的工具实现聚类及其可视化。

先上代码:(matlab不是人,代码高亮没人做,绷不住了)

%数据载入
load fisheriris
X = meas(:,3:4);%从矩阵中抽取特征
%————————————————————————-
figure;
plot(X(:,1),X(:,2),\’k.\’,\’MarkerSize\’,10);%(横坐标来源,纵坐标来源,点型,指定大小,大小)
title \’Fisher\’\’s Iris Data\’;
xlabel \’Petal Lengths (cm)\’;
ylabel \’Petal Widths (cm)\’;
%绘制原始数据分布图

%————————————————————————-
rng(1); % For reproducibility (rng函数设置了随机数生成器的当前状态,确保了结果的可复现性)
[idx,C] = kmeans(X,3); %聚类
%————————————————————————-
figure;
scatter(X(:,1),X(:,2),15,idx,\’filled\’);
%用散点图和颜色描述聚类结果

 

 %————————————————————————-

x1 = min(X(:,1)):0.01:max(X(:,1));
x2 = min(X(:,2)):0.01:max(X(:,2));
[x1G,x2G] = meshgrid(x1,x2);
XGrid = [x1G(:),x2G(:)]; % Defines a fine grid on the plot

idx2Region = kmeans(XGrid,3,\’MaxIter\’,1,\’Start\’,C);
%定义了一个精细网格,将整个平面划分为k个部分并分属于各个聚类。
%————————————————————————-
figure;
gscatter(XGrid(:,1),XGrid(:,2),idx2Region,…
[0,0.75,0.75;0.75,0,0.75;0.75,0.75,0],\’..\’);
hold on;
plot(X(:,1),X(:,2),\’k*\’,\’MarkerSize\’,5);
title \’Fisher\’\’s Iris Data\’;
xlabel \’Petal Lengths (cm)\’;
ylabel \’Petal Widths (cm)\’;
legend(\’Region 1\’,\’Region 2\’,\’Region 3\’,\’Data\’,\’Location\’,\’SouthEast\’);
hold off;
%绘制聚类结果图

 

 

在使用中需要注意的几个点:

  • 载入新数据时要重新编写载入部分,并且尽可能使新数据格式(Column的分布)与原示例数据一致。
  • 适当的调整plot和scatter函数以优化效果,也可以尝试用GUI界面进一步美化。
  • 分区过程中其实是使用了第二次聚类,将区域中足够细密的点都进行了归类,需要注意的是第二次聚类不能迭代多次,因为其初始中心即为第一次聚类的结果,多次迭代将导致背离事实的结果。

 

版权声明:本文为Philematology原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Philematology/p/15202823.html