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

http://www.xdnf.cn/news/478531.html

相关文章:

  • K8s CoreDNS 核心知识点总结
  • 捌拾伍- 量子傅里叶变换 (3)
  • 【目标检测】RT-DETR
  • 智脑进化:神经网络如何从单层感知机迈向深度学习新纪元
  • 动态规划(2):问题建模与状态设计
  • 求职困境:开发、AI、运维、自动化
  • 序列dp常见思路总结
  • RabbitMQ 消息模式实战:从简单队列到复杂路由(四)
  • 卡顿检测与 Choreographer 原理
  • Java大师成长计划之第24天:Spring生态与微服务架构之分布式配置与API网关
  • window 显示驱动开发-使用有保证的协定 DMA 缓冲区模型
  • 论信息系统项目的范围管理
  • 后端框架(3):Spring(2)
  • Gitee DevOps:中国企业数字化转型的“本土化加速器“
  • Ubuntu 更改 Nginx 版本
  • PCIE接收端检测机制分析
  • 源码:处理文件格式和字符集的相关代码(3-3)
  • Qt图表绘制(QtCharts)- 性能优化(13)
  • 关于Redisson分布式锁的用法
  • TRTC实时对话式AI解决方案,助力人机语音交互极致体验
  • Python 编程技巧 @ 玩转 For 循环
  • Linux `ps` 命令深度解析与高阶应用指南
  • 简单介绍C++中线性代数运算库Eigen
  • 【未完】【GNN笔记】EvolveGCN:Evolving Graph Convolutional Networks for Dynamics Graphs
  • sqli-labs靶场29-31关(http参数污染)
  • ECPF 简介
  • python爬虫实战训练
  • vscode debug node + 前端
  • 学习51单片机02
  • Vue.js---计算属性computed和lazy