在这篇博客中,我们将探讨一个MATLAB代码示例,它展示了如何从Excel文件导入数据,进行模糊C均值(FCM)聚类,并通过2D和3D图形可视化聚类结果。让我们一步一步地深入这个过程!
1. 环境准备
首先,我们需要清空工作环境,以确保没有旧变量干扰我们的结果。这可以通过以下几行代码实现:
Matlab
clear; clc; close all;
2. 导入数据
接下来,我们从名为data.xlsx
的Excel文件中读取数据。这里,我们使用xlsread
函数来加载数据,并获取数据的行数和列数:
Matlab
filename = 'data.xlsx';
data = xlsread(filename);
[data_n, in_n] = size(data);
3. 数据降维
如果我们的数据特征超过3列,我们将使用主成分分析(PCA)将数据降维到3个主成分。这是为了确保我们能够有效地进行可视化:
Matlab
if in_n > 3
[coeff, score, ~] = pca(data);
data = score(:, 1:3);
in_n = 3;
end
4. 绘制原始数据
在降维后,我们可以绘制原始数据。如果数据是2D的,我们使用plot
函数;如果是3D的,则使用plot3
函数
Matlab
if in_n == 2
plot(data(:, 1), data(:, 2), 'ro', 'MarkerSize', 8);
xlabel '横坐标X'; ylabel '纵坐标Y'; title '样本数据(2D)';
elseif in_n == 3
plot3(data(:, 1), data(:, 2), data(:, 3), 'ro', 'MarkerSize', 8);
xlabel 'X轴'; ylabel 'Y轴'; zlabel 'Z轴'; title '样本数据(3D)';
grid on;
end
5. 初始化FCM聚类参数
接下来,我们初始化FCM的相关参数,包括分类数K、最大迭代次数maxgen
、模糊指数alpha
和阈值threshold
。并初始化隶属度矩阵U:
Matlab
K = 4; maxgen = 100; alpha = 3; threshold = 1e-6;
U = rand(K, data_n);
col_sum = sum(U);
U = U ./ col_sum(ones(K, 1), :);
6. FCM聚类迭代
在主循环中,我们更新聚类中心、计算距离和目标函数,并更新隶属度矩阵,直到满足终止条件:
Matlab
for i = 1:maxgen
mf = U.^alpha;
center = mf * data ./ ((ones(in_n, 1) * sum(mf'))');
dist = zeros(size(center, 1), data_n);
for k = 1:size(center, 1)
dist(k, :) = sqrt(sum(((data - ones(data_n, 1) * center(k, :)).^2)', 1));
end
J(i) = sum(sum((dist.^2) .* mf));
tmp = dist.^(-2/(alpha-1));
U = tmp ./ (ones(K, 1) * sum(tmp));
if i > 1 && abs(J(i) - J(i-1)) < threshold
break;
end
end
7. 绘制聚类结果
最后,我们绘制聚类结果。如果数据是2D的,我们使用plot
;如果是3D的,我们使用plot3
:
Matlab
if in_n == 2
figure('Name', '2D FCM聚类结果');
hold on;
for i = 1:K
col = find(index == i);
plot(data(col, 1), data(col, 2), '*', 'MarkerSize', 8, 'Color', colors(i));
end
plot(center(:, 1), center(:, 2), 'p', 'color', 'm', 'MarkerSize', 12, 'MarkerFaceColor', 'k');
title '2D FCM优化后的聚类图';
grid on;
end
if in_n == 3
figure('Name', '3D FCM聚类结果');
hold on;
for i = 1:K
col = find(index == i);
plot3(data(col, 1), data(col, 2), data(col, 3), '*', 'MarkerSize', 8, 'Color', colors(i));
end
plot3(center(:, 1), center(:, 2), center(:, 3), 'p', 'color', 'm', 'MarkerSize', 12, 'MarkerFaceColor', 'k');
title '3D FCM优化后的聚类图';
grid on;
end
8. 目标函数变化过程
最后,我们绘制目标函数的变化过程,以便观察算法的收敛情况:
Matlab
figure;
plot(J, 'r', 'linewidth', 2);
xlabel '迭代次数'; ylabel '目标函数值';
title 'FCM聚类目标函数变化过程';
grid on;
总结
通过上述代码,我们可以实现从数据导入、降维到聚类和可视化的完整流程。这种方法不仅简洁明了,还提供了清晰的视觉反馈,帮助我们更好地理解聚类效果。希望这篇博客能够为你在MATLAB中的数据分析和聚类提供一些实用的启示!如果你有任何问题或建议,欢迎留言讨论!
附件:测试数据生成代码
Matlab
% 生成4列100行的随机数据
data = rand(100, 4);
% 保存为data.xlsx
writematrix(data, 'data.xlsx');
% 显示生成的数据
disp(data);