我有一张表格,其中包含一个地区几天内天气和森林火灾数量的信息:
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太长 在org.opencv.ml.StatModel.train_0(本机方法) 在org.opencv.ml.StatModel.train(StatModel.java:95) 在com.selw.Main.main(Main.java:35) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at 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)
答案 0 :(得分:0)
Mat数据对象包含树将在其上训练的样本数据。一行对应于一个样本。您拥有的样本越多,您的树训练得越好。 Mat数据对象中可以具有任意数量的列。每列对应一个不同的示例特征。
Mat响应对象包含树旨在预测的值。这是一列矩阵,其行数与Mat数据对象相同。 Mat响应对象中的每个行号都与Mat数据对象中具有相同行号的样本相对应。
对于您根据区域的温度,湿度和风向预测森林火灾的示例...该区域的每个度量都需要转换为浮点值。每个区域在Mat数据对象中将有一行,而在Data Response对象中将有一行。 Mat数据行将填充以浮点值表示的区域测量值。垫响应行将是森林火灾的数量(或者正如尼古拉斯在您的评论中指出的那样,最好将森林火灾的数量放入索引的直方图中)。
可以通过更改以下设置来修复代码中的当前错误:
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
更改这些代码后,我能够毫无错误地进行编译和运行。