"New Neural", MetaTrader 5 platformu için bir sinir ağı motorunun Açık Kaynak projesidir. - sayfa 86

 
Serj Che :

Burada ayıp olan ne?

Eh, daha fazla kanıt - tükürmesi boşuna değildi :) ve genel olarak - Rosenblatt'ın algı kuralları))
 

Katılmaya hazır - hazır çözümler, deneyim ve hatta kodlama.

Mimariyi, perspektifleri ve yönleri yeterince tartışabileceğimiz kapalı bir konuya ihtiyacımız var.

 
yu-sha :

Katılmaya hazır - hazır çözümler, deneyim ve hatta kodlama.

Birçoğu zaten hazırlandı. Ama MetaQuotes'un kelimelerden eylemlere geçemeyeceği bir şey mi?

yu-sha :

Mimariyi, perspektifleri ve yönleri yeterince tartışabileceğimiz kapalı bir konuya ihtiyacımız var.

Ne kadar tartışılabilir? 86 sayfa sürekli tartışma sadece bu başlıkta.

Bu konudaki tüm fluders kapalı bir konuya taşınacağı gerçeğinden, elbette, diğer forum ziyaretçileri için daha kolay olacaktır, çünkü. Onlarca sel sayfası okumak zorunda kalmayacaksınız.

Gerçekte, her şey çok daha basittir çünkü. kimin ihtiyacı var ve kim bilir uzun süredir kendisine bir ızgara tasarlıyor. Geri kalanlar forumda 86 sayfayı sular altında bıraktı.

Sonuç olarak, bu forumu ziyaret eden birkaç ziyaretçinin konuyla ilgili biraz deneyimi ve deneyimi var.

Örneğin, Java'da kendi yaptığım bir OOP projem var. mql5 altında yeniden yapılmadı, çünkü gerek yoktu.

Kendi öğrenme algoritmamla kendim için yaptım. Ana avantajı, gizli katmanda kaç nörona ihtiyaç duyulacağının önceden bilinmemesidir. Izgara, gizli katmandan ekstra nöronları ve buna bağlı olarak çıkış nöronundan ekstra ağırlıkları kaldırabilir.

Yapay bir nöron şöyle görünür:

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);
    }
}

Gizli katman şöyle görünür:

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;
    }
    
}

Üç katmanlı ızgara şu şekilde uygulanır:

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);
    }
    
}
 
ızgara algoritması zaten hazır olsa bile, onu mqh dosyalarına dönüştürmek için kalır
 

Ağ yazmak sorun değil

Asıl soru, bunu terminale nasıl ve hangi sosun altında entegre edeceğimizdir.  

 
karmaşıklaştırmayalım, aksi takdirde sel denizi sağlanır, sadece bir sonraki çubuğu tahmin etmeyi öneriyorum
 
dostum :
karmaşıklaştırmayalım, aksi takdirde sel denizi sağlanır, sadece bir sonraki çubuğu tahmin etmeyi öneriyorum

Bu soruyu sorarsam beni kırarsın ;)  

 
Reshetov'un önerdiği kod zaten teoriden pratiğe daha yakın, ancak ampirik olarak belirlenebiliyorlarsa neden rastgele ağırlıkların olduğunu hala anlamıyorum
 
yu-sha :

hayır, peki, sorunun formülasyonu tam olarak buysa, o zaman bensiz)))  

Gelecek nesil, nero-projeye hücum ediyor :) aynı hatalar, kanser kuğu ve turna.

Uygulama, açık kaynak projelerinin yalnızca bir ilk uygulama (çekirdek) olduğunda ve açık kaynağa (her türlü küçük şeyi ve kullanıcı kolaylıklarını asarak) cilalama verildiğinde geliştiğini göstermektedir.

 

Nasıl "yapılacağını" bilenler zaten yapmıştır. Kendim için tabii.

Renat 2013.05.04 14:45

Katılmak isteyen var mı?

Bizimle finansman ve genel yönetim. MQL5 Storage'da ortak bir projeye başlayalım ve başlayabilirsiniz.

İki gerekli koşul karşılanır:

- finansman

- Genel Müdürlük

Başka bir önemli artı daha var: Bu projenin başlatıcısı MetaQuotes'un "eski" yöneticisidir.

O. Bu fikrin başlamadan dağılma ihtimali çok az

not

Açık kaynak olsun - problemler nelerdir?

Neden: