"New Neural" ist ein Open-Source-Projekt für neuronale Netzwerke für die MetaTrader 5-Plattform. - Seite 86

 
Serj_Che:

Was ist daran so peinlich?

Nun, hier ist ein weiterer Beweis - ich habe nicht umsonst gespuckt :) und in der Tat - Rosenblatt's perseptron rules ))
 

Sie sind bereit, sich zu engagieren - mit fertigen Lösungen, Erfahrung und sogar Programmierkenntnissen.

Wir brauchen einen geschlossenen Thread, in dem wir Architektur, Perspektiven und Richtungen in angemessener Weise diskutieren können.

 
yu-sha:

Sie sind bereit, sich zu engagieren - mit fertigen Lösungen, Erfahrung und sogar Programmierkenntnissen.

Viele Menschen sind schon seit langem bereit. Aber MetaQuotes kann nicht von Worten zu Taten übergehen, nicht wahr?

yu-sha:

Wir brauchen einen geschlossenen Thread, in dem man Architektur, Perspektiven und Richtungen angemessen diskutieren kann.

Wie viele Diskussionen können wir noch führen? 86 Seiten allein in diesem Thread.

Die Tatsache, dass alle Flooders in diesem Thread wird zu einem privaten Zweig zu bewegen, natürlich, der Rest des Forums Besucher wird besser sein, weil lesen Dutzende von Seiten der Überschwemmungen wird nicht zu müssen.

In Wirklichkeit ist alles viel einfacher, denn wer es braucht und weiß, wie es geht, hat längst ein Netz entworfen. Der Rest von uns liest 86 Seiten Hochwasser in diesem Forum.

Der Punkt ist, dass einige Besucher dieses Forums auch einige Erfahrungen und Kenntnisse zu diesem Thema haben.

Ich habe zum Beispiel ein selbst entwickeltes OOP-Projekt in Java. Ich habe es nicht für mql5 umgebaut, weil es nicht nötig war.

Ich habe ihn für mich selbst mit meinem eigenen Lernalgorithmus erstellt. Der Hauptvorteil ist, dass man nicht im Voraus weiß, wie viele Neuronen in einer versteckten Schicht benötigt werden. Das Gitter kann zusätzliche Neuronen aus der versteckten Schicht bzw. zusätzliche Gewichtungskoeffizienten aus dem Ausgangsneuron entfernen.

So sieht ein künstliches Neuron aus:

package neuronet;
import java.util.*;

/**
 * Искусственный нейрон
 * @author Yury V. Reshetov
 */
public class Neuron {
    /**
     * Весовые коэффициенты
     */
    private double[] weights = null;
    
    /**
     * Пороговое значение
     */
    private double threshold = 0 d;
    
    private int[] result = null; 
    
    /**
     * Конструктор нейрона
     * @param w весовые коэффициенты
     * @param t пороговое значение
     */
    public Neuron(double[] w, double t) {
        this.weights = w;
        this.threshold = t;
    }
    
    /**
     * Конструктор случайного нейрона
     * @param inputs количество весовых коэффициентов
     * @param rand генератор псевдослучайных чисел
     */
    public Neuron(int inputs, Random rand) {
        this.threshold = rand.nextDouble() * 2 d - 1 d;
        this.weights = new double[inputs];
        for (int i = 0; i < inputs; i++) {
            this.weights[i] = rand.nextDouble() * 2 d - 1 d;
        }
    }

    /**
     * Вычисление
     * @param inputs входные значения
     * @return результат на выходе нейрона
     */
    public double getOutput(double[] inputs) {
        double sum = this.threshold;
        for (int i = 0; i < this.weights.length; i++) {
            sum = sum + inputs[i] * this.weights[i];
        }
        return this.getSigmoidValue(sum);
    }
    
    /**
     * Возвращает значения весовых коэффициентов
     * @return весовые коэффициенты
     */
    public double[] getWeights() {
        return this.weights;
    }
    
    /**
     * Возвращает пороговое значение
     * @return пороговое значение
     */
    public double getThreshold() {
        return this.threshold;
    }
    
    /**
     * Возвращает результаты
     * @return результаты
     */
    public int[] getResult() {
        return this.result;
    }
    
