2015-02-13 3 views
1

Я следую учебник по этой ссылке: http://www.c-sharpcorner.com/UploadFile/rmcochran/AI_OOP_NeuralNet06192006090112AM/AI_OOP_NeuralNet.aspxРеализация нейронной сети в C#

Я новичок в нейронную сеть, и я пытаюсь изменить пример в приведенном выше руководстве, чтобы соответствовать моей проблеме. Я использую множественную регрессию, чтобы найти коэффициенты для 3 разных наборов данных, и затем я вычисляю значение rsquared для каждого набора данных. Я пытаюсь создать нейронную сеть, которая изменит значение коэффициента, чтобы получить значение rsquared как можно ближе к 100.

Вот как я устанавливаю коэффициент и нахожу rsquared значение для этого коэффициента. Все 3 коэффициенты используют те же методы:

Calculations calc = new Calculations(); 
Vector<double> lowRiskCoefficient = MultipleRegression.QR(           Matrix<double>.Build.DenseOfColumnArrays(lowRiskShortRatingList.ToArray(), lowRiskMediumRatingList.ToArray(), lowRiskLongRatingList.ToArray()),           Vector<double>.Build.Dense(lowRiskWeekReturnList.ToArray())); 
       decimal lowRiskShortCoefficient = Convert.ToDecimal(lowRiskCoefficient[0]); 
       decimal lowRiskMediumCoefficient = Convert.ToDecimal(lowRiskCoefficient[1]); 
       decimal lowRiskLongCoefficient = Convert.ToDecimal(lowRiskCoefficient[2]); 
       List<decimal> lowRiskWeekReturnDecimalList = new List<decimal>(lowRiskWeekReturnList.Count); 
       lowRiskWeekReturnList.ForEach(i => lowRiskWeekReturnDecimalList.Add(Convert.ToDecimal(i))); 
       List<decimal> lowRiskPredictedReturnList = new List<decimal>(lowRiskWeekReturnList.Count); 
       List<decimal> lowRiskResidualValueList = new List<decimal>(lowRiskWeekReturnList.Count); 
       for (int i = 0; i < lowRiskWeekReturnList.Count; i++) 
       { 
        decimal lowRiskPredictedValue = (Convert.ToDecimal(lowRiskShortRatingList.ElementAtOrDefault(i)) * lowRiskShortCoefficient) + (Convert.ToDecimal(lowRiskMediumRatingList.ElementAtOrDefault(i)) * lowRiskMediumCoefficient) + 
         (Convert.ToDecimal(lowRiskLongRatingList.ElementAtOrDefault(i)) * lowRiskLongCoefficient); 
        lowRiskPredictedReturnList.Add(lowRiskPredictedValue); 
        lowRiskResidualValueList.Add(calc.calculateResidual(lowRiskWeekReturnDecimalList.ElementAtOrDefault(i), lowRiskPredictedValue)); 
       } 
       decimal lowRiskTotalSumofSquares = calc.calculateTotalSumofSquares(lowRiskWeekReturnDecimalList, lowRiskWeekReturnDecimalList.Average()); 
       decimal lowRiskTotalSumofRegression = calc.calculateTotalSumofRegression(lowRiskPredictedReturnList, lowRiskWeekReturnDecimalList.Average()); 
       decimal lowRiskTotalSumofErrors = calc.calculateTotalSumofErrors(lowRiskResidualValueList); 
       decimal lowRiskRSquared = lowRiskTotalSumofRegression/lowRiskTotalSumofSquares; 

Это пример, который выполняет подготовку, и я в настоящее время застрял на том, как изменить этот пример, чтобы соответствовать тому, что я пытаюсь сделать.

private void button1_Click(object sender, EventArgs e) 
{ 
net = new NeuralNet(); 
double high, mid, low; 
high = .9; 
low = .1; 
mid = .5; 
// initialize with 
// 2 perception neurons 
// 2 hidden layer neurons 
// 1 output neuron 
net.Initialize(1, 2, 2, 1); 
double[][] input = new double[4][]; 
input[0] = new double[] {high, high}; 
input[1] = new double[] {low, high}; 
input[2] = new double[] {high, low}; 
input[3] = new double[] {low, low}; 
double[][] output = new double[4][]; 
output[0] = new double[] { low }; 
output[1] = new double[] { high }; 
output[2] = new double[] { high }; 
output[3] = new double[] { low }; 
double ll, lh, hl, hh; 
int count; 
count = 0; 
do 
{ 
    count++; 
    for (int i = 0; i < 100; i++) 
     net.Train(input, output); 
    net.ApplyLearning(); 
    net.PerceptionLayer[0].Output = low; 
    net.PerceptionLayer[1].Output = low; 
    net.Pulse(); 
    ll = net.OutputLayer[0].Output; 
    net.PerceptionLayer[0].Output = high; 
    net.PerceptionLayer[1].Output = low; 
    net.Pulse(); 
    hl = net.OutputLayer[0].Output; 
    net.PerceptionLayer[0].Output = low; 
    net.PerceptionLayer[1].Output = high; 
    net.Pulse(); 
    lh = net.OutputLayer[0].Output; 
    net.PerceptionLayer[0].Output = high; 
    net.PerceptionLayer[1].Output = high; 
    net.Pulse(); 
    hh = net.OutputLayer[0].Output; 
} 
while (hh > mid || lh < mid || hl < mid || ll > mid); 
MessageBox.Show((count*100).ToString() + " iterations required for training"); 
} 

Как использовать эту информацию для создания нейронной сети, чтобы найти коэффициент, который в свою очередь будет иметь rsquared значение как можно ближе к 100, как это возможно?

+1

Что вы пробовали? с какими конкретными проблемами вы столкнулись? Ваш вопрос слишком широк. –

ответ

1

Вместо того чтобы строить один, вы можете использовать рамки Neuroph встроенные в .NET с помощью Neuroph.NET здесь https://github.com/starhash/Neuroph.NET/releases/tag/v1.0-beta

Это легкое преобразование исходного Neuroph они сделали для платформы Java.

Надеюсь, это вам поможет.

Смежные вопросы