高光谱遥感图像处理之数据分类的fcm算法
基于模糊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(:))) < errorbreak;endU = U_new;if display && mod(iter,10)==0fprintf('Iteration %d, Max Error: %f\n', iter, max(abs(U_new(:)-U(:))));endend
end
代码说明:
- 数据准备:
- 使用Indian Pines数据集作为示例(需自行下载完整数据)
- 数据归一化处理以提高聚类效果
- 采用30%的数据作为训练样本
- FCM实现:
- 包含自定义的FCM函数实现
- 支持模糊指数调整(默认m=2)
- 包含收敛判断和迭代信息显示
- 分类预测:
- 对测试样本计算各聚类中心的隶属度
- 通过最大隶属度原则确定最终分类
- 结果评估:
- 计算总体准确率(OA)
- 显示混淆矩阵
- 可视化:
- 使用t-SNE进行高维数据降维可视化
- 不同颜色表示不同分类结果
高光谱遥感图像处理之数据分类的fcm算法源代码maltlab
使用建议:
- 需要安装Statistics and Machine Learning Toolbox
- 实际应用时应:
- 使用更合理的训练样本选择方法(如分层抽样)
- 调整FCM参数(模糊指数m通常取1.5-2.5)
- 考虑结合领域知识选择聚类数目
- 对于大数据可采用分块处理或降维技术
- 性能优化方向:
- 使用矩阵运算代替循环
- 利用GPU加速计算
- 采用更高效的数据结构
注意事项:
- 高光谱数据维度较高时建议先进行特征选择/降维
- FCM对初始值敏感,可多次运行取最优结果
- 实际应用中应结合光谱匹配等专业方法进行验证
如果需要处理实际高光谱数据文件(如ENVI格式),可以添加相应的数据读取代码,并调整数据预处理步骤。