    public void changeWeights(double[] w) {
        this.weights = w;
    }
    
    
    /**
     * Обучение нейрона
     * @param samples обучающая выборка. Последний элемент столбца - выходное значение
     */
    public void learning(double[][] samples) {
        // Заменяем выходное значение на обратную функцию сигмоида из этого значения
        for (int i = 0; i < samples.length; i++) {
            samples[i][samples[0].length - 1] = this.getArcSigmoidValue(samples[i][samples[0].length - 1]);
        }
        
        double[][] tempsamples = new double[samples.length][samples[0].length * 2];

        int count = samples[0].length;

        for (int i = 0; i < tempsamples.length; i++) {
            for (int j = 0; j < count; j++) {
                tempsamples[i][j] = samples[i][j]; 
                tempsamples[i][j + count] = - tempsamples[i][j];
            }
        }
        
        // Создаем объект оптимизатора
        Optimizator opt = new Optimizator(new Random());
        
        // Получаем результаты
        this.result = opt.getDataForColls(tempsamples, tempsamples[0].length);
        
        // Переводим результаты в вещественный формат
        double[] res = new double[this.result.length];
        
        for (int i = 0; i < res.length; i++) {
            res[i] = this.result[i];
        }

        
        // Получаем значения количества использований оптимизатором для примеров
        int[] getP = opt.getP();
        // Максимальное значение количества использований
        int maximum = getP[0];
        // Индекс примера с максимальным количеством использований
        int maxindex = 0;
        // Ищем индекс примера с максимальным количеством использований
        for (int i = 1; i < getP.length; i++) {
            if (getP[i] > maximum) {
                maximum = getP[i];
                maxindex = i;
            }
        }
    
    
       // Максимальное значение весового коэффициента
        double maxi = Math.abs(res[0]);
    
        // Ищем максимальное значение весового коэффициента
        for (int i = 1; i < res.length; i++) {
            if (Math.abs(res[i]) > maxi) {
                maxi = Math.abs(res[i]);
            }
        }
        
        // Стабильное абсолютное значение константы 
        double bestsum = 0;
        // Вычисляем стабильное значение константы 
        for (int j = 0; j < samples[0].length; j++) {
            bestsum = bestsum + res[j] * samples[maxindex][j];
        }
        // Получаем стабильное абсолютное значение константы 
        bestsum = Math.abs(bestsum);
    
        // Корректируем результаты на стабильное абсолютное значение константы
        for (int i = 0; i < res.length; i++) {
            res[i] = res[i] / bestsum;
        }
        
        // Вычисляем пороговое значение
        this.threshold = 1 d / res[res.length - 1];
        
        // Вычисляем весовые коэффициенты
        for (int i = 0; i < this.weights.length; i++) {
            this.weights[i] = -res[i] / res[res.length - 1];
        }
        
    }
    
    /**
     * Вычисляет значение сигмоидальной функции
     * @return значение сигмоидальной функции
     */
    private double getSigmoidValue(double x) {
        return Math.atan(x);
    }
    
    /**
     * Вычисляет обратное значение сигмоидальной функции
     * @return обратное значение сигмоидальной функции
     */
    private double getArcSigmoidValue(double x) {
        return Math.tan(x);
    }
}

So sieht eine verborgene Schicht aus:

package neuronet;

import java.util.*;

/**
 * Скрытый слой 
 * @author Yury V. Reshetov
 */
public class HiddenLayer {
    
    // Массив нейронов скрытого слоя
    private Neuron[] neurons = null;
    
    /**
     * Создание скрытого слоя нейронов
     * @param neuronscount количество нейронов в скрытом слое
     * @param inputscount количество входов у нейронов
     * @param rand генератор склучайных чисел
     */
    public HiddenLayer(int inputscount, Random rand) {
        this.neurons = new Neuron[inputscount * 5];
        System.out.println("Количество нейронов скрытого слоя = " + this.neurons.length);
        for (int i = 0; i < this.neurons.length; i++) {
            this.neurons[i] = new Neuron(inputscount, rand);
        }
    }
    
    /**
     * Возвращает массив нейронов
     * @return массив нейронов скрытого слоя
     */
    public Neuron[] getNeurons() {
        return this.neurons;
    }
    
    /**
     * Возвращает результаты входного слоя
     * @param inputs массив входных значений
     * @return массив результатов
     */
    public double[] getOutputs(double[] inputs) {
        double[] results = new double[this.neurons.length];
        for (int i = 0; i < this.neurons.length; i++) {
            results[i] = this.neurons[i].getOutput(inputs);
        }
        return results;
    }
    
    /**
     * Получает обучающую выборку для следующего нейрона из входной обучающей выборки
     * @param samples обучающая выборка
     * @return обучающая выборка для следующего нейрона
     */
    public double[][] getOutputs(double[][] samples) {
        double[][] results = new double[samples.length][this.neurons.length + 1];
        for (int i = 0; i < samples.length; i++) {
            for (int j = 0; j < this.neurons.length; j++) {
                results[i][j] = this.neurons[j].getOutput(samples[i]);
            }
            results[i][this.neurons.length] = samples[i][samples[0].length - 1];
        }
        return results;
    }
    
