“降维模糊C均值(PCA-FCM)”创新算法的聚类与可视化

在这篇博客中,我们将探讨一个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);
相关推荐
你不是我我1 天前
【Java 开发日记】HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·开发语言·微服务
IT大白鼠1 天前
AIGC性能的关键瓶颈:算力、数据、算法三者如何互相制约?
算法·aigc
tjl521314_211 天前
04C++ 名称空间(Namespace)
开发语言·c++
赏金术士1 天前
Kotlin 数据流与单双向绑定
android·开发语言·kotlin
T.i.s1 天前
基于MATLAB的ECG R峰自动检测与交互式校正系统
matlab·信号处理·心电图
白雪茫茫1 天前
监督学习、半监督学习、无监督学习算法详解
python·学习·算法·ai
FengyunSky1 天前
浅析 空间频率响应 SFR 计算
算法
树下水月1 天前
PHP 一种改良版的雪花算法
算法·php·dreamweaver
逻辑驱动的ken1 天前
Java高频面试场景题25
java·开发语言·深度学习·面试·职场和发展
一只数据集1 天前
全尺寸人形机器人灵巧手力觉触觉数据集-2908条ROSbag数据覆盖14大应用场景深度解析
大数据·人工智能·算法·机器人