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