代表查找的三元图数据

Luk*_*asz 6 c# data-structures

土壤类型

我试图在这个三元图上表示数据以进行查找.我希望能够将所有三个值都输入到函数中,并返回这些值属于哪个区域类别.我正在研究的方法是使用笛卡尔坐标将每个区域转换为多边形.然后将提供的值转换为一个点,并检查该点是否位于哪个多边形内.我很确定它会起作用但是对于简单的查找来说它似乎有点过分了?

我问是否有办法在数组或对象中表示此图上的数据,以便简单的查找就足够了?

cas*_*One 4

可以将上述内容转换为笛卡尔坐标系,但我认为您错过了实际执行此操作所需的重要方面。

在上图中,您将多边形视为二维结构,但您有一个三维点。毕竟,这并非不可能,我们在上面的二维平面上看到了三角形,但转换到笛卡尔空间并不完全简单。

相反,这看起来非常像决策树的图形表示。看起来粘土、淤泥和沙子的数量读数是为了形成这种表示形式的。

基本上,您有一个包含三个值的元组,并且您希望根据这些值获得分类。

在上面的例子中,您可以将分类“淤泥”的决策树建模为:

// These are approximate based on above.  Each branch of the
// tree is evaluated on one value out of all the values.
if (silt >= .8)
{
    // True case.  Check sand content.
    if (sand >= .20)
    {
        // Something else, other branches.
    }
    else
    {
        // False case, can possibly be silt.
        if (clay >= .125)
        {
            // Something else, other branches.
        }
        else
        {
            // Leaf, this is a classification.
            // Can return more strongly typed classification if you want.
            return "silt";
        }            
    }

}
else
{
    // Something else, other branches.
}
Run Code Online (Sandbox Code Playgroud)

每个if/else语句代表决策树中的一个分支。在每个分支,您需要评估变量的值,该变量在分支中的该点为您提供最大的信息增益(听起来很像,您可以根据该拆分进行多少个分类?),这是基于对该变量做出决策的(或不确定性)。

树可以自动生成,或者您可以自己手动编码。虽然后者是可能的,但我强烈建议使用自动化/基于代码的方法来开发它。我强烈建议看看Accord.NET(它需要AForge.NET,两者都很棒)。首先,您应该查看这篇博客文章,其中展示了如何使用 Accord.NET 创建决策树

无论采用哪种方式,您最终都会得到一个函数,该函数采用三个值(粘土、淤泥和沙子)并返回您的分类,根据每个值遍历树。

请注意,您不一定要有一组一对一的标准(分支)来映射到每个分类(如第一个代码示例中所示)。根据上例中多边形的顶点数量,您将需要额外的分支来处理这些情况。

如果您有原始样本数据,那么您只需通过决策树构建器运行样本数据,它就会创建一棵像上面这样的决策树。

如果您没有原始样本数据,您可以使用上面的顶点创建它并对它们进行分类。例如:

silt    sand    clay    classification
----    ----    ----    --------------
   0      50     100    clay (top point)
 100       0      50    silt (right bottom point)
  50     100       0    sand (left bottom point)
  15      45      40    sandy clay OR clay cloam OR clay (depending on splits)
...
Run Code Online (Sandbox Code Playgroud)

对于最后一行(以及后续行),决策树将根据这些值设置边界,并且由于它是连续的,因此通常会根据大于或等于该值的所有值做出决策。