对两个FeatureCollection执行准确性评估

问题描述

我想对包含湖为多边形的两个FeatureCollection执行二进制精度评估(ErrorMatrix)。一个集合包含分类的结果(需要将栅格转换为矢量以计算区域大小并删除较小的对象),而另一个集合则包含代表现实的验证数据。多边形代表具有土地覆盖1作为属性的湖泊。如何合并两个集合以具有执行ErrorMatrix()所需的特定列?我尝试使用此处描述的方法 https://developers.google.com/earth-engine/guides/joins_spatial 但似乎不适用于ErrorMatrix()。可能还有其他方法可以为两个FeatureCollection创建混淆矩阵吗?

解决方法

我发现了以下解决方案:我可以使用ROC分析的方法来计算正确和错误的分类区域。这是我的功能:

var validateLakes = function(classified,truth){
  //clip classified lakes to sampleareas
  classified = classified.filterBounds(sampleareas);
  
  //convert required FeatureCollections to single multipolygon Feature
  var classified_union = ee.Feature(classified.union().first());
  truth = ee.Feature(truth.union().first());
  var area = ee.Feature(sampleareas.union().first());
  
  //calculate tp,tf,fp & fn areas
  var tp = classified_union.intersection(truth);
  var tn = area.difference(classified_union.union(truth));
  var fp = classified_union.difference(truth);
  var fn = truth.difference(classified_union);
  
  /*
  //check results
  Map.addLayer(tp,{palette: 'FF0000'},'tp');
  Map.addLayer(tn,'tn');
  Map.addLayer(fp,'fp');
  Map.addLayer(fn,'fn');
  */
  
  //calculate size of areas
  var tp_area = ee.Number(tp.area());
  var tn_area = ee.Number(tn.area());
  var fp_area = ee.Number(fp.area());
  var fn_area = ee.Number(fn.area());
  
  //calculate tpr,fdr and accuracy
  //tpr = tp / (tp + fn)
  var tpr = tp_area.divide(tp_area.add(fn_area));
  //fdr = tp / (fp + tp)
  var fdr = fp_area.divide(fp_area.add(tp_area));
  //accuracy = (tp + tn) / (tp + tn + fp + fn)
  var numerator = tp_area.add(tn_area);
  var denominator = tp_area.add(tn_area.add(fp_area.add(fn_area)));
  var accuracy = numerator.divide(denominator);

  //function for adding values to classfied FeatureCollection
  var addProps = function(feature){
    feature = feature.set('TPR',tpr);
    feature = feature.set('FDR',fdr);
    feature = feature.set('ACCURACY',accuracy);
    return feature;
  };

  //return classified Collection with new properties
  return classified.map(addProps);
};

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...