Luk*_*asz 6 c# data-structures
我试图在这个三元图上表示数据以进行查找.我希望能够将所有三个值都输入到函数中,并返回这些值属于哪个区域类别.我正在研究的方法是使用笛卡尔坐标将每个区域转换为多边形.然后将提供的值转换为一个点,并检查该点是否位于哪个多边形内.我很确定它会起作用但是对于简单的查找来说它似乎有点过分了?
我问是否有办法在数组或对象中表示此图上的数据,以便简单的查找就足够了?
您可以将上述内容转换为笛卡尔坐标系,但我认为您错过了实际执行此操作所需的重要方面。
在上图中,您将多边形视为二维结构,但您有一个三维点。毕竟,这并非不可能,我们在上面的二维平面上看到了三角形,但转换到笛卡尔空间并不完全简单。
相反,这看起来非常像决策树的图形表示。看起来粘土、淤泥和沙子的数量读数是为了形成这种表示形式的。
基本上,您有一个包含三个值的元组,并且您希望根据这些值获得分类。
在上面的例子中,您可以将分类“淤泥”的决策树建模为:
// 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)
对于最后一行(以及后续行),决策树将根据这些值设置边界,并且由于它是连续的,因此通常会根据大于或等于该值的所有值做出决策。