问题描述
我想对包含湖为多边形的两个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);
};