Tag: 人工智能

如何以有效的方式调整图像处理算法的参数?

在为我的问题开始实施解决方案之前,我只想确定我是否会“重新发明轮子”,如果我可以重复使用以前曾做过的工作。 所以我的问题是: 我使用OpenCV库制作了图像匹配器。 此匹配器接收一组图像文件,并尝试在数据库中查找类似的图像。 最后,它根据ROC曲线定义(真阳性,真阴性,假阳性和假阴性匹配数)返回统计结果。 由于OpenCV的库算法参数值大约为10,因此这些结果可能会有所不同。这意味着参数调整将带来更多的True Positive匹配和更少的False Positive匹配。 由于我必须调整或多或少10个参数,powershell调节器将非常缓慢。 蛮力我的意思是: While(param1 < 50){ While(param2 < 50){ While(param3 < 50){ … PerformMatching(); param3 +=2; } param2++; } pram1 +=5; } 我想要做的是随机选择参数,然后分析统计结果是否变得更好。 然后这个分析将有助于改变随机生成参数的方法,以便选择更好的参数。 所以我的问题是,如果Java中有库或者是否有任何AI算法,它将根据True Positive和False Positive值的评估返回更好的参数集? 可以感谢一些帮助,谢谢。

神经网络需要学习多少个时代? (包括测试结果)

好吧,让我先说一下,我很清楚这取决于很多因素,我正在寻找有经验的人的一些一般指导方针。 我的目标不是制作一个可以为我计算数字平方的神经网络,但我认为这是一个很好的实验,看看我是否正确实现了反向传播算法。 这看起来是个好主意吗? 无论如何,我担心我没有正确地实现学习算法(完全)。 我的测试(结果): 训练数据 :使用Java的随机数在500和0.999之间随机生成500个数字 网络拓扑 : 3层具有1个输入神经元,5个隐藏神经元,1个输出神经元 权重:全部生成为-1到1之间的随机值(java.util.Random.nextDouble()* 2 – 1;) 使用偏置节点:(numOfInputs + 1),以便输入[input.length -1] = 1 激活function :Sigmoid 学习率 :如下面的结果代码所示 没有实施任何动力等 结果: Epochs: 10,000 Learning Rate .25 0.5 = [0.24203878039631344] 0.9 = [0.7942587190918747] 0.1 = [-0.005433286011774396] Changed learning rate to 0.3 0.5 = [0.2891542106869196] 0.9 = [0.8159817287374298] 0.1 = [-0.03614377685205278] Changed […]

Scala遗传算法(GA)库中的模拟二进制交叉(SBX)交叉算子

我在一个很小的研究团队工作,用Scala创建/改编遗传算法库,用于使用Scientific Worklow System进行分布式计算,在我们的例子中,我们使用开源OpenMole软件( http://www.openmole.org/ )。 最近,我尝试理解并重新实现在JMetal Metaheuristics库( http://jmetal.sourceforge.net/ )中编写的SBX交叉运算符,以使其在我们的Scala库中的function版本中进行调整。 我写了一些代码,但是我需要我们的建议或者你对在Java库中定义的SBX的validation,因为源代码( svn中的src )看起来不像这里写的原始等式: http : //citeseerx.ist。 psu.edu/viewdoc/download?doi=10.1.1.33.7291&rep=rep1&type=pdf ,第30页,附件A 第一个问题,我不了解JMetal的java版本,为什么他们使用两个不同的beta值? beta1在方程中使用min [(y1-yL),…]和的第一个arg 使用min […,(yu – y2)]的第二个arg的beta2 ) Beta 1和2用于计算alpha值和2(所以这里和jmetal我们还有两个alpha不同的值alpha1和2)… 同样的问题/问题,我们在jmetal两个计算betaq (java代码)或Deb方程,结果: 第二个问题,符号的含义是什么 用于(2)和(3)程序中的SBX伪算法,与简单β的区别? 特别是当我们想要计算交叉父母的孩子/后代时,就像这里: 编辑 更正no-op if / else块 jmetal中的代码作者给了我Nsga-II算法原始源代码的链接,他解释我Deb的SBX描述与他的实现不同:/ http://www.iitk.ac.in/kangal/codes.shtml 我不明白jmetal和原始源代码中的描述和实现之间的区别,你有解释吗? 正确if / else返回map 开始翻译成scala class SBXBoundedCrossover[G <: GAGenome, F Double = _.nextDouble) extends CrossOver [G, […]

我如何使用Drools Planner?

我有一个日程安排问题,每个学生表达他对讲座的偏好,同时为所有学生生成课程时间表(如果可能的话,以批处理模式)。 根据我的阅读和理解,Drools Planner非常适合解决此类问题。 我在我的Eclipse IDE中安装了Drools和GEF。 一切都很好。 不幸的是,我无法弄清楚如何构建一个简单的项目。 我在网上寻找参考资料,并找到了Drools Planner的例子,这些例子看起来很棒。 但是,除了一些代码片段之外,我没有找到任何可以引导人们完成简单案例的好教程。 如何为匹配/日程安排问题建模,其中3名具有独特时间和课程偏好的学生希望注册4门课程? 我如何启动代码,在哪里放置约束,我调用哪些类,等等? 任何帮助将不胜感激!! 谢谢!!

Encog – 如何加载神经网络的训练数据

我在行动中看到的NeuralDataSet对象并不是XOR,只有两个小数据数组……我无法从MLDataSet的文档中找到任何东西。 似乎一切都必须立即加载。 但是,我想循环训练数据,直到我达到EOF然后将其计为1个纪元。但是,我所看到的所有数据必须从头开始加载到1个2D数组中。 我怎么能绕过这个? 我已经读过这个问题了,答案并没有真正帮助我 。 除此之外,我还没有在这里找到类似的问题。

有人可以在曼哈顿为我解释java中的8个谜题吗?

我正在编写一个A *算法,它可以解决Java中的8-puzzle,到目前为止我已经实现了DFS,BFS,A *使用了不匹配的瓦片数量,我只需要使用曼哈顿距离的启发式实现它。 您可能已经知道曼哈顿距离是每个瓦片位移相对于其当前位置和目标状态下的索引的总和。 我已经google了,发现这些堆栈超过流主题: 在A *中 计算曼哈顿距离 曼哈顿距离 其中返回了以下代码: int manhattanDistanceSum = 0; for (int x = 0; x < N; x++) // x-dimension, traversing rows (i) for (int y = 0; y < N; y++) { // y-dimension, traversing cols (j) int value = tiles[x][y]; // tiles array contains board elements if (value […]

Order Crossover(OX) – 遗传算法

有人可以解释一下Order Crossover的工作原理吗? 我将举出这个例子,我希望以一种通用的方式来理解它。 父1 = 1 2 3 | 4 5 6 7 | 8 9 父2 = 4 5 2 | 1 8 7 6 | 9 3 解决方案是两个childreen: 儿童1 = 2 1 8 | 4 5 6 7 | 9 3 儿童2 = 3 4 5 | 1 8 7 6 | 9 […]

Java中的马尔可夫模型决策过程

我正在用Java编写辅助学习算法。 我遇到了一个我可能解决的数学问题,但由于处理过程很重,我需要一个最佳解决方案。 话虽如此,如果有人知道一个非常棒的优化库,但语言是Java,因此需要加以考虑。 这个想法很简单: 对象将存储变量的组合,例如ABDC,ACDE,DE,AE。 组合的最大数量将取决于我可以在不减慢程序速度的情况下运行的数量,因此理论上可以说100。 决策过程将每次迭代生成一个随机变量。 如果生成的变量是其中一个组合的一部分,例如。 ‘A’是ABDC和ACDE的一部分,而不是C和B(或存储的组合中的任何后续字母)的倾向将增加。 为了使事情更加清晰,我们假设’A’,’B’,’C’,’D’和’E’是唯一可能的变量。 事实是,会有更多像12或14,但这个最大值还取决于我可以处理多少没有滞后。 由于有五个可能的变量,它将为第一次迭代生成加权1/5随机滚动。 如果该滚动结果为’A’,则比下一次迭代’B’和’C’现在将具有2/5倾向而不是1/5。 如果下一次迭代产生’B’,’D’倾向将增加到3/5。 注意:关系是指数关系; 实际上,它不会是1/5,而是像10%那样略微提升,如果它达到序列中的第4个变量,它将滚雪球说50%。 现在,在Java中,我可以通过跟踪每个对象的所有存储组合来实现此function。 我想通过在每次迭代中以小步骤分配跟踪过程,它不应该太慢。 另一种解决方案是绘制所有可能的组合及其潜在的倾向。 这当然只需要一个搜索function,但也会在计算所有可能性和存储在某个地方时出现问题,可能在文件中。 有人建议我应该使用马尔可夫模型和/或库,尽管我对这种类型的数学并不太熟悉。 如何在Java中快速计算此过程? 。 示例>>> 只有一个序列ABC。 对于三个数字,机会开始相等所以它看起来像兰特(1,3) 如果A是结果,我们增加B的可能性,因为它是序列中的下一个字母。 让我们说它加倍。 所以现在机会是:A = 1/4,C = 1/4,B = 2/4 该函数现在看起来像rand(1,4),其中3和4的结果都代表选项B. 如果下一个结果是B,我们希望增加C的可能性,因为它是序列中的下一个字符,但是它是上次增加的两倍(指数) 机会现在是这样的:A = 1/6,C = 1/6,B = 4/6 该函数现在为rand(1/6),其中值3,4,5,6表示C.

如何在Java中实现遗传算法的高斯变异算子

我尝试为我的项目学习并实现一个简单的遗传算法库。 此时,人口的进化,选择已经准备就绪,我正在尝试为Java和Scala中的遗传进化引擎实现一个简单的好变异算子,如高斯变异算子 (GMO)。 我在基于多目标进化算法的Pareto排名 (PM Mateo,I。Alberto),第6页和第7页的论文A变异算子中找到了关于高斯变异算子(GMO)的一些信息。 但我有一些问题需要找到有关如何在Java中实现此高斯变异算子和此运算符的其他有用变体的其他信息。 我该怎么办? 我正在使用随机Java util的random.nextGaussian()函数,但此方法仅返回0到1之间的随机数。 所以, a)在这种情况下,如何修改返回编号的精度? (例如,我想获得一个介于0和1之间的随机双数,步长等于0.00001。) b)我如何为这个函数指定mu和sigma ,因为我想在本地搜索我的基因组的值,而不是在-1和1之间。我怎样才能调整我的基因组价值的本地研究? 经过研究,我找到了b)问题的答案。 似乎我可以取代高斯随机数,如下所示: newGenomeValue = oldGenomeValue + (( gaussiandRndNumber * sigma ) + mean ) 其中mean =我的基因组值。 (参见底部的方法如何生成具有正态或高斯分布的随机数? )

如何实现高效的Alpha-Beta修剪游戏搜索树?

我正在努力学习人工智能以及如何在程序中实现它。 最简单的起点可能是简单的游戏(在这种情况下是Tic-Tac-Toe)和游戏搜索树(递归调用;不是实际的数据结构)。 我在有关该主题的讲座上发现了这个非常有用的video。 我遇到的问题是第一次调用算法需要花费很长的时间(大约15秒)来执行。 我在整个代码中放置了调试日志输出,似乎它调用了算法的一部分过多次。 以下是为计算机选择最佳移动的方法: public Best chooseMove(boolean side, int prevScore, int alpha, int beta){ Best myBest = new Best(); Best reply; if (prevScore == COMPUTER_WIN || prevScore == HUMAN_WIN || prevScore == DRAW){ myBest.score = prevScore; return myBest; } if (side == COMPUTER){ myBest.score = alpha; }else{ myBest.score = beta; } Log.d(TAG, “Alpha: […]