"新神经 "是MetaTrader 5平台的一个开源神经网络引擎项目。 - 页 86 1...798081828384858687888990919293...100 新评论 TheXpert 2013.05.08 18:07 #851 Serj_Che:这有什么好尴尬的? 好吧,这里有更多的证据--我没有白费口舌 :) 事实上--罗森布拉特的perseptron规则 )) yu-sha 2013.05.08 18:09 #852 准备参与其中--有现成的解决方案、经验,甚至是编码。我们需要一个封闭的主题,在那里我们可以充分讨论架构、观点和方向 Yury Reshetov 2013.05.08 21:03 #853 yu-sha: 准备参与其中--有现成的解决方案、经验,甚至是编码。 很多人已经准备了很久了。但MetaQuotes不能从言语到行动,不是吗?yu-sha:需要一个可以充分讨论架构、观点和方向的封闭主题我们还能有多少讨论呢?仅仅是这个主题就有86页。事实上,这个线程中的所有灌水者都将转移到一个私人分支,当然,论坛的其他访问者会更好,因为阅读几十页的灌水就不必了。在现实中,一切都要容易得多,因为谁需要,谁知道怎么做,早就设计好了一个网格。我们其他人在这个论坛上阅读了86页的洪水。问题是,本论坛的一些访问者也有一些关于这个问题的经验和知识。例如,我有一个 用Java自制的OOP项目。我没有为mql5重建它,因为没有必要。 我用自己的学习算法为自己做的。主要的优点是,你事先不知道一个隐藏层中需要多少个神经元。网格可以从隐藏层中移除额外的神经元,并分别从输出神经元中移除额外的加权系数。这就是人工神经元的样子。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); } } 这就是隐藏层的样子。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; } }这就是三层网格的实现方式。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); } } fellow 2013.05.09 04:35 #854 即使网格算法已经准备好了,剩下的就是把它塑造成mqh文件。 yu-sha 2013.05.09 05:40 #855 编写网络不是问题主要问题是如何以及在何种情况下将其纳入终端 的问题。 fellow 2013.05.09 05:42 #856 让我们保持简单,否则我们会有很多失误,我建议我们只预测下一个酒吧 yu-sha 2013.05.09 08:21 #857 伙计们。 我们不要搞得太复杂,否则会有很多失误,我建议只预测下一栏的内容既然如此,请把我从))))。 fellow 2013.05.09 08:28 #858 雷舍托夫建议的代码从理论到实践都比较接近,但我还是不明白,既然随机权重可以根据经验来确定,为什么还需要随机权重? Mykola Demko 2013.05.09 08:28 #859 yu-sha: 不,好吧,如果问题是这样提出的,那么就别提我了))))。代nekst风暴neroyproekt :) 同样的错误,螃蟹和梭鱼。实践表明,开源项目 的开发必须有一个最初的实现(核心),而在开源项目中,抛光(添加各种装饰品和用户友好性)是要做的。 yu-sha 2013.05.09 10:04 #860 那些知道如何 "做 "的人已经这样做了。自然是为了他们自己。Renat2013.05.04 14:45#你想直接参与吗?我们将拿出资金和整体管理。我们将在MQL5存储 中启动普通项目,我们可以开始。有两个先决条件我们必须满足。- 资助- 共同管理还有一个重要的优势:项目的发起人是 "老 "MetaQuotes经理。因此,这项事业在开始之前就分崩离析的可能性是最小的。P.S.让它成为一个开放源码--有什么问题? 1...798081828384858687888990919293...100 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这有什么好尴尬的?
准备参与其中--有现成的解决方案、经验,甚至是编码。
我们需要一个封闭的主题,在那里我们可以充分讨论架构、观点和方向
准备参与其中--有现成的解决方案、经验,甚至是编码。
yu-sha:
需要一个可以充分讨论架构、观点和方向的封闭主题
我们还能有多少讨论呢?仅仅是这个主题就有86页。
事实上,这个线程中的所有灌水者都将转移到一个私人分支,当然,论坛的其他访问者会更好,因为阅读几十页的灌水就不必了。
在现实中,一切都要容易得多,因为谁需要,谁知道怎么做,早就设计好了一个网格。我们其他人在这个论坛上阅读了86页的洪水。
问题是,本论坛的一些访问者也有一些关于这个问题的经验和知识。
例如,我有一个 用Java自制的OOP项目。我没有为mql5重建它,因为没有必要。
我用自己的学习算法为自己做的。主要的优点是,你事先不知道一个隐藏层中需要多少个神经元。网格可以从隐藏层中移除额外的神经元,并分别从输出神经元中移除额外的加权系数。这就是人工神经元的样子。
这就是隐藏层的样子。
这就是三层网格的实现方式。
编写网络不是问题
主要问题是如何以及在何种情况下将其纳入终端 的问题。
我们不要搞得太复杂,否则会有很多失误,我建议只预测下一栏的内容
既然如此,请把我从))))。
不,好吧,如果问题是这样提出的,那么就别提我了))))。
代nekst风暴neroyproekt :) 同样的错误,螃蟹和梭鱼。
实践表明,开源项目 的开发必须有一个最初的实现(核心),而在开源项目中,抛光(添加各种装饰品和用户友好性)是要做的。
那些知道如何 "做 "的人已经这样做了。自然是为了他们自己。
你想直接参与吗?
我们将拿出资金和整体管理。我们将在MQL5存储 中启动普通项目,我们可以开始。
有两个先决条件我们必须满足。
- 资助
- 共同管理
还有一个重要的优势:项目的发起人是 "老 "MetaQuotes经理。
因此,这项事业在开始之前就分崩离析的可能性是最小的。
P.S.
让它成为一个开放源码--有什么问题?