    /**
     * Изменение архитектуры скрытого слоя.
     * Удаляет лишние нейроны из скрытого слоя и лишние весовые 
     * коэффициенты из следующего за данным слоем нейрона.
     * @param nextneuron нейрон после скрытого слоя
     */
    public void reorganization(Neuron nextneuron) {
        int counter = 0;
        int[] result = nextneuron.getResult();
        for (int i = 0; i < result.length - 1; i++) {
            if (result[i] != 0) {
                counter++;
            }
        }
        Neuron[] temp = new Neuron[counter];
        double[] weights = new double[counter];
        counter = 0;
        for (int i = 0; i < result.length - 1; i++) {
            if (result[i] != 0) {
                weights[counter] = nextneuron.getWeights()[i];
                temp[counter] = this.neurons[i];
                counter++;
            }
        }
        nextneuron.changeWeights(weights);
        this.neurons = temp;
    }
    
}

Auf diese Weise wird das dreischichtige Raster umgesetzt:

package neuronet;

import java.util.*;

/**
 * Трехслойная нейронная сеть с одним выходом
 * @author Yury V. Reshetov
 */
public class NN {
    
    private Random rand = null;
    private HiddenLayer hiddenlayer = null;
    private Neuron tailneuron = null;
    
    /**
     * Конструктор нейронной сети
     * @param inputs
     */
    public NN() {
    }
    
    /**
     * Результат нейронной сети
     * @param sample значения входов
     * @return результат
     */
    public double getOutput(double[] sample) {
        double[] sample1 = this.hiddenlayer.getOutputs(sample);
        return this.tailneuron.getOutput(sample1);
    }
    
    /**
     * Обучение нейронной сети
     * @param samples обучающая выборка
     */
    public void learning(double[][] samples) {
        this.rand = new Random();
        this.hiddenlayer = new HiddenLayer(samples[0].length - 1, this.rand);
        double[][] samples1 = this.hiddenlayer.getOutputs(samples);
        this.tailneuron = new Neuron(samples1[0].length - 1, this.rand);
        this.tailneuron.learning(samples1);
        this.hiddenlayer.reorganization(tailneuron);
    }
    
}
 
selbst der Gitteralgorithmus ist fertig, er muss nur noch in mqh-Dateien umgewandelt werden
 

Das Schreiben eines Netzwerks ist kein Problem

Die Hauptfrage ist, wie und mit welcher Soße sie in das Terminal integriert werden soll.

 
Halten wir es einfach, sonst gibt es eine Menge Patzer. Ich schlage vor, wir sagen einfach den nächsten Takt voraus
 
Kollege:
Damit es nicht zu kompliziert wird, schlage ich vor, nur den nächsten Takt vorherzusagen

In diesem Sinne, streichen Sie mich von))))

 
Der Code, den Reshetov vorgeschlagen hat, ist von der Theorie her näher an der Praxis, aber ich verstehe immer noch nicht, warum zufällige Gewichte benötigt werden, wenn sie empirisch bestimmt werden können
 
yu-sha:

Nein, wenn die Frage so gestellt wird, dann erwähnen Sie mich nicht))))

Generation nekst stürmt neroyproekt :) die gleichen Fehler, die Krabbe und der Hecht.

Die Praxis zeigt, dass Open-Source-Projekte dann und nur dann entwickelt werden, wenn es eine erste Implementierung (Kern) gibt und bei Open Source der Feinschliff (Hinzufügen von allerlei Schnickschnack und Benutzerfreundlichkeit) vorgenommen wird.

 

Diejenigen, die wissen, wie es geht, haben es bereits getan -für sich selbst, versteht sich.

Renat2013.05.04 14:45

Möchten Sie sich direkt beteiligen?

Wir werden die Finanzierung und das gesamte Management übernehmen. Wir werden das gemeinsame Projekt inMQL5 Storage starten und können beginnen.

Es gibt zwei Voraussetzungen, die wir erfüllen müssen:

- Förderung

- gemeinsame Verwaltung

Es gibt einen weiteren wichtigen Vorteil: Der Initiator des Projekts ist der "alte" MetaQuotes-Manager.

Die Wahrscheinlichkeit, dass dieses Projekt scheitert, bevor es überhaupt begonnen hat, ist also minimal.

P.S.

Wo ist das Problem, wenn es ein Open Source ist?

Grund der Beschwerde: