如何用R的varSel包JMdist做Jeffries-Matusita光谱距离分析及解决NA问题
R语言Jeffries-Matusita距离分析问题解决指南
一、JMdist函数使用的统计量说明
JMdist(以RStoolbox包实现为例)计算Jeffries-Matusita距离时,核心依赖两类统计量:
- 类别均值向量:每类在各光谱波段上的平均值,用于描述类别的光谱中心
- 类别协方差矩阵:每类内部各光谱波段的方差及波段间的协方差,用于描述类别的光谱离散程度和波段相关性
注:不需要单独输入标准差,协方差矩阵的对角元素即为各波段的方差(标准差的平方)
二、输出全NA的排查与解决方案
- 检查输入数据类型:不能直接输入ArcGIS导出的MLC分类栅格(仅含类别标签),必须提供带光谱信息的训练样本数据——即每类对应的原始影像像素值(比如从ArcGIS导出的训练样本点光谱数据,或在R中从原始影像提取分类图对应区域的光谱)。
- 排查类别样本量:若某类的样本数量≤波段数(这里是3),协方差矩阵会因奇异无法求逆,导致JM距离为NA。用
table(df$class)查看每类样本数,合并样本量过少的类别,或补充采集该类样本。 - 检查协方差矩阵奇异性:即使样本量足够,若某类光谱波段存在完全线性相关(如两个波段值完全一致),协方差矩阵行列式为0(奇异),无法计算距离。用以下代码检查:
若输出为0,需移除冗余波段或重新采集样本。# 按类别拆分光谱数据 class_list <- split(df[, c("b1","b2","b3")], df$class) # 遍历每类计算协方差矩阵行列式 lapply(class_list, function(x) det(cov(x))) - 验证参数输入格式:以RStoolbox的
JMdist为例,正确输入方式为:library(RStoolbox) # df是包含光谱列(b1,b2,b3)和类别列(class)的数据框 jm_res <- JMdist(df, y = "class") # 或从superClass模型的统计结果直接计算 # jm_res <- JMdist(sc_model$stats) - 清理光谱数据中的缺失值:若原始光谱数据存在NA,会导致统计量计算失败。用
df_clean <- na.omit(df)移除含NA的样本后重新计算。
内容的提问来源于stack exchange,提问作者Alex DomM
相关产品推荐
相关产品推荐

