【问题标题】:Decision trees in OpenCVOpenCV 中的决策树
【发布时间】:2016-01-02 02:57:57
【问题描述】:

我有一张表格,其中包含有关某个地区几天内的天气和森林火灾数量的信息:

 Temperature | Humidity | Wind | ... | Number of forest fires

所有数据均以数字表示。

有必要使用这些数据构建决策树,并使用它和输入参数(温度、湿度、风速等)来预测森林火灾的数量。

为了在 OpenCV 中使用决策树,有一个类 CvDTree。在这个类中构造决策树有train的方法:

boolean train (Mat trainData, int tflag, Mat responses)

如何在Mat trainData 中转换我的输入(温度、湿度、风、...、森林火灾次数)?

添加:

编译这段代码时出错:

package com.selw;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.ml.DTrees;
import org.opencv.ml.Ml;

public class Main {

static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }

public static void main(String[] args) {
    Mat data = new Mat(5, 3, CvType.CV_32FC1, new Scalar(0));
    data.put(0, 0, new float[]{1.69f, 1, 0});
    data.put(1, 0, new float[]{1.76f, 0, 0});
    data.put(2, 0, new float[]{1.80f, 0, 0});
    data.put(3, 0, new float[]{1.77f, 0, 0});
    data.put(4, 0, new float[]{1.83f, 0, 1});

    Mat responses = new Mat(5, 1, CvType.CV_32SC1, new Scalar(0));
    responses.put(0, 0, new int[]{0, 1, 1, 0, 1});

    DTrees tree = DTrees.create();
    tree.train(data, Ml.ROW_SAMPLE, responses);
    }
}

错误(在tree.train(data, Ml.ROW_SAMPLE, responses); 行中):

线程“main”中的异常 java.lang.Exception: std::exception: vector too long 在 org.opencv.ml.StatModel.train_0(本机方法) 在 org.opencv.ml.StatModel.train(StatModel.java:95) 在 com.selw.Main.main(Main.java:35) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

【问题讨论】:

  • 所以,基本上,您是在问“如何在矩阵中设置值”?
  • @Miki,是的(在这种情况下)。
  • 除非你有大量的区域(或者你的数据在森林火灾数量方面跨越一个很小的范围),否则最好有某种与范围相关的映射的森林火灾。即您在训练数据中的班级可能类似于:0.(0 次火灾)、1.(1-2 次火灾)、2.(2-5 次火灾)、3.(5-10 次火灾)、4.(10 +火灾)。显然这取决于你的数据,但如果没有这个,你的分类结果可能会很差。另一方面,值得将 CvRTrees 用作替代方案。
  • 关于分类,我同意@NicholasBetsworth。您可能应该将他的考虑也扩展到其他价值观

标签: java opencv decision-tree


【解决方案1】:

Mat 数据对象包含用于训练树的样本数据。一行对应一个样本。你拥有的样本越多,你的树就会得到更好的训练。您可以在 Mat 数据对象中拥有任意数量的列。每列对应一个不同的样本特征。

Mat 响应对象包含树旨在预测的值。这是一个单列矩阵,其行数与您的 Mat 数据对象相同。 Mat 响应对象中的每个行号对应于 Mat 数据对象中具有相同行号的样本。

对于您基于区域的温度、湿度和风测量值预测森林火灾的示例...该区域的每个测量值都需要转换为浮点值。每个区域将在您的 Mat 数据对象中有一行,在您的数据响应对象中有一行。 Mat 数据行将填充以浮点值表示的区域测量值。 Mat 响应行将是森林火灾的数量(或者正如 Nicholas 在您的 cmets 中指出的那样,将森林火灾的数量放入索引直方图中可能会更好)。

可以通过更改以下设置来修复代码中的当前错误:

    tree.setCVFolds(1); // opencv has not implemented pruning with cross-validation yet
    tree.setMaxDepth(10); // there is currently a bug that will run the depth of the tree to infinity if you do not set a max

更改后我能够编译和运行而没有错误。

【讨论】:

    猜你喜欢
    • 2010-12-29
    • 2016-05-18
    • 2021-08-23
    • 2014-08-21
    • 1970-01-01
    • 2012-08-20
    • 2015-02-06
    • 2013-08-29
    • 2018-05-04
    相关资源
    最近更新 更多