Java Encog神经网络:规范化

Java Encog神经网络:规范化,java,csv,neural-network,normalization,encog,Java,Csv,Neural Network,Normalization,Encog,在Encog 3.x中,如何规范化数据,使用数据进行训练,以及反规范化结果 在这方面没有好的文档,一个简单的例子可以应用其中的每一个,这将大大缩短Encog的学习曲线。我还没有完全弄清楚,但这里有一些资源 (1)** 此代码用于保存新的标准化csv。这里不清楚如何获取AnalystNormalizeCSV并将其转换为MLDataSet以实际使用它 EncogAnalyst analyst = new EncogAnalyst(); AnalystWizard wizard = new Analy

在Encog 3.x中,如何规范化数据,使用数据进行训练,以及反规范化结果

在这方面没有好的文档,一个简单的例子可以应用其中的每一个,这将大大缩短Encog的学习曲线。我还没有完全弄清楚,但这里有一些资源

(1)**

此代码用于保存新的标准化csv。这里不清楚如何获取AnalystNormalizeCSV并将其转换为MLDataSet以实际使用它

EncogAnalyst analyst = new EncogAnalyst();
AnalystWizard wizard = new AnalystWizard(analyst);
wizard.wizard(sourceFile, true, AnalystFileFormat.DECPNT_COMMA);
final AnalystNormalizeCSV norm = new AnalystNormalizeCSV();
norm.analyze(sourceFile, true, CSVFormat.ENGLISH, analyst);
norm.setOutputFormat(CSVFormat.ENGLISH);
norm.setProduceOutputHeaders(true);
norm.normalize(targetFile)
(2)**

这段代码同样适用于生成规范化的csv输出。但目前尚不清楚如何获取规范化数据并实际应用。有一种方法可以将目标设置为MLData,但它假设所有列都是输入,没有为任何理想留出空间。此外,当文件具有标题和/或未使用的列时,这两个选项都很难使用

try {
            File rawFile = new File(MYDIR, "iris.csv");

            // download Iris data from UCI
            if (rawFile.exists()) {
                System.out.println("Data already downloaded to: " + rawFile.getPath());
            } else {
                System.out.println("Downloading iris data to: " + rawFile.getPath());
                BotUtil.downloadPage(new URL("http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"), rawFile);
            }

            // define the format of the iris data

            DataNormalization norm = new DataNormalization();
            InputField inputSepalLength, inputSepalWidth, inputPetalLength, inputPetalWidth;
            InputFieldCSVText inputClass;

            norm.addInputField(inputSepalLength = new InputFieldCSV(true, rawFile, 0));
            norm.addInputField(inputSepalWidth = new InputFieldCSV(true, rawFile, 1));
            norm.addInputField(inputPetalLength = new InputFieldCSV(true, rawFile, 2));
            norm.addInputField(inputPetalWidth = new InputFieldCSV(true, rawFile, 3));
            norm.addInputField(inputClass = new InputFieldCSVText(true, rawFile, 4));
            inputClass.addMapping("Iris-setosa");
            inputClass.addMapping("Iris-versicolor");
            inputClass.addMapping("Iris-virginica");

            // define how we should normalize

            norm.addOutputField(new OutputFieldRangeMapped(inputSepalLength, 0, 1));
            norm.addOutputField(new OutputFieldRangeMapped(inputSepalWidth, 0, 1));
            norm.addOutputField(new OutputFieldRangeMapped(inputPetalLength, 0, 1));
            norm.addOutputField(new OutputFieldRangeMapped(inputPetalWidth, 0, 1));
            norm.addOutputField(new OutputOneOf(inputClass, 1, 0));

            // define where the output should go
            File outputFile = new File(MYDIR, "iris_normalized.csv");
            norm.setCSVFormat(CSVFormat.ENGLISH);
            norm.setTarget(new NormalizationStorageCSV(CSVFormat.ENGLISH, outputFile));

            // process
            norm.setReport(new ConsoleStatusReportable());
            norm.process();
            System.out.println("Output written to: " + rawFile.getPath());

        } catch (Exception ex) {
            ex.printStackTrace();
        }
(3)*非规范化*


我完全不知道如何利用所有这些,并根据适当的数据类型的最大值和最小值进行反规范化。

这里没有多少资源,您可以从中获得有关使用Encode框架进行规范化和反规范化的更详细信息

这些伟大的电子书是杰夫·希顿自己写的, 1. 2.C#神经网络简介,杰夫·希顿第二版(2008年10月2日) 这些是ENCOG用户必须拥有的电子书

您还可以查看关于“”的pluralsight课程,其中还包括一些规范化和非规范化的示例

关于您的查询:“这里不清楚如何使用AnalystNormalizeCSV并将其转换为MLDataSet以实际使用它。”

您可以使用AnalystNormalizeCSV来规范化您的培训文件。然后你可以使用 LoadCSV2Memory的EncogUtility类加载规范化的训练文件以获取ML数据集。下面是C#中的示例代码

var trainingSet=EncogUtility.LoadCSV2Memory(Config.NormalizedTrainingFile.ToString(),
network.InputCount,network.OutputCount,true,CSVFormat.English,false)

它将规范化的训练文件作为第一个参数,网络输入神经元计数作为第二个参数,网络输出神经元计数作为第三个参数,第四个参数是布尔值。如果csv文件中有标题,则可以将格式作为第五个参数,第六个参数表示重要性

因此,一旦内存中有了此数据集,就可以将其用于培训。在交叉验证和评估步骤中也可以采用类似的方法

关于反规范化,您可以首先持久化分析文件,然后还可以使用分析文件来反规范化各个列。 例如:

var denormlizedOutput=analyst.Script.Normalize.NormalizedFields[index].DeNormalize(item.Input[index])

类似的方法也可用于对字段进行非规范化以获得类标签。比如说


var predictedClass=analyst.Script.Normalize.NormalizedFields[index].Classes[predictedClassInt].Name

encog分析师非常适合规范化数据。它可以获取存储在CSV文件中的信息,并自动确定规范化字段及其编码类型(包括1个N等边编码)

唯一的缺点是逻辑与ReadCSV类紧密耦合

倾向于扩展而不是修改我决定着手创建扩展方法和替代类,以创建一个规范化通用.NET数据集的分析师

我还添加了一个新的测试类,它向您展示了如何使用它(它与标准encog实现非常相似)

使用系统;
使用Microsoft.VisualStudio.TestTools.UnitTesting;
使用System.Collections.Generic;
使用Encog.ML.Data.Market;
使用Encog.ML.Data.Market.Loader;
使用Encog.App.Analyst;
使用Encog.App.Analyst.Wizard;

使用EncogExtensions.Normalization//注意:我已经开发了一个单独的类来完成所有的规范化/非规范化,但仍然。。。有没有一种方法可以使用Encod?Abhishek,我学习了你的Pluralsight课程,从你那里学到了Encod和机器学习。查看下面提到的我的扩展库。。。你可能会发现它很有用。
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
using Encog.ML.Data.Market;
using Encog.ML.Data.Market.Loader;
using Encog.App.Analyst;
using Encog.App.Analyst.Wizard;
using EncogExtensions.Normalization; //<- This is my extension lib
using System.Data;
using System.Linq;     
[TestMethod]
    public void Normalize_Some_In_Memory_Data()
    {
        // Download some stock data
        List<LoadedMarketData> MarketData = new List<LoadedMarketData>();
        MarketData.AddRange(DownloadStockData("MSFT",TimeSpan.FromDays(10)));
        MarketData.AddRange(DownloadStockData("AAPL", TimeSpan.FromDays(10)));
        MarketData.AddRange(DownloadStockData("YHOO", TimeSpan.FromDays(10)));

        // Convert stock data to dataset using encog-extensions
        DataSet dataSet = new DataSet().Convert(MarketData, "Market DataSet");

        // use encog-extensions to normalize the dataset 
        var analyst = new EncogAnalyst();
        var wizard = new AnalystWizard(analyst);
        wizard.Wizard(dataSet);

        // DataSet Goes In... 2D Double Array Comes Out... 
        var normalizer = new AnalystNormalizeDataSet(analyst);
        var normalizedData = normalizer.Normalize(dataSet);

        // Assert data is not null and differs from original
        Assert.IsNotNull(normalizedData);
        Assert.AreNotEqual(normalizedData[0, 0], dataSet.Tables[0].Rows[0][0]);

    }

    private static List<LoadedMarketData> DownloadStockData(string stockTickerSymbol,TimeSpan timeSpan)
    {
        IList<MarketDataType> dataNeeded = new List<MarketDataType>();
        dataNeeded.Add(MarketDataType.AdjustedClose);
        dataNeeded.Add(MarketDataType.Close);
        dataNeeded.Add(MarketDataType.Open);
        dataNeeded.Add(MarketDataType.High);
        dataNeeded.Add(MarketDataType.Low);
        dataNeeded.Add(MarketDataType.Volume);

        List<LoadedMarketData> MarketData =
            new YahooFinanceLoader().Load(
                new TickerSymbol(stockTickerSymbol),
                dataNeeded,
                DateTime.Now.Subtract(timeSpan),
                DateTime.Now).ToList();

        return MarketData;
    }