我正在尝试使用Encog处理此数据集。为了做到这一点,我将输出组合成一个(似乎无法弄清楚如何使用多个预期输出,即使是我试图用4个输出神经元手动训练NN )和值:"disease1“、"disease2”、"none“和”二者“。
从那里开始,在CSV中使用分析师向导,自动过程用预期的输出训练一个NN。文件中的一个峰值:
"field:1","field:2","field:3","field:4","field:5","field:6","field:7","Output:field:7"
40.5,yes,yes,yes,yes,no,both,both
41.2,no,yes,yes,no,yes,second,second现在我的问题是:我如何查询它?我尝试了分类,但据我所理解,结果只给出了值{0,1,2},所以有两个类我无法区分(两者都是0)。
这个问题也适用于wiki中介绍的Iris示例。此外,Encog如何从输出神经元值推断0/1/2的结果?
编辑:我发现的解决方案是为疾病1和疾病2使用一个单独的网络,但我真的很想知道是否有可能将它们结合在一起。
发布于 2014-05-29 15:59:34
您是正确的,您将需要将输出列组合为单个值。Encog分析师将只对一个输出列进行分类。输出列可以有许多不同的值。因此,将两个输出列正常化为none,第一,第二,两者都能工作。如果你直接使用底层神经网络,你实际上可以训练两个输出,每个输出做一个独立的分类。但在这次讨论中,我将假设我们是在与分析师打交道。
您是使用工作台查询网络,还是使用代码查询网络?默认情况下,Encog分析师使用等边编码对神经网络进行编码。这导致输出神经元数等于n-1,其中n是类的数目。如果您在分析向导中选择一个n个编码,那么BasicNetwork上的常规分类方法就会工作,因为它只为n中的一个设计。
如果要使用等边查询(在代码中),则可以使用类似以下方法。我将此添加到下一个版本的Encog中。
/**
* Used to classify a neural network that has been encoded using equilateral encoding.
* This is the default for the Encog analyst. Equilateral encoding uses an output count
* equal to the number of classes minus one.
* @param input The input to the neural network.
* @param high The high value of the activation range, usually 1.
* @param low The low end of the normalization range, usually -1 or 0.
* @return The class that the input belongs to.
*/
public int classifyEquilateral(final MLData input,double high, double low) {
MLData result = this.compute(input);
Equilateral eq = new Equilateral(getOutputCount()+1,high,low);
return eq.decode(result.getData());
}https://stackoverflow.com/questions/23844676
复制相似问题