如何在 Encog 中规范化非 CSV 数据

How do I normalize Non-CSV data in Encog

所以我正在使用 Jeff Heaton 的神经网络库。

在尝试解决 Iris 植物分类问题时,我遇到了数据规范化问题。

我可以使用以下方法规范化 CSV 文件:

public void NormalizeFile(FileInfo SourceDataFile, FileInfo NormalizedDataFile, FileInfo NormalizationConfigFile)
    {

        var wizard = new AnalystWizard(_analyst);
        wizard.Wizard(SourceDataFile, _useHeaders, AnalystFileFormat.DecpntComma);
        var norm = new AnalystNormalizeCSV();
        norm.Analyze(SourceDataFile, _useHeaders, CSVFormat.English, _analyst);
        norm.ProduceOutputHeaders = _useHeaders;
        norm.Normalize(NormalizedDataFile);

        // save normalization configuration, which can be used later to denormalize to get the raw output.
        _analyst.Save(NormalizationConfigFile);

    }

到目前为止一切顺利...该程序运行准确度高。

当我想将值输入我的控制台应用程序时出现问题。

我有一些输入数据

这些值中的每一个都有不同的 high/low 我想规范化这些值,这样我就可以将它们输入我的网络而无需将 CSV 文件写入磁盘。

根据这个 link 你可以像这样使用 Encog.Util.Arrayutil.NormalizeArray 轻松做到这一点 :

我假设您的数据存储在 double[]

Encog.Util.Arrayutil.NormalizeArray normalizer = new Encog.Util.Arrayutil.NormalizeArray();
var normalizedData = normalizer.Process(dataMatrix, 0, 1);//(yourdata, low, high)

后来我意识到我真正需要的是一个分析器,它可以自动归一化定性(名义)和定量数据的混合(就像 CSV 实现一样)。

问题在于现有代码与 CSV 文件紧密耦合。为了解决这个问题,我编写了自己的 encog 扩展方法库。

可以在这里找到:https://github.com/KiransHub/encog-dotnet-core

这是一个实际的例子:

    public void NormalizeDataExample()
    {
        List<LoadedMarketData> AppleMarketData = GetMarketData("AAPL");
        List<LoadedMarketData> MicrosoftMarketData = GetMarketData("MSFT");
        List<LoadedMarketData> YahootMarketData = GetMarketData("YHOO");

        List<LoadedMarketData> MarketData = new List<LoadedMarketData>();
        MarketData.AddRange(AppleMarketData);
        MarketData.AddRange(MicrosoftMarketData);
        MarketData.AddRange(YahootMarketData);

        DataSet dataSet = new DataSet().Convert(MarketData, "Market DataSet");
        var analyst = new EncogAnalyst();
        var wizard = new AnalystWizard(analyst);
        wizard.Wizard(dataSet);

        var normalizer = new AnalystNormalizeDataSet(analyst);
        var normalizedData = normalizer.Normalize(dataSet);


    }