目前我正在从事一个项目,该项目将使用遗传算法来优化神经网络。我确实意识到这可能不是优化它们的最佳方法,但我对这两者都是新手,所以我只是想尝试使用它们。
我的计划如下(可能会有很多变化)。我的输入神经元将使用一个数据集,该数据集几乎可以包含任何正数(包括最多两位的小数,所以它们实际上是 float ),但最有可能在 0 到 20000 之间。因为重要性在于如何如果数字在值上相互比较而不是它们有多大,它们将首先除以将输入的所有值中的最大数。在进入隐藏层之前,它们会乘以权重(任何正 float 或负 float )。隐藏层中的每个神经元将对其所有输入求和,直到完成计算。然后它们将通过物流功能运行并输出。
我的环境是 Visual Studio C++ 2010 Express,我使用的是 clr。
我的问题在于遗传算法及其工作原理。它将调整权重。我的问题是,当它随机改变其中一个权重(突变率)时,它可能会使权重异常高或低,从而在与输入相乘并与其他输入相加时导致溢出或其他一些错误。我也不知道如何组织我的染色体。那么,通过选择权重而不是随机位来执行随机化并将它们更改为定义范围内的随机数会更好吗?基本上,我正在寻找关于如何组织它的建议,而不会导致错误,使值最终太大或太小,同时保持性能。
谢谢,(抱歉,如果这应该属于理论计算机科学,但我认为它不适合那里)
最佳答案
(人工)神经网络 (ANN) 是出了名的难以优化,而遗传算法 (GA) 是一种相当不错的优化方法(主要是因为其他所有方法的工作效果往往非常有限)。当然,也有一些替代方案也能很好地工作,但它们更复杂、更微妙,无法正确编程和调整(使用模拟退火和学习动量的反向传播)。我知道你做这个项目主要是为了玩弄这些东西。
您可能想看看进化神经 Controller (ENC),这是一个使用遗传(或进化)算法来训练 ANN 以完成复杂导航任务的领域(例如,星际空间任务是我亲自做过研究)。
对于 ANN 部分,我建议您不要将自己局限于逻辑函数(我知道 sigmoid 的灵感来自生物神经元,但这并不意味着它们一直都是最好的)。还存在许多其他功能,使用物流功能的部分原因是它们使反向传播更快、更简单。但是,Radial-Basis 函数也能创造奇迹(IMO,据我所知,大多数成功的 ANN 应用都使用 Radial-Basis 函数,即 RBF-NN)。通常,人们使用高斯函数、超球面函数,并且经常使用三角函数(称为模糊网络,另一大类 ANN)。
至于 GA,出于您提到的原因,我不建议您描述的那种类型的突变(即翻转位)。人们在处理实值基因时不使用这种突变。一种非常简单的变异方法就是决定(以一定的概率)对个体进行变异,然后选择其基因中的一个元素进行变异,然后使用随机数生成器(rand())简单地生成一个新的基因元素来替换它.有了这个,你就可以限制生成的基因元素的规模,以避免个体退化的问题(即一个完全错误的基因元素可以使整个个体变得无用)。基因是什么?好吧,对于 ANN,通常是一个包含网络中所有神经元的所有权重的大 vector 。你可以猜想,如果神经元数量太多,人们很少会应用 GA。我还建议您使用锦标赛选择来选择要复制的个体。至于交叉(即混合两个 parent 来制造一个 child ),只需保持权重的顺序并为 child 的每个元素以相等的概率从 parent 中的任何一个随机选择一个权重。
我个人已经完成了我上面描述的事情,并且它对某些问题非常有效(缩小尺寸和高复杂性,即没有明显的最佳解决方案)。
最后,不要指望它会那么容易工作。通常,它需要的种群规模和世代数量远远高于您的预期(毕竟,进化是一个非常缓慢的过程!)。所以,不要尝试 10 个个体的种群并运行 50 代,然后悲伤地说“哦,我猜这行不通……”。当然,根据您要应用它的问题的规模,按人口中数千人的数量级和几千到十万代的顺序尝试更多。
关于c++ - 将遗传算法用于神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5048381/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom