如何在 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);
}
所以我正在使用 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);
}