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
*/publicclass Neuron {
/**
* Весовые коэффициенты
*/privatedouble[] weights = null;
/**
* Пороговое значение
*/privatedouble threshold = 0 d;
privateint[] 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 = newdouble[inputs];
for (int i = 0; i < inputs; i++) {
this.weights[i] = rand.nextDouble() * 2 d - 1 d;
}
}
/**
* Вычисление
* @param inputs входные значения
* @return результат на выходе нейрона
*/publicdouble getOutput(double[] inputs) {
double sum = this.threshold;
for (int i = 0; i < this.weights.length; i++) {
sum = sum + inputs[i] * this.weights[i];
}
returnthis.getSigmoidValue(sum);
}
/**
* Возвращает значения весовых коэффициентов
* @return весовые коэффициенты
*/publicdouble[] getWeights() {
returnthis.weights;
}
/**
* Возвращает пороговое значение
* @return пороговое значение
*/publicdouble getThreshold() {
returnthis.threshold;
}
/**
* Возвращает результаты
* @return результаты
*/publicint[] getResult() {
returnthis.result;
}
publicvoid changeWeights(double[] w) {
this.weights = w;
}
/**
* Обучение нейрона
* @param samples обучающая выборка. Последний элемент столбца - выходное значение
*/publicvoid 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 = newdouble[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 = newdouble[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 значение сигмоидальной функции
*/privatedouble getSigmoidValue(double x) {
return Math.atan(x);
}
/**
* Вычисляет обратное значение сигмоидальной функции
* @return обратное значение сигмоидальной функции
*/privatedouble getArcSigmoidValue(double x) {
return Math.tan(x);
}
}
So sieht eine verborgene Schicht aus:
package neuronet;
import java.util.*;
/**
* Скрытый слой
* @author Yury V. Reshetov
*/publicclass 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() {
returnthis.neurons;
}
/**
* Возвращает результаты входного слоя
* @param inputs массив входных значений
* @return массив результатов
*/publicdouble[] getOutputs(double[] inputs) {
double[] results = newdouble[this.neurons.length];
for (int i = 0; i < this.neurons.length; i++) {
results[i] = this.neurons[i].getOutput(inputs);
}
return results;
}
/**
* Получает обучающую выборку для следующего нейрона из входной обучающей выборки
* @param samples обучающая выборка
* @return обучающая выборка для следующего нейрона
*/publicdouble[][] getOutputs(double[][] samples) {
double[][] results = newdouble[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 нейрон после скрытого слоя
*/publicvoid 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 = newdouble[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
*/publicclass NN {
private Random rand = null;
private HiddenLayer hiddenlayer = null;
private Neuron tailneuron = null;
/**
* Конструктор нейронной сети
* @param inputs
*/public NN() {
}
/**
* Результат нейронной сети
* @param sample значения входов
* @return результат
*/publicdouble getOutput(double[] sample) {
double[] sample1 = this.hiddenlayer.getOutputs(sample);
returnthis.tailneuron.getOutput(sample1);
}
/**
* Обучение нейронной сети
* @param samples обучающая выборка
*/publicvoid 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);
}
}
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
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.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
Was ist daran so peinlich?
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.
Sie sind bereit, sich zu engagieren - mit fertigen Lösungen, Erfahrung und sogar Programmierkenntnissen.
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:
So sieht eine verborgene Schicht aus:
Auf diese Weise wird das dreischichtige Raster umgesetzt:
Das Schreiben eines Netzwerks ist kein Problem
Die Hauptfrage ist, wie und mit welcher Soße sie in das Terminal integriert werden soll.
Damit es nicht zu kompliziert wird, schlage ich vor, nur den nächsten Takt vorherzusagen
In diesem Sinne, streichen Sie mich von))))
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.
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?