Готов включиться - готовыми решениями, опытом, и даже кодингом.
Многие давно уже готовы. Но что-то MetaQuotes никак от слов к делу перейти не может?
yu-sha:
Нужна закрытая ветка, где адекватно можно обсудить архитектуру, перспективы и направления
Сколько уже можно обсуждать? 86 страниц сплошных обсуждений только в этой ветке.
От того, что все флудерасты из этого топика переместятся в закрытую ветку, конечно же остальным посетителям форума будет легче, т.к. читать десятки страниц флуда не надо будет.
В реальности всё гораздо проще, т.к. кому надо и кто умеет тот уже давно себе сетку спроектировал. Остальные нафлудили 86 страниц на форуме.
Суть в том, что у нескольких посетителей на этом форуме есть и некоторый опыт и наработки по теме.
Например, у меня на Java есть самопальный проект OOП. Под mql5 не переделывал, т.к. не было никакой необходимости.
Для себя делал с собственным алгоритмом обучения. Основное преимущество, то что заранее неизвестно сколько нейронов в скрытом слое понадобится. Сетка может удалить лишние нейроны из скрытого слоя и соответственно лишние весовые коэффициенты из выходного нейрона.
Вот так выглядит искусственный нейрон:
package neuronet;
import java.util.*;
/**
* Искусственный нейрон
* @author Yury V. Reshetov
*/publicclass Neuron {
/**
* Весовые коэффициенты
*/privatedouble[] weights = null;
/**
* Пороговое значение
*/privatedouble threshold = 0d;
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() * 2d - 1d;
this.weights = newdouble[inputs];
for (int i = 0; i < inputs; i++) {
this.weights[i] = rand.nextDouble() * 2d - 1d;
}
}
/**
* Вычисление
* @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 = 1d / 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);
}
}
Так выглядит скрытый слой:
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;
}
}
Так реализована трехслойная сетка:
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);
}
}
Практика показывает что опенсорс проекты развиваются тогда и только тогда, когда есть начальная реализация (ядро), а в опенсорс отдаётся шлифовка (навешивание всяких рюшечек и удобств пользователя).
Чего тут позорного?
Готов включиться - готовыми решениями, опытом, и даже кодингом.
Нужна закрытая ветка, где адекватно можно обсудить архитектуру, перспективы и направления
Готов включиться - готовыми решениями, опытом, и даже кодингом.
yu-sha:
Нужна закрытая ветка, где адекватно можно обсудить архитектуру, перспективы и направления
Сколько уже можно обсуждать? 86 страниц сплошных обсуждений только в этой ветке.
От того, что все флудерасты из этого топика переместятся в закрытую ветку, конечно же остальным посетителям форума будет легче, т.к. читать десятки страниц флуда не надо будет.
В реальности всё гораздо проще, т.к. кому надо и кто умеет тот уже давно себе сетку спроектировал. Остальные нафлудили 86 страниц на форуме.
Суть в том, что у нескольких посетителей на этом форуме есть и некоторый опыт и наработки по теме.
Например, у меня на Java есть самопальный проект OOП. Под mql5 не переделывал, т.к. не было никакой необходимости.
Для себя делал с собственным алгоритмом обучения. Основное преимущество, то что заранее неизвестно сколько нейронов в скрытом слое понадобится. Сетка может удалить лишние нейроны из скрытого слоя и соответственно лишние весовые коэффициенты из выходного нейрона.Вот так выглядит искусственный нейрон:
Так выглядит скрытый слой:
Так реализована трехслойная сетка:
Написать сеть - это не проблема
Главный вопрос - как и под каким соусом интегрировать это в терминал
не будем усложнять, а то море флуда обеспечено, предлагаю предсказать всего лишь следующий бар
при такой постановке вопроса меня вычеркивайте )))
не, ну если постановка вопроса именно такая, тогда без меня )))
Поколение некст штурмует неройропроект :) ошибки теже, лебедь рак и щука.
Практика показывает что опенсорс проекты развиваются тогда и только тогда, когда есть начальная реализация (ядро), а в опенсорс отдаётся шлифовка (навешивание всяких рюшечек и удобств пользователя).
Те, кто умеет "делать", уже сделали. Для себя, естественно.
Есть желающие прямо поучаствовать?
С нас финансирование и общее управление. Заведем общий проект в MQL5 Storage и можно начинать.
Два обязательных условия выполняются:
- финансирование
- общее управление
Есть еще один немаловажный плюс: инициатор этого проекта - "старый" менеджер MetaQuotes
Т.о. шансы, что эта затея развалится, не успев начаться, минимальны
P.S.
Пусть будет опенсоурс - какие проблемы?