如何在encog XOR函数中提供字符串作为输入和输出?

时间:2015-11-29 17:07:52

标签: java neural-network xor encog

我需要使用XOR函数在Java中创建encog程序,该函数必须包含带有定义作为输入的字符串,但BasicMLDataSet只能接收双精度数。以下是我使用的示例代码:

/**
 * The input necessary for XOR.
 */
public static double XOR_INPUT[][] = { { 0.0, 0.0 }, { 1.0, 0.0 },
        { 0.0, 1.0 }, { 1.0, 1.0 } };

/**
 * The ideal data necessary for XOR.
 */
public static double XOR_IDEAL[][] = { { 0.0 }, { 1.0 }, { 1.0 }, { 0.0 } };

这是接收XOR_INPUT和XOR_IDEAL的类:

MLDataSet trainingSet = new BasicMLDataSet(XOR_INPUT, XOR_IDEAL);

代码来自encog xor example

有没有什么方法可以用字符串来完成训练或以某种方式解析它们然后在将它们写入控制台之前将它们返回到字符串?

2 个答案:

答案 0 :(得分:1)

我找到了解决这个问题的方法。因为我只能提供介于0和1之间的双精度值作为输入,因为我还没有找到任何可以自然地将字符串规范化为双精度值的函数,而我已经创建了自己的函数。我从单词中的每个字母中获取ascii值,然后我只需将90 / asciiValue除以0到1之间的值。请记住,这仅适用于小写字母。功能可以轻松升级,也可以支持大写字母。这是功能:

    //Converts every letter in string to ascii and normalizes it (90/asciiValue)    
     public static double[] toAscii(String s, int najveci) {
            double[] ascii = new double[najveci];
            try {
                    byte[] bytes = s.getBytes("US-ASCII");
                    for (int i = 0; i < bytes.length; i++) {
                            ascii[i] = 90.0 / bytes[i];
                    }

            } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
            }
            return ascii;
    }

对于单词理想输出,我使用类似的解决方案。我也在对单词中的每个字母进行规范化,然后我对这些值进行平均。之后,我会对这些值进行非规范化以获取字符串并检查模型训练优势。

您可以查看full code here.

答案 1 :(得分:1)

您可以使用Encog的EncogAnalyst和AnalystWizard来规范化您的数据。 @JeffHeaton(Encog的作者)的这个posting显示了一个使用.csv文件的例子

这些类可以标准化数字和“名义”数据(例如您想要使用的字符串。)您可能希望对这些字符串使用“等边”规范化,因为这将避免神经网络的一些训练问题。

您可能还想查看此tutorial on Encog on PluralSight,其中有关于规范化的整个部分。

以下是Encog文档中的一个示例,该文档显示了如何使用代码(没有.csv文件)规范化字段:

  

var fuelStats = new NormalizedField(NormalizationAction.Normalize,“fuel”,200,0,-0.9,0.9);

     

28获取Encog数据   对于上面的例子,范围归一化为-0.9到0.9。这非常类似于-1和1之间的标准化,但不太极端。这有时可以产生更好的结果。众所周知,燃料的可接受范围在0到200之间。现在已经创建了现场对象,很容易将值标准化。这里,值100被归一化为变量n。 double n = fuelStats .Normalize(100);要将n非规范化为原始燃料值,请使用以下代码:

     

double f = fuelStats .Denormalize(n);