Listo para participar: con soluciones ya hechas, experiencia e incluso codificación.
Mucha gente ha estado preparada durante mucho tiempo. Pero MetaQuotes no puede pasar de las palabras a los hechos, ¿verdad?
yu-sha:
Se necesita un hilo cerrado en el que se pueda discutir adecuadamente la arquitectura, las perspectivas y las direcciones
¿Cuánto más podemos discutir? 86 páginas sólo en este hilo.
El hecho de que todos los flooders en este hilo se moverá a una rama privada, por supuesto, el resto de los visitantes del foro será mejor, porque leer decenas de páginas de la inundación no tendrá que.
En realidad todo es mucho más fácil, porque quien lo necesita y quien lo sabe hacer hace tiempo que diseñó una red. Los demás leemos 86 páginas de inundaciones en este foro.
La cuestión es que algunos visitantes de este foro también tienen cierta experiencia y conocimientos sobre el tema.
Por ejemplo, tengo un proyecto OOP hecho por mí mismo en Java. No lo he reconstruido para mql5, porque no era necesario.
Lo hice por mí mismo con mi propio algoritmo de aprendizaje. La principal ventaja es que no se sabe de antemano cuántas neuronas se necesitan en una capa oculta. La red puede eliminar las neuronas adicionales de la capa oculta y, respectivamente, los coeficientes de ponderación adicionales de la neurona de salida.
Este es el aspecto de una neurona artificial:
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);
}
}
Este es el aspecto de una capa oculta:
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;
}
}
Así es como se implementa la red de tres capas:
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);
}
}
El código que sugirió Reshetov está más cerca de la teoría a la práctica, pero sigo sin entender por qué se necesitan pesos aleatorios cuando se pueden determinar empíricamente
No, bueno, si así se plantea la pregunta, entonces no me menciones))))
Generación nekst tormentas neroyproekt :) los mismos errores, el cangrejo y el lucio.
La práctica demuestra que los proyectos de código abierto se desarrollan si y sólo si hay una implementación inicial (núcleo) y en el código abierto se hace el pulido (añadiendo todo tipo de chucherías y facilidad de uso).
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
¿Qué tiene de vergonzoso?
Listo para involucrarse: con soluciones preparadas, experiencia e incluso codificación.
Necesitamos un hilo cerrado en el que podamos debatir adecuadamente sobre arquitectura, perspectivas y direcciones
Listo para participar: con soluciones ya hechas, experiencia e incluso codificación.
yu-sha:
Se necesita un hilo cerrado en el que se pueda discutir adecuadamente la arquitectura, las perspectivas y las direcciones
¿Cuánto más podemos discutir? 86 páginas sólo en este hilo.
El hecho de que todos los flooders en este hilo se moverá a una rama privada, por supuesto, el resto de los visitantes del foro será mejor, porque leer decenas de páginas de la inundación no tendrá que.
En realidad todo es mucho más fácil, porque quien lo necesita y quien lo sabe hacer hace tiempo que diseñó una red. Los demás leemos 86 páginas de inundaciones en este foro.
La cuestión es que algunos visitantes de este foro también tienen cierta experiencia y conocimientos sobre el tema.
Por ejemplo, tengo un proyecto OOP hecho por mí mismo en Java. No lo he reconstruido para mql5, porque no era necesario.
Lo hice por mí mismo con mi propio algoritmo de aprendizaje. La principal ventaja es que no se sabe de antemano cuántas neuronas se necesitan en una capa oculta. La red puede eliminar las neuronas adicionales de la capa oculta y, respectivamente, los coeficientes de ponderación adicionales de la neurona de salida.Este es el aspecto de una neurona artificial:
Este es el aspecto de una capa oculta:
Así es como se implementa la red de tres capas:
Escribir una red no es un problema
La cuestión principal es cómo y bajo qué salsa integrarlo en el terminal
No nos compliquemos demasiado o habrá mucho flub, propongo predecir sólo el siguiente compás
Dicho esto, táchame de))))
No, bueno, si así se plantea la pregunta, entonces no me menciones))))
Generación nekst tormentas neroyproekt :) los mismos errores, el cangrejo y el lucio.
La práctica demuestra que los proyectos de código abierto se desarrollan si y sólo si hay una implementación inicial (núcleo) y en el código abierto se hace el pulido (añadiendo todo tipo de chucherías y facilidad de uso).
Los que saben "hacer" ya lo han hecho.Para ellos mismos, naturalmente.
¿Quiere participar directamente?
Nosotros pondremos la financiación y la gestión general. Vamos a iniciar el proyecto común enMQL5 Storage y podemos empezar.
Hay dos requisitos previos que debemos cumplir:
- financiación
- gestión común
Hay otra ventaja importante: el iniciador del proyecto es el "antiguo" gestor de MetaQuotes.
Por lo tanto, las posibilidades de que esta empresa se desmorone antes de que haya empezado son mínimas.
P.D.
Que sea una fuente abierta: ¿cuál es el problema?