当前位置: 首页 > news >正文

高光谱遥感图像处理之数据分类的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

代码说明:

  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格式),可以添加相应的数据读取代码,并调整数据预处理步骤。

相关文章:

  • 采用hovernet统计整张病理切片(png)细胞数量并进行RGB可视化
  • 相机Camera日志分析之九:高通相机Camx 基于预览1帧的ConfigureStreams二级日志分析详解
  • 现代简约中式通用,民国画报风,中国风PPT模版8套一组分享
  • Spring Cloud动态配置刷新:@RefreshScope与@Component的协同机制解析
  • iOS音视频解封装分析
  • LangFlow技术深度解析:可视化编排LangChain应用的新范式 -(2)流编辑器系统
  • 深入理解 Git 分支操作的底层原理
  • SZU 编译原理
  • 深度学习笔记23-LSTM实现火灾预测(Tensorflow)
  • C++_STL_map与set
  • HNUST湖南科技大学-安卓Android期中复习
  • 【Android构建系统】了解Soong构建系统
  • 算法基础 -- 小根堆构建的两种方式:上浮法与下沉法
  • 一款强大的压测带宽工具-iperf3
  • 容器编排利器-k8s入门指南
  • [AI算法] LLM训练-构建transformers custom model
  • 容器化-k8s-使用和部署
  • 前端面经 手写Promise
  • Linux 内核中 inet_accept 的实现与自定义传输协议优化
  • 部署docker上的redis,idea一直显示Failed to connect to any host resolved for DNS name
  • 基金经理调仓引发大金融板块拉升?公募新规落地究竟利好哪些板块
  • 昆明警方重拳打击经济领域违法犯罪:去年抓获905名嫌犯
  • 新能源汽车,告别混乱创新
  • 高波︱忆陈昊:在中年之前离去
  • 福建宁德市长张永宁拟任设区市党委正职,曾获评全国优秀县委书记
  • 国产水陆两栖大飞机AG600批产首架机完成总装下线