高光谱遥感图像处理之数据分类的fcm算法

发布于:2025-05-17 ⋅ 阅读:(17) ⋅ 点赞:(0)

基于模糊C均值聚类(FCM)的高光谱遥感图像分类MATLAB实现示例

%% FCM高光谱图像分类示例
clc; clear; close all;

%% 数据加载与预处理
% 加载示例数据(此处使用公开数据集Indian Pines的简化版)
load('indian_pines.mat'); % 包含变量data(610x145x200)和ground_truth(610x145)
data = double(reshape(data, [], 200)); % 转换为610x145x200 → 92450x200矩阵
data = data ./ max(max(max(data)));   % 简单归一化

% 生成训练样本(实际应用中应使用更合理采样方法)
[trainInd, ~] = crossvalind('HoldOut', size(data,1), 0.3);
trainData = data(trainInd,:);
testData = data(~trainInd,:);

%% FCM参数设置
options = [2, 100, 1e-5, 0]; % 参数向量:[模糊指数m, 最大迭代次数, 误差阈值, 显示信息]
numClusters = 16;            % 聚类数目
exponent = options(1);       % 模糊权重指数m

%% 执行FCM聚类
[centers, U] = fcm(trainData', numClusters, [2 options(2) options(3) options(4)]);

%% 分类预测
% 计算测试样本隶属度
testU = zeros(size(testData,1), numClusters);
for i = 1:size(testData,1)
    distances = sum((centers' - testData(i,:)).^2, 2);
    testU(i,:) = 1 ./ (distances.^(2/(exponent-1)) * sum(1./distances.^(2/(exponent-1))));
end

% 获取最终分类结果
[~, predictedLabels] = max(testU, [], 2);

%% 结果评估(假设有ground truth)
% 转换测试集真实标签
trueLabels = ground_truth(~trainInd);
% 计算混淆矩阵
C = confusionmat(trueLabels, predictedLabels);
% 计算总体准确率
OA = sum(diag(C))/sum(C(:));
disp(['Overall Accuracy: ', num2str(OA*100), '%']);

%% 可视化(降维展示)
% 使用t-SNE进行降维
Y = tsne(testData(:,1:10)); % 取前10个波段进行可视化
figure;
gscatter(Y(:,1), Y(:,2), predictedLabels);
title('FCM Classification Result (t-SNE Projection)');
xlabel('t-SNE 1'); ylabel('t-SNE 2');

%% FCM函数实现
function [centers, U] = fcm(data, numClusters, options)
    % 输入:
    % data      - 输入数据矩阵(N x D)
    % numClusters - 聚类数目
    % options   - [m, maxIter, error, display]
    % 输出:
    % centers   - 聚类中心(N x 1)
    % U         - 隶属度矩阵(numClusters x N)

    [N, D] = size(data);
    m = options(1);        % 模糊指数
    maxIter = options(2);  % 最大迭代次数
    error = options(3);    % 停止阈值
    display = options(4);  % 显示信息标志

    % 初始化隶属度矩阵
    U = rand(numClusters, N);
    U = U ./ sum(U, 1);

    for iter = 1:maxIter
        % 更新聚类中心
        centers = (U.^m)' * data ./ sum(U.^m)';
        
        % 计算距离矩阵
        distances = pdist2(data, centers);
        
        % 更新隶属度矩阵
        U_new = 1 ./ (distances.^(-2/(m-1)) * ones(1,N));
        
        % 检查收敛
        if max(abs(U_new(:) - U(:))) < error
            break;
        end
        U = U_new;
        
        if display && mod(iter,10)==0
            fprintf('Iteration %d, Max Error: %f\n', iter, max(abs(U_new(:)-U(:))));
        end
    end
end

代码说明:

  1. 数据准备
    • 使用Indian Pines数据集作为示例(需自行下载完整数据)
    • 数据归一化处理以提高聚类效果
    • 采用30%的数据作为训练样本
  2. FCM实现
    • 包含自定义的FCM函数实现
    • 支持模糊指数调整(默认m=2)
    • 包含收敛判断和迭代信息显示
  3. 分类预测
    • 对测试样本计算各聚类中心的隶属度
    • 通过最大隶属度原则确定最终分类
  4. 结果评估
    • 计算总体准确率(OA)
    • 显示混淆矩阵
  5. 可视化
    • 使用t-SNE进行高维数据降维可视化
    • 不同颜色表示不同分类结果

高光谱遥感图像处理之数据分类的fcm算法源代码maltlab

使用建议:

  1. 需要安装Statistics and Machine Learning Toolbox
  2. 实际应用时应:
    • 使用更合理的训练样本选择方法(如分层抽样)
    • 调整FCM参数(模糊指数m通常取1.5-2.5)
    • 考虑结合领域知识选择聚类数目
    • 对于大数据可采用分块处理或降维技术
  3. 性能优化方向:
    • 使用矩阵运算代替循环
    • 利用GPU加速计算
    • 采用更高效的数据结构

注意事项:

  • 高光谱数据维度较高时建议先进行特征选择/降维
  • FCM对初始值敏感,可多次运行取最优结果
  • 实际应用中应结合光谱匹配等专业方法进行验证

如果需要处理实际高光谱数据文件(如ENVI格式),可以添加相应的数据读取代码,并调整数据预处理步骤。


网站公告

今日签到

点亮在社区的每一天
去签到