K线反转形态(十七) -- 圆弧底、顶
几千年的文明造就我们东方民族,同时也造就了我们几千年之文化。一直延续下来还有一些谚语、俗语等等。其中有一句说到:“吃着碗里的,瞧着锅里的”。这是什么意思呢?那就是因为锅里的东西到什么时候都比碗里的多。除非锅里面什么也没有了。所以,才有了这句古语。在日常的汇市交易中,有没有这样的大锅呢?而且还能让您在锅中赚到足够的利润呢?有!可以肯定的说:“有”!那么在汇市中,这个锅是什么呢?就是下面要介绍的圆弧底、顶。哈哈,只是我平时愿意把此形态称之为“大锅”。因为在这个行业中,圆弧底、顶是一些操盘手的最爱、最喜欢的图形。仅可以靠这一次的锅中捞肉,就足以让他们赚得个“盆满体魁”。其形态如下图:
http://photo6.hexun.com/p/2007/0508/95426/b_F52F7C79720ADCAA8263184501CA1BA5.jpg
要形成一个圆弧底、顶是需要很长时间的。在汇市中一般的投资公司在看到这样的行情时,最少得用一年的时间来逐步买入、卖出这种货币,逐步的积累头寸,在行情突然大爆发的时候再分批出手获利出场。因为,就这一次行情足可以让一般的投资者赚上几年的了。而且这样的行情一旦在突然突破后,其涨、跌势是相当的凶猛,延续的时间也更长,常常会令一些小的交易者们不敢去追买、卖,白白的丧失了一个赚大钱的机会。
好的。我们再想一个问题?在日常的生活中,锅是什么样子的?还应该有什么呢?好,有的朋友会说到,还会有锅把,对,就是还得有一个锅把的出路。这个锅把就是这个圆弧底、顶的锅把。没有锅把,锅是端不起来的。在汇市的日常交易中,如果发现某一个圆弧底、顶有锅把,则其上升、下降的会更加踏实,更加迅猛。在锅底、顶没有建立仓位的交易者,在锅把的位置正是建仓的好时机。因为这个形态是需要很长时间才形成的,一旦爆发出来,其行情的走势会令一些持有仓位的交易者们欣喜若狂的。
在实际的判断中且记不要猜头、底;因为圆弧底、顶和所谓的头肩底、顶、多重底、顶不同,圆弧底、顶没有可以预测其涨、跌幅度的计算方法可以提供。各位朋友可以运用自己的其他特点来推测。
行情延续的时间越长(对此形态要有一定的耐心,因为一个圆弧底、顶的形成是需要几个月的时间的),形成的时间越长就预示其后市上升、下降的爆发力越强。获利也就会非常丰厚。也可以称之为“暴利”吧。
刚才在前面已经提到了锅把,那好,我们现在来看一下锅把在圆弧底、顶中是怎么样形成的?在正常的日常交易中,在圆弧底、顶形成的末端,汇价可能会出现一些反反复复。一些对此形态没有信心和耐力的交易者们,看到汇价在横盘整理的震荡中,都获利出场。后市就会以此来形成一个整理平台或者说是一个非常窄的横盘区域,我们可以把它称之为锅把。当出现这种情况,就是上次没有进场的再一次进场的最好机会。在上面的图形中没有形象的画出来,就需要各位朋友在日常的交易中慢慢的去把握吧。
最后,就是在实际的操作中也会遇到没有锅把的圆弧底、顶。汇价呈弧形上升、下降趋势,在形成的过程中其显示的动能都很强。在日常的操作中要配合各均线同时使用,其获利的效果都非常可观。由其是配合多条均线,其显示的上升、下降都十分明显,切记遇此形态不要中途出场。否则会失去更多。
吞噬形态
http://photo4.hexun.com/p/2007/0202/73836/b_2B5A3226DFC8EFB69C87AC3169FBF26B.jpg图形解剖
http://blog.hexun.com/img/xiao.gif http://blog.hexun.com/img/da.gifhttp://photo5.hexun.com/p/2007/0311/82144/b_E7EB8F4156D5B17A87B1F0769A9D9730.jpghttp://photo5.hexun.com/p/2007/0311/82144/b_85C6BF398F40B0B226F528A58C4B1455.jpg
http://photo5.hexun.com/p/2007/0311/82145/b_83A485007E46A5F4F73CF35D43D63C60.jpg
http://photo5.hexun.com/p/2007/0311/82145/b_8D6ECE8548405609150350CADC8EF965.jpg
http://photo5.hexun.com/p/2007/0311/82145/b_4AF7800EC53CEA995E50B7CB19FED084.jpg
http://photo5.hexun.com/p/2007/0311/82146/b_642F0EC0DAB7F5377812854A980CDC1B.jpg
http://photo5.hexun.com/p/2007/0311/82146/b_EC70C29C7141EEA863A48360C099F085.jpg
http://photo5.hexun.com/p/2007/0311/82147/b_AF55F343D26D4993B0D160EDBD358727.jpg
http://photo5.hexun.com/p/2007/0311/82147/b_54E9FD4451B4FC04BA76DC3C7FA2CCD6.jpg
http://photo5.hexun.com/p/2007/0311/82147/b_E82887E5B91A7E80822D1672C03B3500.jpg
http://photo5.hexun.com/p/2007/0311/82147/b_752F0E4CA3EF02E5C23E54B8DC729DC9.jpg
http://photo5.hexun.com/p/2007/0311/82147/b_6EE61D477A57EFC3FA33F381A10BC763.jpg
http://photo5.hexun.com/p/2007/0311/82147/b_4E64EEF2CBE9E7983D50FF056D43EF20.jpg
http://photo5.hexun.com/p/2007/0311/82147/b_03AF2D8AC3822E5C6BE52E9A195FD0E8.jpg
http://photo5.hexun.com/p/2007/0311/82147/b_89B8B4007EA830A1B84F29480576EC50.jpg
http://photo5.hexun.com/p/2007/0311/82148/b_28F90094F37E3C987B07C08EB773C8F1.jpg
http://photo5.hexun.com/p/2007/0311/82148/b_1F4CC7B54C60396EB79A45E8896ECA62.jpg
http://photo5.hexun.com/p/2007/0311/82148/b_6C22BF21FD8F822CB4A90CF24F76DD5F.jpg
http://photo5.hexun.com/p/2007/0311/82148/b_A083A8F90BC59E5561B0D85FAB0727D1.jpg
http://photo5.hexun.com/p/2007/0311/82149/b_C2258F55D2B0973A5D1B3346CD2EF0E3.jpg
http://photo5.hexun.com/p/2007/0311/82149/b_FF24F0B727472A5DE7FB9A5FCB3D00EF.jpg
浅谈技术分析之......
技术分析是指通过对过去的市场数据,来分析将来价格的走向。技术分析的起点:学会看图
技术分析的第一步是要学会看K线图。K线图表的类型很多,但都是大同小异。最基本和最常用的是阴阳蜡烛图。
如图中所示,一根阴阳蜡烛代表一个时间段,如果您选中 30 分钟,则一根阴阳蜡烛代表 30 分钟的交易。如您选中一天,则一根阴阳蜡烛表明一天的交易。
阴柱表明下跌,即收市价低于开市价,阳柱表明上涨,即收市价高于开市价。
通过对蜡烛图的形态分析,主要可以分析行情什么时候将反转,在一波上升的行情中,判断出最早何时将调头向下,那么就可以在第一时间内做空以赚取更大收益;同样在一波下跌的行情中,判断出最早何时将起稳反弹,那么就可以在第一时间内做多,以占尽先机。
蜡烛图还有一部分形态是研究行情在什么情况下会延续,如果掌握了这些形态,就可以更好的顺势交易,持有有利的单子时也会更加充满信心的持有,甚至途中加仓来使收益更大。
技术分析的第二步:看趋势
技术分析的第二个关键,就是要学会画趋势线,阻力位,支撑位。支撑位是指存在较大支撑的价位,汇价下跌到该价位附近时容易起稳反弹;阻力位是指存在较大压力的价位,汇价上升到该价位附近时容易遇阻回落。计算支撑和阻力位的方法主要是用画趋势线的方法,也可以结合各个技术指标,比如黄金分割、均线系统,布林通道等。
画趋势线:
在上升趋势中,将两个上升的低点连接成一条直线,就得到了上升的趋势线。在下降趋势中,将两个下降的高点连接成一条直线,就得到了下降的趋势线。为了使画出的趋势线在今后分析市场走势的时侯具有较高的准确性,我们要对用各种方法画出的试验性趋势线进行筛选,去掉无用的,保留确实有效的趋势线。
要得到一条真正起作用的趋势线,要经过多方面的验证才能最终确认,不符合条件的一般应予以删除。首先,必须确实有趋势存在。也就是说,在上升趋势中,必须确认出两个依次上升的低点;在下降趋势中,必须确认两个依次下降的高点,才能确认趋势的存在,连接两个点的直线才有可能成为趋势线。其次,画出直线后,还应得到第三个点的验证才能确认这条趋势线是否是有效的。一般说来,所画出的直线被触及的次数越多,其作为趋势线的有效性越被得到确认,用它进行预测越准确有效。
此外,我们还要不断地修正原来的趋势线,例如当汇价跌破上升趋势线后又迅速回升至这条趋势线上面,分析者就应该从第一个低点和最新形成的低点重划出一条新的趋势线,又或是从第二个低点和新形成的低点修订出更有效的趋势线。
技术分析的第三步:结合技术指标,来确认对市场趋势的判断。
在实战中应用技术指标
交易者在分析图表的时候,经常会运用一些技术分析指标,以更清楚地确认市场趋势,更好地掌握入市,出市点。
以下是一些经过实践检验,最广泛使用的指标:
http://photo5.hexun.com/p/2007/0323/84768/b_BDCCF0F7A4475FC3447413AEC2237410.jpg
移动平均线 (Moving Average)
移动平均线是将过去若干个时段的收市价格进行平均,所画出的线。和蜡烛图不同的在于,它更可靠地反映了价格的趋势。以下为 2 种不同的移动平均线 :
简单移动平均线 (SMA) - 简单移动平均线就是将若干( n)时段( 如 5 或 10 分钟,每天等)内的收价逐个相加起来,再除以总时段 n ,就得到第 n 时段的平均值。再将各时段的平均值标在图上,并用曲线连接起来,就得到 n 时段平均线。
平滑移动平均线 (EMA) –由于移动平均线是一个滞后指标,为了更贴近市场走向,平滑移动平均线在计算平均值时, 给近期数据更高的权重。这样可以更早地看出市场的趋势。
移动平均线有很多用途,主要用于识别 / 确认趋势,以及识别 / 确认阻力位,支撑位。 比如:快线向上超过慢线,称为“ 金叉”,为买入信号。当快线向下穿越慢线,称为“死叉”,为卖出信号。
随机指数 (STC) 随机指数也称为 KD 线,它衡量收盘价在最高价,最低价区间所占的位置,以判断趋势,及进出市场点。随机指数坐标在 0 - 100 比例范围内。 K 线表示收盘价与一定时间内最高价,最低价的百分比,例如, 20 表明价格在最近一段时间内的 20% 位置。D 轴则平均了 K 轴。
随机指数( KD 线)的具体数学公式比较复杂,但其应用却相对简单,直观。随机指数可以帮助我们:
判断趋势:指标为 80 以上表示强劲的上升趋势,市场处于所谓的“超买状态”;如果指标在 20 以下则为一强劲的下降趋势,市场就处于所谓“超卖状态”。
判断买卖信号:
1. K 线高於 D 线,但於超买区内向下跌破 D 线,为卖出讯号 (死叉)
2. K 线低於 D 线,但於超卖区内向上突破 D 线,为买进讯号(金叉)
3. K 、D 线在高价区连续出现两次以上交叉,为卖出讯号
4. K 、D 线在低价区连续出现两次以上交叉,为买进讯号
5. K 、D 线与价走势背离时,为反转讯号
相对强弱指数 (RSI)
RSI 为相对强弱指数 (relative strength index) ,是衡量市场上涨与下跌力量的指标。若上涨力量较大,则计算出来的指标上升;若下跌的力量较大,则指标下降,由此测算出市场走势的强弱。
RSI 的应用
1. 一般而言,RSI 在高位掉头向下为卖出讯号,在低位掉头向上为买入信号。
2. RSI 出现 M 顶可以卖出,出现 W 底可以买入。
3. RSI 出现顶背离可以卖出,出现底背离可以买入。
4. RSI 跌破其支撑线是卖出信号,升越其阻力线为买入信号。
5. RSI 的参数常见取5~14。参数大的指标线趋势性强,但反应滞后,称为慢速线;参数小的指标线灵敏,但易产生飘忽不定的感觉,称为快速线。若慢速线与快速线同向上,升势较强;若两线同向下,跌势较强;快速线上穿慢速线为买入信号;快速线下穿慢速线为卖出信号。
布林通道 (Bull)布林通道是一个由标准差来判断市场阻力位 / 支撑位的方法。
通道由三条线组成。中线为其一简单移动平均线,通常为 20 天简单均线。通道顶为 20 天平均线加 2 倍标准差,通道底则为 20 天平均线减 2 倍标准差。
如果价格在移动平均值的上部表明宜“卖出”,反之,如果在变动平均值的下方,则宜“买进”。
交易者经常使用布林通道洞察价格突变、捕捉趋势变化、辨别潜在的支持 / 阻力位及通过波幅的拓宽及缩窄寻获突破位。
移动平均值背驰指标 (MACD)
MACD 是用移动平均线在价格图表中找寻交易信号的更具体的方法。它是由 Gerald Appel 发明的,用来描画 26 天指数平均线和 12 天指数平均线间的差异。另外 , 9 天移动平均线常被用作为强弱触发线,意为当 MACD 和此线交叉向下,此为一下跌信号;当 MACD 和此 9 日线交叉向上,则为一上涨信号。
和其它指标一样,交易者研究 MACD 指标以寻求技术指标与市场价格之间技术背离的早期讯号。如果 MACD 上升且其阶段底部在提高 , 而同时价格还在下跌创新低,这可能是一个强烈的买入信号。相反,如果 MACD 在下降且其阶段高点在逐渐降低 , 但是汇价却在创新高,这是强烈的熊背离和卖出讯号。
奇妙的数字背后——释解奇偶数字在汇市的变换与应用
各位朋友大家好:今天斗胆在这里跟各位探讨一个非常遥远且可能又是一个很迷信的话题,哈哈,什么呢?数字!什么数字?1、2、3、4、5、6、7、8、9、0。就这些看似很平常的奇、偶数字。好。我们就探讨一下这些数字的奥妙与在汇市中的变换如何?首先,我的这些想法是来源于想对“五度空间”其中的数字变化进行更深入的了解而产生的突然想法。并为此而想进行更深入的探讨与学习,最终要让这些奇妙的数字为我们自己所用。仅此而已。好,我们就先看看数字变换谋略的奥妙。
什么叫数字计谋?
所谓计谋者,即人们在对某种事物开始前所要进行的设计和谋划。汇市交易也是如此,都要进行交易方向的设计和谋划。不过,这种谋划与—般的计划有所不同,它带有一种特殊的意义:它在任何时侯都具有着一种或多种的针对性,即针对着对立和竞争的一方或多方而展开自己的计划,因而它带有谋取利益、击败对手和回避风险、摆脱困境等功能。
计谋的设计往往以对手的薄弱环节或事物的阴阳两个极端而展开思路,薄弱才可乘虚而入,极端方能图谋机会。所谓计谋在市场的交易中通常分明暗两个部分,明的部分就是按照通常的逻辑思维来设计策划事物的变化,使事物的运动方向显示出明显的且又可以被习灌或“贯例”所接受的倾向运动轨迹。暗的部分就是反常规的和突破习惯思维的逆向设计。明暗两个部分有着密切的关系,它们是不可分离的整体,它们的运动宗旨都是最后要达到同一个目的,只不过它们各自所运用的手段和方式不同:它是用明的掩护暗的,用明的展示虚假目的,用暗的惯彻其市场的真实意图,最后殊途而同归,使事物向着自己设定的方向发展。
所谓“数字计谋”,就是用数字的不同变化来预测的方法,预先算出市场有可能发展的轨迹,而后设计谋取对方。利用各种手段、制造假象,诱使对方走向相反的或偏离市场应该发展的轨道,从而使自己在对方的错误运作中获取利益或战胜对方。
运用数字计谋的关键,就在于对事物发展的正确把握。用数字学来预测事物的发展,都是根据其事物气数运行的必然规律和事物矛盾运动的性质来进行的,它有着比较高的准确律,这避免了许多人为地一些想当然。因此,用好数字计谋具有着神奇的功效。中国古代的军事家、政治家多通此道,诸葛亮、张良、刘伯温等等都是这些人物的典型代表。
中国古代兵法《三十六计》中,每一计都可以用数字的思想加以展开,可以说它们是数字计谋的最好注解。用数字定下计谋,进有进路,退有退路,随时都可知道敌我双方的强点和弱点,这在数字学六壬、奇门、太乙中反映得非常清楚,因此,精通数字之变换者,对诸葛亮等先人的神机妙算和用兵方略,也就不足为奇了。
什么叫数字谋略?
所谓谋略,就是通过对事物发展“趋势”的分析,而采取较长时间的总体战略,谋略是对事物发展的大的运筹,它与计谋的区别在于,计谋是事物的局部,且针对着某一项或几项具体事情,所采取的非常具体精密的操作方案,而谋略则是针对事物的总体发展趋势而言。它料定事物目前的发展趋势,已经处于什么样的状态,今后会向什么方向发展,然后制定出一段较长时间的总体执行方案,这种方案一般都只是方向性的,并不具体而精细、然而它却对每一个具体的计划都具有指导作用。就像“五度空间”的数字变化一样,给出你的价值区域,其它的就要靠你自己去领悟和把握了。
而数字谋略也就是用数字的思想指导谋略的制定。数字谋略的关键,就是用数字预测,确定事物的大势所趋,和事物运动的返转,以及对事物现状采取重大行动的宜忌,使我们对事物的总体格局有一个清醒的认识,这些对我们制定准确的交易方案会起到决定性的作用。
数字谋略是以数字学的基本原理为基础。如矛盾的对立统一;阴阳互变和动静相生;五行的相生相克和事物的综合平衡;事物运动的运势和动能;事物见—为始,观四为象,遇三而变,逢五则还,得七则伏,遇八而革,逾九则极,返六为止等等。这些基本原理,都是事物“气数”运行的必然规律, “气数”所至,事败而复兴,“气数”所背,事聚而必散,观古往今来之大运,万事万物无不如此,故制定谋赂者,遵循这个规律则胜,违背这个规律则败。
什么叫“庙算”?
《孙子兵法》云: “夫未战而庙算胜者,得算多也;未战而庙算不胜者,得算少也。多算胜,少算不胜,而况于无算乎?“吾以此观之,胜负见矣。”什么叫“庙算”呢?在古代,人们用各种方式进行占卜预测之前,首先必须开坛设典,祭祀祖先或神灵,以求得占卜的灵验,这些活动都是在庙堂里进行的,故而称之为“庙算”,所谓“庙算”多少,这里专指太乙数中的主算和客算之数,主算数多于客算数则“得算多”,主算数少于客算数则“得算少”,这里的主客数也就是主客双方的气数强弱。气数强则胜,气数弱则败。后来的人们把得算多和得算少解释成对战争胜负把握的多少,这也不算错,太乙神数的主客数算法非常明确,数字非常具体,这是真正的“算多”或“算少”,而后者的说法 则是根据敌我双方实力的对比,所得出的大概比率,从数字运筹学的角度来说前者的精确度和成功率明显地高于后者。
后来,人们的数字预测不需要借助于“庙算”了,祈祷神灵的繁琐仪式也被去掉,人们发现数字本身就具有反映事物气数现状和运动状态的功能,不论你采用什么形式(六壬、奇门、太乙、易经等)不论你在什么时间,不论是什么事物,不论是否祈祷上天,这种气数规律总是随时随地地反映出来,因为我们总是生活在“气”的世界中,只要我们用某种方式摸到了“气”的脉搏,得出气数的强弱,任何事物的发展就有了规律可循,正象医生摸病人的脉搏查病一样,脉搏无,则人也就无气了,万事万物都是同一个道理。这也可能就是“五度空间”之奥妙吧。
什么叫“谋略概算”?
任何出现数字的使用方法,包括六壬、奇门、太乙、易经以及汇价走势的变化等等,它们所筹算的要素大致有三条:第一是时间,第二是空间(所谓的价值区),第三是事物气数的状况。这里的时间就是事物产生和发生转折的时机,又叫“天时”,事物正好在某一个时间产生或在某一个时间发生变化,这有它的“气数”发展的必然性。空间就是事物都离不开它的时间和空间属性。在某一时间出现在某一位置上,同样也有它“气数”发展的必然性,因为根据气数发展的运行规律,某一新事物的发生,必须同时具备天时和地利两个因素。与人有关的事物,还必须具备人和的因素。正在运行中的事物,也同样离不开天时、地利、人和三大要素。只不过其运行速度和强弱取决于三大要素的强弱。天时、地利、人和缺一者,即事物无存在之时空或存在之人为意识,事物将不能产生,或产生了也要瓦解。
哈哈,我今天和大家在这里探讨这“谋略概算”,就是在预测汇价将要发展的方向时,首先要对整个汇价的走势所占天时、地利、人和的大体的情况进行预测,要看所预测的趋势能否发生,或发生以后所占三要素之气数强弱。得天时而无地利,则有机会而无条件;得地利而无天时,则有条件而末见好时机;得天时地利而不见人和者,则事可成然无人相助,人气背散,终成憾事。
谋略概算以大数(事物整个气数)和中数(事物机转之数)为依据,三要素汇聚一点或一方者,事必有成。且可作为预测之中心;三要素不足或分散者,事必有损或不成,于我可设计弥补,于敌可设计攻之。正因为我们预测的只是汇价“气数”的发展趋势,而不是具体的精确数字,故而只能叫做“概数”。
什么叫“预测八字诀”?
我们在预测汇价将来的走势之时,必须从八个大的方面来考虑问题,这就是所说的“预测八字诀”,即时、势、动、静、趋、避、中、和。时反映了汇价发生变易的时机;势代表了汇价形势的优劣和波动势能的高低;动表示汇价波动的得失,如何波动和波动的时机,静反映汇价不动的利弊,暂时地静止,以等待时机;趋代表汇价的主动进取;避表明汇价的暂时退让(盘整);中代表中和各方以取得趋势的平衡或居中(离场)观望,以等待形势的变化;和代表以小和大、合势以成就赢利。和一方而博另一方;八字者以时、势为先,动、静为要,趋、避为本,中、和为纲。
时
这里的时,不是指一般的时间概念,而是指具有着特定意义上的汇价在发生转折或变化运动过程中所出现的“时机”,“机运”、 “机会”等等。汇价在正常的波动过程中,它的时间是均等的,—般情况下是看不出什么特殊意义,正象每天工作、休息、吃饭,显得非常平淡。然而,当汇价出现不平常的波动,即出现剧烈波动时,如因为基本面的某一事件,破坏了原有汇价的波动范围,从而使其建立新的波动范围,在这个波动过程中,就出现了不平常的时间段。这个时间段,是汇价从开始波动到波动终结的一段区间。之所以说它不平常,是因为它与汇价的波动发生了变化,汇价在此时间里改变了自已的波动范围或者是原有的形态,这个时间就具有了一种特殊的意义。它在人们的感觉上往往会变得不均等了,时间的概念被延长或缩短了。汇价变化的过程被忽略,而只看到了波动的结果,并且把这个结果浓缩到一个点上,这个点就成了原有和新的汇价趋势交汇点,或者说是旧趋势和新趋势的连接点,这个点,就是数字学特定的研究对象,称为“转折点”或“切入点”。
在现实的操作中,转折点是不容易被找到的,时机也更难把握,人们总是生活在习惯的惯性之中,突然的变化总是使人手忙脚乱。更多的情况是,人们无法知道眼前的汇价是否已经到了顶、底,汇价是否要开始发生变化和转折,是否要从这个变化中去寻找有利的时机。
数字学帮我们很好地解决了这个问题,它能够预先预测出汇价的变化,指明汇价的转折和转折的时机,它能在汇价发生之前就料定其将要发生和变化的趋势,因此,自古以来,数字学就被称为“天书”和“神机妙算”之学。哈哈,讲迷信了。
在数字预测学上,时机具有非常重要的意义,它是预测汇价趋势之成败的关键,如何寻找机会利用时机,是预测的关键环节和入手功夫。时机未到,功夫减半;时机一到,万事可发。
势
势者,有两种含义,其一为形势,即汇价发展之态势,和自己在整个中交易所处之位置。其二为势力,即汇价所具备之运动能力,亦即汇价发端之势能和动能的大小,以及汇价原发态之气数的强弱。二者总括起来,就是在预测汇价趋势之前的形势和能力分折。
形势分析就是对汇价的一种分析。任何事物都是处于一定的环境之中,这个环境有社会的、政治的、经济的、人文和自然的环境等等。不同的环境就形成了各种特有的形势,各种形势的总和,就构成了整个事物的大势。大势兴则旺,大势败则散,大势来则有大变,大势去则事必亡。我们预测汇价也同样如此。汇价的涨落是受社会政治、经济等各种因素所决定的,我们从汇价的中可以不同程度地看到整个社会发展的,当汇价的升市到来,一路坚挺,这就表明社会的政治经济状况必有所改观,汇价的已经到来。而当汇价的跌市来临,低迷,就预示着社会政治经济形势肯定出现问题,汇价的进入了下跌或低迷的状态。我们说诸多的因素造成了不同的形势,而形势的总和又构成了大势,小的形势体现了大势的发展,而大势又包含在各种形势之中,大势反映了事物整体的发展态势.
数字学对的预测,有着它独到的优势,它可以先人一步而知大势的来去,可较为精确地判断大势的有无,因为大势是由气数所决定的,而数字正是研究气数的学问。只是要想弄懂它是需要一定的时间的。
好了,知道了大势,再看“我”在大势中的位置,大势于我是利多还是利空。大势的动静、进退、转折、变化等等于“我”的关系,都决定了我的计划,预测和操作。预测不看势,则必多败。这也可能就是“五度空间”最致命的弱点了,若能再以实际的形态加以配合的话,那真的是如虎添翼了。
能力分析就是看我们自己在整个汇价的运行过程中所具备的能量大小。任何事物的运动都具备两种能力,其一是事物在开始运行前的起点所具备的能量,因为它是处于尚未动作和蓄势持发的状态,故而称之为事物的势能。势能越大,其运动的能量就越充足,其一发则不可阻挡,它的运动来得迅猛而快捷。势能也叫势力,它是衡量事物实力大小的标志。势力大,事物的能量也就越大。故任何事物在其发生之前,必有一个蓄势的过程,或者叫“聚气”的过程,我们要办一个公司,必须要蓄集人力和财力,万事具备,方可发展。哈哈,不过也有皮包公司者,然其势甚弱,一般难成就气候。
其二是事物形成以后所具备的动作能量,故称之为事物的动能,动能是在事物的运动过程中形成的,它与事物的势能有着直接的关系,在多、空双方交战中,势力越大,其攻击的能量也就越大。事物的动能,是可以不断地在运动中培养的,这就是汇市中一些投机机构的势力了,势力小的,可以在汇价的波动中慢慢积累,正象滚雪球,可越滚越大,势力大的,也可越变越小,.正象百万富嗡,一夜之间变成穷光蛋.因此,汇市意义上的势能和动能,并不象物理学上的势能动能—样,存在着明确的转换等量关系,而是因为由于人为意识的参入,使其整个的物理关系发生了改变!
数字学判断汇价的势能和动能,是以分析汇价的气数状况和发端的强弱以及多、空的强弱波动来确定的,它里面存在着一套独特的分析技巧和判断的依据.它通过对气数的分析,判断出各位置各时间各局部波动的气数状态和相互影响,从而确定整个的走向,最后得出整个形势和能力的判断。
动
动为主体在整个中的动作,当对时势作出较为准确的判断以后,就要确定我是否动作,如何动作,在中是顺势而行,还是逆势而走。
动作的关键,是要看清的走向,大势动则必有大气候,若抓住了大气候,则平步青云,可获大利。动如看大势者,为智者;动作看小形势者,为弱者,动作既不看大势,亦不看小形势者,为愚者。
事物动,必有其动机,此动机为动作的时机。机会,反也、变也。老子说:“反者道之动。道的运动,在于阴阳的逆反和变迁。聪明的人在大势走向高峰之时,早巳看到其必然的回转,而在大势处于低边之时,已料定其反向的必然,在这个汇价回转之时,就叫做时机。机会和机遇总是献给能把握它的人。
当然,人与事物的动作,有大动,也有小动,大有大的动机,小的小的动机,此动机又全在人为意识之中,众多的动机总汇起来,又构成了大的动机。当我们发现周围的许多小动物纷纷逃离自己的巢穴,周围的环境出现了许多其明其妙的变化时,大地震的灾难就会接踵而来。当众多的人们被“民族主义“的动机所驱使而进攻别人的国家时,战争也就随之而燥发。由此而知,众多的小动机是大动机的征兆,聪明的预测家就善于观察周围事物的任何细小变化,而从这些变化中找到事物即将发生大变的依据。我们的数字预测,也同样需要这样的“征兆观察”。
顺势,逆势和变势运动,首先必须明势,动作的目的在于使势向着有利于自己的方向发展。把握了势,自己的行动才能主动;失去了势,而去盲目地行动,必然会彻底地失败。
静
静者,伏藏也。当大势不动,或形势不利于自己,此时的指导方针当以静为宜。世界上任何事物都有它的兴旺时期和它的衰弱时期,一个人一生中必然会遇到几次大的挫折,挫折超多,它建功立业的机会越多;挫折越大,它的业绩也就会远大,不饱经风霜的人,永远是无大出息的的人。因为事物运动的曲线就是这样,升起的越高,跌落得也就越深,反之亦然。
我们说静,并不是消极地等待,静的目的是为了蓄势,静一方面可以避开汹涌而来的风险,因为只有静才能制动,把动之能量化在无形之中。另一方面可以把就自己的动能变成我的势能,压力和困难往往就会促成意志的坚定和斗志的高昂。静者,弱也。老子云:“弱者道之用“,道以弱为用,用可以理解为利用,作用等等。只有弱的东西,才能兼容一切,才能富集自己的智慧,以等待大势的反转,然一举围之。动者,动极而生静;静者,静极而生动,静的目的是为了动,只有为动而静的人才是高明的人。
趋
趋者,所向也,进也,攻击也。当蓄势已毕,就要寻找时机进行出击,即由静止迅速地转为动作,动有进退,随大势而动:趋只为进取,随形势而变。趋者,需明趋势,辨形态,识机遇,当取趋势而顺之。
每日波动的形势决定了操作的目标或突破口,更是动作计谋的关键,动法是采取谋略的要点,二者必须兼用。当趋势处于大动之时,趋之则应迅速而猛烈,这样可获取大利。当事物机现而处微动之时,则应谨慎从事,以免盲动招损。
避
避者,退也,藏也。当在动作和趋势波动过程中,遇到预料之外的波动时,切不可手忙脚乱,而首先想到的就是避字诀。这时要保持平稳的心态,心力归于静定,避之用于谋略,只是在大形势中的短时动作,它是一种对弱势的暂时回避。在大势处于低谷或大势于自己不利时,采取人为的回避是必须的,避与静不一样,静是一种伏藏,是在相对静止中进行等待;观望、蓄势而待发。避却是一种主动地退却,它是在波动中的战略防御,带有积极主动的性质。故避之目的是为了趋,退是为了进,只知进,不知退的人,往往会陷于更大的因境,此之为操作过程中不可不知的道理。
哈哈,总的来说,这些也可能就是一个事物在变化的过程中,我们需要掌握的所谓趋势、价值、时间、价格等等的解释吧。不过,对汇市上的一些数字分析,北方向来都持钦佩态度。因为,数字预测不是一般人所能做到的。非一日之功夫可谈。假以十日,当各位朋友都能从中理解到了其中的真正含义,就不会有这样、那样的......了。
北方真诚的希望明年的今天或者是后年的今天都能看到诸位还在汇市上驰骋!
北方在此再一次祝福各位汇友好运长在!
K线反转形态(十六) -- 延伸V型底、顶
2007-05-08 17:53
K线反转形态(十五) -- 单日反转 V 底、顶
2007-05-08 16:13
K线反转形态(十四) -- 潜伏底、顶
2007-05-08 15:31
北方在此恭候您的光临
2007-05-04 13:51
非美暴涨 ---- 高位下的思考
2007-04-28 01:28
波段操作≠频繁买卖
2007-04-27 02:27
K线反转形态(十三) -- 三重底、顶
2007-04-23 13:37
K线反转形态(十二) -- 双底、顶
2007-04-23 01:05
外汇的交易方式
2007-04-22 13:40
外汇市场的组成
2007-04-22 13:23
什么叫“期权障碍”?
2007-04-17 17:26
K线反转形态(十一) -- 复合头肩底
2007-04-11 16:15
对技术面分析的一些感悟
2007-04-14 12:04
炒汇的传说
2007-04-11 20:13
英国“本土投资法”议案出炉,可能会令英镑..
2007-04-11 16:39
如何判断趋势,止损位又该如何设?
2007-04-10 13:35
如何运用技术指标来判断汇价的顶、底部
2007-04-10 12:34
警言 -- 外汇投资心理剖析
2007-04-09 20:24
K线反转型态(十)-- 头肩底
2007-04-09 14:07
K线反转形态(九)-- 头肩顶
2007-04-09 12:50
短线操作技巧
2007-04-05 23:47
欺骗你自己 -- 是你亏损的主要原因 [浅谈风..
2007-04-04 20:04
如何看懂各种经济数据
2007-04-04 17:58
技术分析常用指标释解(四)K D J - (随..
2007-03-31 19:59
弄懂一根最简单的 K 线 -- 它是你在汇市最..
2007-04-04 01:42
技术分析常用指标释解(三)B O L L - (布..
2007-03-31 19:45
技术分析常用指标释解(二)D M A
2007-03-31 19:30
技术分析常用指标释解(一)D M I 趋向指标..
2007-03-31 19:22
几大风云人物
2007-03-31 18:09
即将成熟的外汇市场,高端理财师理财服务的..
2007-03-30 17:32
利用技术性调整做短线
2007-03-30 16:24
成也萧何、败也萧何 -- 浅谈止损
2007-03-30 11:34
建立头寸、入场时机、赢利出场是您耐心等待..
2007-03-30 10:59
K线组合形态(八)-- 三只乌鸦、三胎乌鸦
2007-03-27 22:22
K线组合形态(七)-- 大敌当前
2007-03-27 15:54
K线组合形态(六)-- 三白兵进攻
2007-03-27 15:09
K线组合形态(五) -- 早晨之星、黄昏之星
2007-03-26 19:55
您的耐力是您在汇市操作中的不二法宝
2007-03-25 21:45
浅谈趋势线的使用技巧和方法
2007-03-23 18:34
浅谈技术分析之......
2007-03-23 17:37
单根K线形态(四)——大阴、阳K线
2007-03-22 17:24
单根K线形态(三)——长下影阴、阳线
2007-03-21 21:55
单根K线形态(二)——T字型
2007-03-21 21:03
单根K线形态(一)——十字星
2007-03-21 20:33
浅谈布林通道下轨抄底的技巧
2007-03-21 19:30
透析黄金分割之入门与实战
2007-03-20 23:22
图形解剖
2007-03-11 15:42
吞噬形态
2007-02-02 00:21 外汇操作与心态之转换
技术分析的最终目标
2007-07-09 06:58
如何运用MACD?
2007-07-09 05:55
奇妙的数字背后——释解奇偶数字在汇市的变..
2007-05-24 02:35
忍耐与成功
2007-05-20 17:12
如何用最简单的方法来判断所谓的趋势
2007-05-15 14:48
一套良好的技术分析系统只是成功的一半
2007-05-13 23:00
请您慎重
2007-04-28 01:30
为什么我们不明白?
2007-04-27 03:11
在外汇市场上没有失败~只有瞬间的停止
2007-04-27 02:56
鱼饵~钓鱼~止损
2007-04-27 02:43
黄昏寄语
2007-04-26 00:26
取与舍之间您将如何面对?
2007-04-25 22:54
从佛经慧语中看红尘
2007-04-25 22:31
悟、悟、悟............
2007-04-13 12:35
父亲、母亲 -- 谁更辛苦?
2007-04-05 01:28
我个人的转变过程
2007-04-04 17:18
要做好保证金交易 -- 一定要以你自己的眼光..
2007-04-04 16:41
长期累积您的资本 -- 是您在汇市成功的基础
2007-04-04 15:50
笑 天 谈 清 明 祭 祖
2007-04-01 14:14
献给到此做客的 -- “独孤求败”的交易者朋..
2007-03-23 20:59
人生 - 汇市 - 棋子
2007-03-22 21:51
汇市交易中的技术、原则、性格
2007-03-02 02:19
没有最好的交易模式
2007-02-03 01:51
做人一定要有企图心
2007-02-01 16:35 2008年咨费信息
2008-01-07 19:38
2008新年寄语
2007-12-30 20:19
2007年回顾及2008年展望————北方理财咨..
2007-12-29 16:28
北方致各位汇友的忠告
2007-09-08 12:19
专业与非专业炒汇之区别
2007-09-03 20:11
哈哈北方说说——胡说八道的由来
2007-08-29 18:07
外汇市场上的立足点
2007-08-29 13:51
机会面前人人平等
2007-08-05 23:26
诱惑
2007-07-20 20:38
各位汇友好
2007-06-20 19:30
心中那片天
2007-05-31 01:03
哈哈 ---- 笑天也谈感恩胸怀
2007-05-28 22:21
既然遇到了 --- 就应无怨无悔
2007-05-28 21:45
三件事 ---- 对比出不同的结果
2007-05-27 13:32
淡泊明志肥甘丧......
2007-05-21 14:15
谈今论古话“挚真”
2007-05-21 10:40
心乃菩提
2007-05-13 15:16
伯牙吊子期
2007-01-26 17:23
“三度”人生,珍惜拥有 外汇交易知识 交易系统设计下载
主人:pckr
http://logo.tool.hexun.com/E76F1A-150.jpg
[发送私信] [加为好友] [关注]
独步汇林
分析师俱乐部
理财大圈子
外汇实战操作
外汇学习网
性福俱乐部
充满欲望的无味世界。
金融期货专版
国际外汇投资论坛 The inv.
外汇保证金
1929年美国股灾 [转贴 2008-02-14 11:19:41 ] 发表者: pckr
在世界其他国家,发生过多起因股市而引起的经济灾难,最典型的要数1929年美国股灾。 1929年10月29日 在这个被称作“黑色星期二”的日子里,纽约证券交易所里所有的人都陷入了抛售股票的旋涡之中,这是美国证券史上最黑暗的一天,是美国历史上影响最大、危害最深的经济事件,影响波及西方国家乃至整个世界。此后,美国和全球进入了长达10年的经济大萧条时期。 美国做了个噩梦
[阅读全文] (字节数 : 2938)
评论:0 | 推荐:5 | 引用:0 | 点击:2 | 收藏
货币史启示录:1931年英镑贬值与荷兰央行行长之死 [转贴 2008-02-14 11:19:26 ] 发表者: pckr
编者按 回顾历史,总可以使我们更加清晰地认识现在,我们从今日起推出世界货币史启示录系列报道。回顾世界货币史上曾经发生的重要故事,无疑将给我们诸多启发。尽管当下的现状和货币史上的具体格局远非类似,也未必有一定的可比性。但这一段段历史于我们仍有一定的借鉴意义。 如果一国外汇储备的主要储备币种大幅度贬值,会给该储备国带来什么影响? 一战后有众多国家将英镑作为储备货币,然而1929年爆发的始于美国的经济危机席卷了整个...
[阅读全文] (字节数 : 1457)
评论:0 | 推荐:5 | 引用:0 | 点击:1 | 收藏
关于通膨:中国上世纪80年代的两次通货膨胀 [转贴 2008-02-14 11:19:09 ] 发表者: pckr
第一次通货膨胀 ?? ??1978年12月十一届三中全会,邓小平实际上成为党中央的领导核心,党把工作的着重点转移到经济建设来的时候,仍面临重大比例关系失调的现实。因此1979年4月召开的中央工作会议决定,用三年时间进行国民经济调整,实行新八字方针,即调整、改革、整顿、提高。随之,进行了一系列的价格改革。 ?? ??从1979年起,政府提高了粮食、棉花等18种主要农产品的收购价格;其中,粮食收购价提高30.5%,棉花提高25%...
[阅读全文] (字节数 : 1774)
评论:0 | 推荐:5 | 引用:0 | 点击:2 | 收藏
美元涨跌三十年 [转贴 2008-02-14 11:18:57 ] 发表者: pckr
美元涨跌三十年1944年7月布雷顿森林会议和1945年12月通过生效的“国际货币基金组织协定”,确定了美元与黄金挂钩、其他货币与美元挂钩的固定汇率制,使美元取得与黄金等同的国际储备资产地位。随着美国的黄金储备减少和外债增加,1971年8月,美元政府宣布停止向外国中央银行出售黄金,1971年12月和1973年2月,美元两次法定贬值,其他主要西方国家相继宣布放...
[阅读全文] (字节数 : 1784)
评论:0 | 推荐:5 | 引用:0 | 点击:3 | 收藏
中国经济学的百年回顾 [转贴 2008-02-14 11:18:44 ] 发表者: pckr
自1901年严复翻译出版《原富》以来,现代经济学传入中国已经历时整整100年。回顾一个世纪以来的中国经济学发展,充满了无数的艰辛与曲折。作为一门经世济民的致用之学,经济学在中国的发展与整个中国社会经济的发展紧密相关,
经济学的初步繁荣:30、40年代中国的折射
基本理论的掌握为系统分析现实问题奠定了坚实的基础,这两方面的学者紧密结合中国现实展开研究,现代意义的中国本土经济学由是发端。从“五四”运动到2...
[阅读全文] (字节数 : 2883)
评论:0 | 推荐:5 | 引用:0 | 点击:2 | 收藏
简要金融学历史 [转贴 2008-02-14 11:18:32 ] 发表者: pckr
金融学的历史在经济学中令人咤舌的短。经济学家们早就意识到信用市场的基本经济功能,但他们并未热衷到在此基础之上做进一步的分析研究。正因为如此,关于金融市场的早期观点大多非常直观,而且绝大多数都是由实业家们提出来的。而对金融市场进行开创性理论研究的LouisBachelier(1900)似乎根本就被理论家和实业家们所忽视和遗忘了。投资组合理论以上事实并不意味着早期经济学家们忽视了金融市场。IrvingFisher(1906,1907,1930)早就描...
[阅读全文] (字节数 : 5427)
评论:0 | 推荐:5 | 引用:0 | 点击:2 | 收藏
国外期货市场操纵的案例分析及经验借鉴 [转贴 2008-02-14 11:18:16 ] 发表者: pckr
期货市场操纵是指操纵者利用资金、信息等方面的优势影响交易品种的价格,使其朝着某种有利的方向偏离并从中牟利的行为。操纵行为严重地破坏了市场公开、公平和公正原则的执行,侵害了一般投资者的利益,阻碍了市场的稳定有序的运行,因此,它一直是期货市场监管机构严厉打击的不良行为之一。本文通过国外期货市场几个典型操纵案例的分析,总结归纳成熟市场的经验教训,以期为国内期货市场的监管提供一些有价值的参考和借鉴。 一、国外期货市场操纵事件的回顾与分析 西方发达国家期货市场已...
[阅读全文] (字节数 : 19641)
评论:0 | 推荐:5 | 引用:0 | 点击:4 | 收藏
盖瑞·贝弗德 [转贴 2008-02-14 10:07:06 ] 发表者: pckr
从事交易好比打牌,要有耐心等待有利的机会,像等好牌一样;如果苗头不对,应该即刻出场,就像拿到一把坏牌,即早放弃才能减少损失。贝弗德认为,将打牌的技巧运用在交易上,可增加获利率。 许多年来,我一直听说可BLH是期货市场,尤其是全球最大的期货市场棗债券市场的主力大户,我起初还以为BLH是一家大公司的名称,可是在我寻访全球最高明的交易员之 后,我才知道BLH指的是盖瑞·贝弗德。 盖瑞&m...
[阅读全文] (字节数 : 5709)
评论:0 | 推荐:5 | 引用:0 | 点击:2 | 收藏
保罗·琼斯 风险管理胜过一切 昨日收盘当作成本 [转贴 2008-02-14 10:06:23 ] 发表者: pckr
一:一次失误带来的启示 1987年10月,使投资者难忘的日子,世界股灾,另到投资大众遭到巨额的损失,同一月份,保罗·琼斯经营的期货基金,突围而出,一个月赢得令人震惊的62%的增长,琼斯买卖方法与众不同,成绩也经常出人头地,过去五年内每年都以三位数的增长率向前迈进!年中回落幅度甚为轻微。 1980年秋琼斯加入纽约棉花期货市场,作为独立的出市买卖手,成绩惊人琼斯不但赢得数以百万的暴利,而且在出市买卖的三年半时间之内...
[阅读全文] (字节数 : 8941)
评论:0 | 推荐:5 | 引用:0 | 点击:3 | 收藏
布鲁士·郭富拿 纵横天下的头号外汇交易员 [转贴 2008-02-14 10:05:25 ] 发表者: pckr
郭富拿认为,风险管理是交易成功的第一要件,在买进前就要决定出场的时机.这正是使他成为当今举世进出金额,最大的银行外汇与外汇期货交易员,主要的关键所在. 布鲁士·郭富拿也许是当今举世进出金额最大的银行外汇交易与外汇期货交易员。他单单在1987年,就为自己及其基金投资人赚进3亿美元。过去十年,他的平均年投资报酬率高达87%,也就是说,你在1978年初,只要投资郭富拿的基金2000美元,10年后,你的投资可以成长到100万美元。...
[阅读全文] (字节数 : 17420)
评论:0 | 推荐:5 | 引用:0 | 点击:5 | 收藏
理察·丹尼斯 依仗投资理论 勤于检讨得失 [转贴 2008-02-14 10:03:15 ] 发表者: pckr
理察·丹尼斯 依仗投资理论 勤于检讨得失 在市场行情跌至谷底时,丹尼斯大量持有多头部位,而在行情涨升到顶峰时,他却持有空头部位.这正是他之所以能掌握获利良机,成为交易员推崇备至,商品市场传奇人物的主要原因之一. 理察·丹尼斯是在1960年代末期踏入商品交易行业的。当时,他只是交易所营业厅内递单的小弟,赚取微薄的薪水。1970年夏季,他决定自立门户,于是向家人借了1600美元,在美中交易所...
[阅读全文] (字节数 : 14213)
评论:0 | 推荐:5 | 引用:0 | 点击:2 | 收藏
金融大鳄索罗斯:不为人所知的投资思维 [转贴 2008-02-14 10:02:10 ] 发表者: pckr
人们对于世界的理解总是不完善的。o在其后来才畅销一时的《点石成金》(TheAlchemy Of Finance)一书中,索罗斯第一次就其在投资活动中所凭借的基本构架大发宏论,他暗示,在其只靠大脑挣钱吃饭的生涯中,这本着实令人晦涩难懂的书是一个了不起的突破。索罗斯一再声称,《点石成金》一书是他毕生心血的结晶,当所有一切看起来都无可救药的时候,思想就成了其生命中最重要的部分了。 索罗斯耗尽心血所构思的那些想法使得每一个人都大感困惑不解,实际上,他的主题思想...
[阅读全文] (字节数 : 21604)
评论:0 | 推荐:5 | 引用:0 | 点击:5 | 收藏
艾迪·塞柯塔 投资理论凝心血 [转贴 2008-02-14 10:00:42 ] 发表者: pckr
一:设计电脑交易程序 艾迪·塞柯塔在金融业内名头并不响亮,投资大众对他认识的不多,举例说,第一位出现在投机智慧栏的马加斯清清楚楚的说明,自己最初由失败的投机者摇身一变成为出色的职业炒家艾迪·塞柯塔的指点迷津功不可没,1970年初艾迪·塞柯塔在一间大型经纪行工作,自行设计及发展一套电脑买卖的程序系统,由于管理层的多番打扰,成绩为如理想,艾迪·塞柯塔对自己满怀信心决定自行创业,为自己炒卖,同时管理...
[阅读全文] (字节数 : 29011)
评论:0 | 推荐:5 | 引用:0 | 点击:1 | 收藏
投资任才吉姆·罗杰斯 [转贴 2008-02-14 09:59:11 ] 发表者: pckr
●学习历史和哲学吧,干什么都比进商学院好;当服务员,去远东旅行。 ●发现低买高卖的机会的办法,是寻找那些未被认识到的,或未被发现的概念或者变化。 ●每当中央银行在维护某种东西的低价位时,聪明的投资者就会反其道而行之。不管赌什么,永远跟中央银行相反。 ●供成就是价格,投资的铁律就是正确认识供来关系。 罗杰斯其人--亚拉巴马的土孩子 曾被报纸上称做“投资任才”的吉姆·罗杰斯...
[阅读全文] (字节数 : 12094)
评论:0 | 推荐:5 | 引用:0 | 点击:2 | 收藏
赖瑞·海特 获利无法预估 风险可以控制 [转贴 2008-02-14 09:58:14 ] 发表者: pckr
获利无法预估 风险可以控制 如果你不下注,就不会赢;如果你输得精光,就无法下注。因此,海特强调,光有一套交易方法并不足以致胜还必须有效控制风险,才能维持稳定的投资报酬率。 敕瑞·海特对金融市场感兴趣,是被大学时代的一门课所激发出来的。然而他步入华尔街的路途就像摩西前往以色列一样坎坷曲折。海特初入社会时,谁都无法想像这个年轻小伙子日后竟然会在金融市场上扬名立万。 ...
[阅读全文] (字节数 : 11425)
评论:0 | 推荐:5 | 引用:0 | 点击:1 | 收藏
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 > >>
神经网络入门
用平常语言介绍神经网络(Neural Networks in Plain English)
因为我们没有很好了解大脑,我们经常试图用最新的技术作为一种模型来解释它。在我童年的时候,我们都坚信大脑是一部电话交换机。(否则它还能是什么呢?)我当时还看到英国著名神经学家谢林顿把大脑的工作挺有趣地比作一部电报机。更早些时候,弗罗伊德经常把大脑比作一部水力发电机,而莱布尼茨则把它比作了一台磨粉机。我还听人说,古希腊人把大脑功能想象为一付弹弓。显然,目前要来比喻大脑的话,那只可能是一台数字电子计算机了。 -John R.Searle [注1]神经网络介绍(Introduction to Neural Networks)
曾有很长一个时期,人工神经网络对我来说是完全神秘的东西。当然,有关它们我在文献中已经读过了,我也能描述它们的结构和工作机理,但我始终没有能“啊哈!”一声,如同你头脑中一个难于理解的概念有幸突然得到理解时的感觉那样。我的头上好象一直有个榔头在敲着,或者像电影Animal House(中文片名为“动物屋”)中那个在痛苦地尖叫“先生,谢谢您,再给我一个啊!”的可怜家伙那样。我无法把数学概念转换成实际的应用。有时我甚至想把我读过的所有神经网络的书的作者都抓起来,把他们缚到一棵树上,大声地向他们吼叫:“不要再给我数学了,快给我一点实际东西吧!”。但无需说,这是永远不可能发生的事情。我不得不自己来填补这个空隙...由此我做了在那种条件下唯一可以做的事情。我开始干起来了。<一笑>
这样几个星期后,在一个美丽的日子里,当时我在苏格兰海边度假,当我越过一层薄雾凝视着狭长的海湾时,我的头脑突然受到一个冲击。一下子悟到了人工神经网络是怎样工作的。我得到“啊哈!”的感觉了!但我此时身边只有一个帐篷和一个睡袋,还有半盒子的脆玉米片,没有电脑可以让我迅速写出一些代码来证实我的直觉。Arghhhhh!这时我才想到我应该买一台手提电脑。不管怎样,几天后我回到家了,我立刻让我的手指在键盘上飞舞起来。几个小时后我的第一人工神经网络程序终于编成和运行了,并且工作得挺好!自然,代码写的有点乱,需要进行整理,但它确实已能工作了,并且,更重要的是,我还知道它为什么能工作!我可以告诉你,那天我是一位非常得意的人。
我希望本书传递给你的就是这种“啊哈!”感觉。当我们学完遗传算法时,你可能已尝到了一点感觉,但你希望这种感觉是美妙的话,那就要等把神经网络部分整个学完。
生物学的神经网络-大脑
(A Biological Neural Network–The Brain)
....你的大脑是一块灰色的、像奶冻一样的东西。它并不像电脑中的CPU那样,利用单个的处理单元来进行工作。如果你有一具新鲜地保存到福尔马林中的尸体,用一把锯子小心地将它的头骨锯开,搬掉头盖骨后,你就能看到熟悉的脑组织皱纹。大脑的外层象一个大核桃那样,全部都是起皱的[图0左],这一层组织就称皮层(Cortex)。如果你再小心地用手指把整个大脑从头颅中端出来,再去拿一把外科医生用的手术刀,将大脑切成片,那么你将看到大脑有两层[图0右]: 灰色的外层(这就是“灰质”一词的来源,但没有经过福尔马林固定的新鲜大脑实际是粉红色的。) 和白色的内层。灰色层只有几毫米厚,其中紧密地压缩着几十亿个被称作neuron(神经细胞、神经元)的微小细胞。白色层在皮层灰质的下面,占据了皮层的大部分空间,是由神经细胞相互之间的无数连接组成。皮层象核桃一样起皱,这可以把一个很大的表面区域塞进到一个较小的空间里。这与光滑的皮层相比能容纳更多的神经细胞。人的大脑大约含有1OG(即100亿)个这样的微小处理单元;一只蚂蚁的大脑大约也有250,OOO个。以下表l显示了人和几种动物的神经细胞的数目。
http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%2007.0a.jpghttp://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%2007.0b.jpg图0-1 大脑半球像核桃图0-2 大脑皮层由灰质和白质组成
图0大脑的外形和切片形状表l 人和几种动物的神经细胞的数目 动 物 神经细胞的数目(数量级) 蜗 牛 10,000 (=10^4) 蜜 蜂 100,000 (=10^5) 蜂 雀 10,000,000 (=10^7) 老 鼠 100,000,000 (=10^8) 人 类10,000,000,000 (=10^10) 大 象100,000,000,000 (=10^11)
http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%2007.1.jpg 图1神经细胞的结构
在人的生命的最初9个月内,这些细胞以每分钟25,000个的惊人速度被创建出来。神经细胞和人身上任何其他类型细胞十分不同,每个神经细胞都长着一根像电线一样的称为轴突(axon)的东西,它的长度有时伸展到几厘米[译注],用来将信号传递给其他的神经细胞。神经细胞的结构如图1所示。它由一个细胞体(soma)、一些树突(dendrite) 、和一根可以很长的轴突组成。神经细胞体是一颗星状球形物,里面有一个核(nucleus)。树突由细胞体向各个方向长出,本身可有分支,是用来接收信号的。轴突也有许多的分支。轴突通过分支的末梢(terminal)和其他神经细胞的树突相接触,形成所谓的突触(Synapse,图中未画出),一个神经细胞通过轴突和突触把产生的信号送到其他的神经细胞。每个神经细胞通过它的树突和大约10,000个其他的神经细胞相连。这就使得你的头脑中所有神经细胞之间连接总计可能有l,000,000,000,000,000个。这比100兆个现代电话交换机的连线数目还多。所以毫不奇怪为什么我们有时会产生头疼毛病!
有趣的事实
曾经有人估算过,如果将一个人的大脑中所有神经细胞的轴突和树突依次连接起来,并拉成一根直线,可从地球连到月亮,再从月亮返回地球。如果把地球上所有人脑的轴突和树突连接起来,则可以伸展到离开们最近的星系!神经细胞利用电-化学过程交换信号。输入信号来自另一些神经细胞。这些神经细胞的轴突末梢(也就是终端)和本神经细胞的树突相遇形成突触(synapse),信号就从树突上的突触进入本细胞。信号在大脑中实际怎样传输是一个相当复杂的过程,但就我们而言,重要的是把它看成和现代的计算机一样,利用一系列的0和1来进行操作。就是说,大脑的神经细胞也只有两种状态:兴奋(fire)和不兴奋(即抑制)。发射信号的强度不变,变化的仅仅是频率。神经细胞利用一种我们还不知道的方法,把所有从树突上突触进来的信号进行相加,如果全部信号的总和超过某个阀值,就会激发神经细胞进入兴奋(fire)状态,这时就会有一个电信号通过轴突发送出去给其他神经细胞。如果信号总和没有达到阀值,神经细胞就不会兴奋起来。这样的解释有点过分简单化,但已能满足我们的目的。
神经细胞利用电-化学过程交换信号。输入信号来自另一些神经细胞。这些神经细胞的轴突末梢(也就是终端)和本神经细胞的树突相遇形成突触(synapse),信号就从树突上的突触进入本细胞。信号在大脑中实际怎样传输是一个相当复杂的过程,但就我们而言,重要的是把它看成和现代的计算机一样,利用一系列的0和1来进行操作。就是说,大脑的神经细胞也只有两种状态:兴奋(fire)和不兴奋(即抑制)。发射信号的强度不变,变化的仅仅是频率。神经细胞利用一种我们还不知道的方法,把所有从树突上突触进来的信号进行相加,如果全部信号的总和超过某个阀值,就会激发神经细胞进入兴奋(fire)状态,这时就会有一个电信号通过轴突发送出去给其他神经细胞。如果信号总和没有达到阀值,神经细胞就不会兴奋起来。这样的解释有点过分简单化,但已能满足我们的目的。 正是由于数量巨大的连接,使得大脑具备难以置信的能力。尽管每一个神经细胞仅仅工作于大约100Hz的频率,但因各个神经细胞都以独立处理单元的形式并行工作着,使人类的大脑具有下面这些非常明显的特点:
能实现无监督的学习。 有关我们的大脑的难以置信的事实之一,就是它们能够自己进行学习,而不需要导师的监督教导。如果一个神经细胞在一段时间内受到高频率的刺激,则它和输入信号的神经细胞之间的连接强度就会按某种过程改变,使得该神经细胞下一次受到激励时更容易兴奋。这一机制是50多年以前由Donard Hebb在他写的Organination of Behavior一书中阐述的。他写道: “当神经细胞 A的一个轴突重复地或持久地激励另一个神经细胞B后,则其中的一个或同时两个神经细胞就会发生一种生长过程或新陈代谢式的变化,使得励 B细胞之一的A细胞,它的效能会增加” 与此相反的就是,如果一个神经细胞在一段时间内不受到激励,那么它的连接的有效性就会慢慢地衰减。这一现象就称可塑性(plasticity)。对损伤有冗余性(tolerance)。大脑即使有很大一部分受到了损伤,它仍然能够执行复杂的工作。一个著名的试验就是训练老鼠在一个迷宫中行走。然后,科学家们将其大脑一部分一部分地、越来越大地加以切除。他们发现,即使老鼠的很大的一部大脑被切除后,它们仍然能在迷宫中找到行走路径。这一事实证明了,在大脑中,知识并不是保存在一个局部地方。另外所作的一些试验则表明,如果大脑的一小部分受到损伤,则神经细胞能把损伤的连接重新生长出来。处理信息的效率极高。神经细胞之间电-化学信号的传递,与一台数字计算机中CPU的数据传输相比,速度是非常慢的,但因神经细胞采用了并行的工作方式,使得大脑能够同时处理大量的数据。例如,大脑视觉皮层在处理通过我们的视网膜输入的一幅图象信号时,大约只要100ms的时间就能完成。考虑到你的神经细胞的平均工作频率只有100Hz,100ms的时间就意味只能完成10个计算步骤!想一想通过我们眼睛的数据量有多大,你就可以看到这真是一个难以置信的伟大工程了。善于归纳推广。大脑和数字计算机不同,它极擅长的事情之一就是模式识别,并能根据已熟悉信息进行归纳推广(generlize)。例如,我们能够阅读他人所写的手稿上的文字,即使我们以前从来没见过他所写的东西。它是有意识的。意识(consciousness)是神经学家和人工智能的研究者广泛而又热烈地在辩论的一个话题。有关这一论题已有大量的文献出版了,但对于意识实际究竟是什么,至今尚未取得实质性的统一看法。我们甚至不能同意只有人类才有意识,或者包括动物王国中人类的近亲在内才有意识。一头猩猩有意识吗?你的猫有意识吗?上星期晚餐中被你吃掉的那条鱼有意识吗?因此,一个人工神经网络(Artificial neural network,简称ANN)就是要在当代数字计算机现有规模的约束下,来模拟这种大量的并行性,并在实现这一工作时,使它能显示许多和生物学大脑相类似的特性。下面就让我们瞧瞧它们的表演吧!
神经网络入门 (连载之二)
3 数字版的神经网络 (The Digital Version)上面我们看到了生物的大脑是由许多神经细胞组成,同样,模拟大脑的人工神经网络ANN是由许多叫做人工神经细胞(Artificial neuron,也称人工神经原,或人工神经元)的细小结构模块组成。人工神经细胞就像真实神经细胞的一个简化版,但采用了电子方式来模拟实现。一个人工神经网络中需要使用多少个数的人工神经细胞,差别可以非常大。有的神经网络只需要使用10个以内的人工神经细胞,而有的神经网络可能需要使用几千个人工神经细胞。这完全取决于这些人工神经网络准备实际用来做什么。
有趣的事实
有一个叫 Hugo de Garis的同行,曾在一个雄心勃勃的工程中创建并训练了一个包含1000,000,000个人工神经细胞的网络。这个人工神经网络被他非常巧妙地建立起来了,它采用蜂房式自动机结构,目的就是为一机器客户定制一个叫做CAM BrainMachine(“CAM大脑机器”) 的机器(CAM就是Cellular Automata Machine的缩写)。此人曾自夸地宣称这一人工网络机器将会有一只猫的智能。许多神经网络研究人员认为他是在“登星”了,但不幸的是,雇用他的公司在他的梦想尚未实现之前就破产了。此人现在犹他州,是犹他州大脑工程(Utah Brain Project)的领导。时间将会告诉我们他的思想最终是否能变成实际有意义的东西。[译注]
我想你现在可能很想知道,一个人工神经细胞究竟是一个什么样的东西?但是,它实际上什么东西也不像; 它只是一种抽象。还是让我们来察看一下图2吧,这是表示一个人工神经细胞的一种形式。
[译注]Hugo de Garis现在为犹他州立大学教授,有关他和他的CAM机器,可在该校网站的一个网页上看到报道,其上有真实的照片,见http://www.cs.usu.edu/~degaris
http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%207.2.jpg
图2 一个人工神经细胞 图中,左边几个灰底圆中所标字母w代表浮点数,称为权重(weight,或权值,权数)。进入人工神经细胞的每一个input(输入)都与一个权重w相联系,正是这些权重将决定神经网络的整体活跃性。你现在暂时可以设想所有这些权重都被设置到了-1和1之间的一个随机小数。因为权重可正可负,故能对与它关联的输入施加不同的影响,如果权重为正,就会有激发(excitory)作用,权重为负,则会有抑制(inhibitory)作用。当输入信号进入神经细胞时,它们的值将与它们对应的权重相乘,作为图中大圆的输入。大圆的‘核’是一个函数,叫激励函数(activation function),它把所有这些新的、经过权重调整后的输入全部加起来,形成单个的激励值(activation value)。激励值也是一浮点数,且同样可正可负。然后,再根据激励值来产生函数的输出也即神经细胞的输出:如果激励值超过某个阀值(作为例子我们假设阀值为1.0),就会产生一个值为1的信号输出;如果激励值小于阀值1.0,则输出一个0。这是人工神经细胞激励函数的一种最简单的类型。在这里,从激励值产生输出值是一个阶跃函数[译注]。看一看图3后你就能猜到为什么有这样的名称。
http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%207.3.jpg
图3 阶跃激励函数[译注] 由图可知阶跃函数是一元的,而激励函数既然能把多个输入相加应为多元,故需加以区别。
如果到目前为止你对这些还没有获得很多感觉,那也不必担心。窍门就是: 不要企图去感觉它,暂时就随波逐流地跟我一起向前走吧。在经历本章的若干处后,你最终就会开始弄清楚它们的意义。而现在,就放松一点继续读下去吧。
3.1 现在需要一些数学了(Now for Some Math)
今后讨论中,我将尽量把数学降低到绝对少量,但学习一些数学记号对下面还是很有用的。我将把数学一点一点地喂给你,在到达有关章节时向你介绍一些新概念。我希望采用这样的方式能使你的头脑能更舒适地吸收所有的概念,并使你在开发神经网络的每个阶段都能看到怎样把数学应用到工作中。现在首先让我们来看一看,怎样把我在此之前告诉你的所有知识用数学方式表达出来。
一个人工神经细胞(从现在开始,我将把“人工神经细胞”简称它为“神经细胞”) 可以有任意n个输入,n代表总数。可以用下面的数学表达式来代表所有n个输入:
x1, x2, x3, x4, x5, ..., xn
同样 n 个权重可表达为:
w1, w2, w3, w4, w5 ..., wn
请记住,激励值就是所有输入与它们对应权重的之乘积之总和,因此,现在就可以写为:
a = w1x1 + w2x2 + w3x3 + w4x4 + w5x5 +...+ wnxn
以这种方式写下的求和式,我在第5章“建立一个更好的遗传算法”中已提到,可以用希腊字母Σ来简化:http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/formula1.JPG注:
神经网络的各个输入,以及为各个神经细胞的权重设置,都可以看作一个n维的向量。你在许多技术文献中常常可以看到是以这样的方式来引用的。 下面我们来考察在程序中应该怎样实现?假设输入数组和权重数组均已初始化为x和w,则求和的代码如下:
double activation = 0;
for(int i=0; i<n; ++i)
{
activation += x * w;
}
图4以图形的方式表示了此方程。请别忘记,如果激励值超过了阀值,神经细胞就输出1; 如果激活小于阀值,则神经细胞的输出为0。这和一个生物神经细胞的兴奋和抑制是等价的。我们假设一个神经细胞有5个输入,他们的权重w都初始化成正负1之间的随机值(-1 < w < 1) 。 表2说明了激励值的求和计算过程。
http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%207.4.jpg
图4 神经细胞的激励函数 如果我们假定激活所需阀值=1,则因激励值1.1 > 激活阀值1,所以这个神经细胞将输出1。
在进一步读下去之前,请你一定要确切弄懂激励函数怎样计算。
表2神经细胞激励值的计算 输 入 权 重 输入*权重的乘积 运行后总和 1 0.5 0.5 0.5 0-0.2 0 0.51 -0.3 -0.3 0.2 1 0.9 0.9 1.1 00.1 0 1.1
3.2行,我知道什么是神经细胞了,但用它来干什么呢?
大脑里的生物神经细胞和其他的神经细胞是相互连接在一起的。为了创建一个人工神经网络,人工神经细胞也要以同样方式相互连接在一起。为此可以有许多不同的连接方式,其中最容易理解并且也是最广泛地使用的,就是如图5所示那样,把神经细胞一层一层地连结在一起。这一种类型的神经网络就叫前馈网络(feedforword network)。这一名称的由来,就是因为网络的每一层神经细胞的输出都向前馈送(feed)到了它们的下一层(在图中是画在它的上面的那一层),直到获得整个网络的输出为止。http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%2007.5.jpg
图5 一个前馈网络 由图可知,网络共有三层(译注:输入层不是神经细胞,神经细胞只有两层)。输入层中的每个输入都馈送到了隐藏层,作为该层每一个神经细胞的输入;然后,从隐藏层的每个神经细胞的输出都连到了它下一层(即输出层)的每一个神经细胞。图中仅仅画了一个隐藏层,作为前馈网络,一般地可以有任意多个隐藏层。但在对付你将处理的大多数问题时一层通常是足够的。事实上,有一些问题甚至根本不需要任何隐藏单元,你只要把那些输入直接连结到输出神经细胞就行了。另外,我为图5选择的神经细胞的个数也是完全任意的。每一层实际都可以有任何数目的神经细胞,这完全取决于要解决的问题的复杂性。但神经细胞数目愈多,网络的工作速度也就愈低,由于这一缘故,以及为了其他的几种原因(我将在第9章作出解释),网络的规模总是要求保持尽可能的小。
到此我能想象你或许已对所有这些信息感到有些茫然了。我认为,在这种情况下,我能做的最好的事情,就是向你介绍一个神经网络在现实世界中的实际应用例子,它有望使你自己的大脑神经细胞得到兴奋!不错吧?好的,下面就来了...
你可能已听到或读到过神经网络常常用来作模式识别。这是因为它们善于把一种输入状态(它所企图识别的模式)映射到一种输出状态(它曾被训练用来识别的模式)。
下面我们来看它是怎么完成的。我们以字符识别作为例子。设想有一个由8x8个格子组成的一块面板。每一个格子里放了一个小灯,每个小灯都可独立地被打开(格子变亮)或关闭(格子变黑),这样面板就可以用来显示十个数字符号。图6显示了数字“4”。
http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%207.6.jpg
图6用于字符显示的矩阵格点 要解决这一问题,我们必需设计一个神经网络,它接收面板的状态作为输入,然后输出一个1或0;输出1代表ANN确认已显示了数字“4”,而输出0表示没有显示“4”。因此,神经网络需要有64个输入(每一个输入代表面板的一个具体格点) 和由许多神经细胞组成的一个隐藏层,还有仅有一个神经细胞的输出层,隐藏层的所有输出都馈送到它。我真希望你能在你的头脑中画出这个图来,因为要我为你把所有这些小圆和连线统统画出来确实不是一桩愉快的事<一笑>。
一旦神经网络体系创建成功后,它必须接受训练来认出数字“4”。为此可用这样一种方法来完成:先把神经网的所有权重初始化为任意值。然后给它一系列的输入,在本例中,就是代表面板不同配置的输入。对每一种输入配置,我们检查它的输出是什么,并调整相应的权重。如果我们送给网络的输入模式不是“4”, 则我们知道网络应该输出一个0。因此每个非“4”字符时的网络权重应进行调节,使得它的输出趋向于0。当代表“4”的模式输送给网络时,则应把权重调整到使输出趋向于1。
如果你考虑一下这个网络,你就会知道要把输出增加到10是很容易的。然后通过训练,就可以使网络能识别0到9 的所有数字。但为什么我们到此停止呢?我们还可以进一步增加输出,使网络能识别字母表中的全部字符。这本质上就是手写体识别的工作原理。对每个字符,网络都需要接受许多训练,使它认识此文字的各种不同的版本。到最后,网络不单能认识已经训练的笔迹,还显示了它有显著的归纳和推广能力。也就是说,如果所写文字换了一种笔迹,它和训练集中所有字迹都略有不同,网络仍然有很大几率来认出它。正是这种归纳推广能力,使得神经网络已经成为能够用于无数应用的一种无价的工具,从人脸识别、医学诊断,直到跑马赛的预测,另外还有电脑游戏中的bot(作为游戏角色的机器人)的导航,或者硬件的robot(真正的机器人)的导航。
这种类型的训练称作有监督的学习(supervised learnig),用来训练的数据称为训练集(training set)。调整权重可以采用许多不同的方法。对本类问题最常用的方法就是反向传播(backpropagation,简称backprop或BP)方法。有关反向传播问题,我将会在本书的后面,当你已能训练神经网络来识别鼠标走势时,再来进行讨论。在本章剩余部分我将集中注意力来考察另外的一种训练方式,即根本不需要任何导师来监督的训练,或称无监督学习(unsupervised learnig)。
这样我已向你介绍了一些基本的知识,现在让我们来考察一些有趣的东西,并向你介绍第一个代码工程。
<神经网络入门> (连载之三)
4. 聪明的扫雷机工程(Smart Minesweeper Project) 我要向你介绍的第一个完整例子,是怎么使用神经网络来控制具有人工智能的扫雷机的行为。扫雷机工作在一个很简单的环境中,那里只有扫雷机以及随机散布的许多地雷。http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%207.7.jpg图7 运行中的演示程序。 尽管书上图形画成了黑白色,但当你运行程序时性能最好的扫雷机将显现为红色。地雷,你可能已经猜到,就是那些小方形。工程的目标是创建一个网络,它不需要从我们这里得到任何帮助,就能自己进行演化(evolve)去寻找地雷。为了实现这一功能,网络的权重将被编码到基因组中,并用一个遗传算法来演化它们。
怎么样,很酷吧?
提示(重要)
如果你跳过前面的一些章节来到这里,而你又不了解怎样使用遗传算法,则在进一步阅读下面的内容之前,你应回到前面去补读一下有关遗传算法的内容。
首先让我解释人工神经网络(ANN)的体系结构。我们需要决定输入的数目、输出的数目、还有隐藏层和每个隐藏层中隐藏单元的数目。4.1 选择输出(Choosing the Outputs)
那么,人工神经网络怎样控制扫雷机的行动呢?很好!我们把扫雷机想象成和坦克车一样,通过左右2个能转动的履带式轮轨(track)来行动的。见图案9.8。http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%207.8.jpg图8扫雷机的控制
扫雷机向前行进的速度,以及向左、向右转弯的角度,都是通过改变2个履带轮的相对速度来实现的。因此,神经网络需要2个输入,1个是左侧履带轮的速度,另一个是右侧履带轮的速度。
啊,但是...,我听见你在嘀咕了。如果网络只能输出一个1或一个0,我们怎么能控制车轨移动的快慢呢? 你是对的;如果利用以前描述的阶跃函数来决定输出,我们就根本无法控制扫雷机实际移动。幸好,我有一套戏法,让我卷起袖子来,把激励函数的输出由阶跃式改变成为在0-1之间连续变化的形式,这样就可以供扫雷机神经细胞使用了。为此,有几种函数都能做到这样,我们使用的是一个被称为逻辑斯蒂S形函数(logistic sigmoid function)[译注1]。该函数所实现的功能,本质上说,就是把神经细胞原有的阶跃式输出曲线钝化为一光滑曲线,后者绕y轴0.5处点对称[译注2],如图9所示。
[译注1] logistic有’计算的’或’符号逻辑的’等意思在内,和’逻辑的(logic)’意义不同。
[译注2] 点对称图形绕对称点转180度后能与原图重合。若f(x)以原点为点对称,则有f(-x)=-f(x)http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%207.9.jpg
图9 S形曲线。 当神经细胞的激励值趋于正、负无穷时,S形函数分别趋于1或0。负的激励值对应的函数值都<0.5; 正激励值对应的函数值都>0.5。S形函数用数学表达式写出来则为: http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/formula2.jpg 这个方程看上去可能会吓唬一些人,但其实很简单。e是数学常数,近似等于2.7183,a是神经细胞的激励值,它是函数的自变量,而p是一个用来控制曲线形状变化快慢或陡峭性的参数。p通常设定为1。当p赋以较大值时,曲线就显得平坦,反之,就会使曲线变为陡峭。见图1O。很低的p值所生成的函数就和阶跃函数近似。P值的大小用来控制何时使神经网络由低变高开始翻转有很大作用,但是在本例子中我们将它保持为1。
注:“S型”的英文原名Sigmoid 或Sigmoidal 原来是根据希腊字“Sigma”得来的,但非常巧它也可以说成是曲线的一种形状。 http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%207.10.jpg
图7。10不同的S形响应曲线。4.2 选择输入(Choosing the Inputs)
上面我们已经把输出安排好了,现在我们来考虑输入,确定网络需要什么样的输入?为此,我们必须想象一下扫雷机的具体细节:需要什么样的信息才能使它朝地雷前进?你可能想到的第一个输入信息清单是:[*]扫雷机的位置(x1,y1) [*]与扫雷机最靠近的地雷的位置(x2,y2) [*]代表扫雷机前进方向的向量(x3,y3) 这样一共得到6个输入。但是,要网络使用这些输入,工作起来就非常困难,因为,网络在像我们希望的那样执行工作之前,必须寻找所有6个输入之间的数学关系,而这有相当工作量。可以把此作为一个练习倒是很理想的:去试试如何给出最少数量的输入而仍能为网络传达解决问题所需要的全部信息。 你的网络使用的输入愈少,网络所要求的神经细胞数目也愈少。而较少的神经细胞就意味更快速的训练和更少的计算,有利于网络更高速度的工作。
只要作少量的额外考虑,就能够把输入的个数减少为4,这就是图11中所画出的两个向量的4个参数。
把神经网络的所有输入进行规范化是一种好想法。这里的意思并不是说每个输入都要改变大小使它们都在0~1间,而是说每一个输入应该受到同等重视。例如,拿我们已经讨论过的扫雷机输入为例。瞄准向量或视线向量(look-at vector)总是一个规范化向量,即长度等于1,分量x和y都在0~1间。但从扫雷机到达其最近地雷的向量就可能很大,其中的一个分量甚至有可能和窗体的宽度或高度一样大。如果这个数据以它的原始状态输入到网络,网络对有较大值的输入将显得更灵敏,由此就会使网络性能变差。因此,在信息输入到神经网络中去之前,数据应预先定比(scaled)和标准化(standardized),使它们大小相似(similar)。在本特例中,由扫雷机引到与其最接近地雷的向量需要进行规范化(normalized)。这样可以使扫雷机的性能得到改良。
http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%207.11.jpg
图11 选择输入。 小技巧:
有时,你把输入数据重新换算(rescale)一下,使它以0点为中心,就能从你的神经网络获得最好的性能。这一小窍门在你设计网络时永远值得一试。但我在扫雷机工程中没有采用这一方法,这是因为我想使用一种更直觉的方法。4.3 隐藏的神经细胞要多少?(How many Hidden Neurons?)
到此我们已把输入、输出神经细胞的数目和种类确定下来了,下一步是确定隐藏层的数目,并确定每个隐藏层中神经细胞必须有多少?但遗憾的是,还没有一种确切的规则可用来计算这些。它们的开发又需要凭个人的“感觉”了。某些书上和文章中确实给过一些提纲性的东西,告诉你如何去决定隐藏神经细胞个数,但业内专家们的一致看法是:你只能把任何建议当作不可全信的东西,主要还要靠自己的不断尝试和失败中获得经验。但你通常会发现,你所遇到的大多数问题都只要用一个隐藏层就能解决。所以,本领的高低就在于如何为这一隐藏层确定最合适的神经细胞数目了。显然,个数是愈少愈好,因为我前面已经提及,数目少的神经细胞能够造就快速的网络。通常,为了确定出一个最优总数,我总是在隐藏层中采用不同数目的神经细胞来进行试验。我在本章所编写的神经网络工程的.
第一版本中一使用了10个隐藏神经细胞(当然,我的这个数字也不一定是最好的<一笑>)。你应围绕这个数字的附近来做游戏,并观察隐藏层神经细胞的数目对扫雷机的演化会产生什么样的影响。不管怎样,理论已经够了,让我们拿一个具体程序来看看吧!你可以在本书所附光盘的Chapter7/Smart Sweepers v1.0文件夹中找到本章下面几页即将描述的所有程序的源码。
[ 本帖最后由 hefeiddd 于 2008-2-14 20:24 编辑 ]
神经网络入门 (连载之四)
http://blog.hexun.com/img/xiao.gif http://blog.hexun.com/img/da.gif4.4CNeuralNet.h(神经网络类的头文件)在CNeuralNet.h 文件中,我们定义了人工神经细胞的结构、定义了人工神经细胞的层的结构、以及人工神经网络本身的结构。首先我们来考察人工神经细胞的结构。 4.4.1SNeuron(神经细胞的结构)
这是很简单的结构。人工神经细胞的结构中必须有一个正整数来纪录它有多少个输入,还需要有一个向量std:vector来表示它的权重。请记住,神经细胞的每一个输入都要有一个对应的权重。
Struct SNeuron
{
// 进入神经细胞的输入个数
int m_NumInputs;
// 为每一输入提供的权重
vector<double> m_vecWeight;
//构造函数
SNeuron(int NumInputs);
};
以下就是SNeuron 结构体的构造函数形式:
SNeuron::SNeuron(int NumInputs): m_NumInputs(NumInputs+1)
(
// 我们要为偏移值也附加一个权重,因此输入数目上要 +1
for (int i=0; i<NumInputs+1; ++i)
{
// 把权重初始化为任意的值
m_vecWeight.push_back(RandomClamped());
}
}
由上可以看出,构造函数把送进神经细胞的输入数目NumInputs作为一个变元,并为每个输入创建一个随机的权重。所有权重值在-1和1之间。
这是什么? 我听见你在说。这里多出了一个权重! 不错,我很高兴看到你能注意到这一点,因为这一个附加的权重十分重要。但要解释它为什么在那里,我必须更多地介绍一些数学知识。回忆一下你就能记得,激励值是所有输入*权重的乘积的总和,而神经细胞的输出值取决于这个激励值是否超过某个阀值(t)。这可以用如下的方程来表示:
w1x1 + w2x2 + w3x3 +...+ wnxn >= t
上式是使细胞输出为1的条件。因为网络的所有权重需要不断演化(进化),如果阀值的数据也能一起演化,那将是非常重要的。要实现这一点不难,你使用一个简单的诡计就可以让阀值变成权重的形式。从上面的方程两边各减去t,得:
w1x1 + w2x2 + w3x3 +...+ wnxn –t >= 0
这个方程可以再换用一种形式写出来,如下:
w1x1 + w2x2 + w3x3 +...+ wnxn + t *(–1) >= 0
到此,我希望你已能看出,阀值t为什么可以想像成为始终乘以输入为 -1的权重了。这个特殊的权重通常叫偏移(bias),这就是为什么每个神经细胞初始化时都要增加一个权重的理由。现在,当你演化一个网络时,你就不必再考虑阀值问题,因为它已被内建在权重向量中了。怎么样,想法不错吧?为了让你心中绝对敲定你所学到的新的人工神经细胞是什么样子,请再参看一下图12。
http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%2007.12.jpg 图12 带偏移的人工神经细胞。4.4.2SNeuronLayer(神经细胞层的结构)
神经细胞层SNeuronLayer的结构很简单;它定义了一个如图13中所示的由虚线包围的神经细胞SNeuron所组成的层。
http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%2007.13.jpg 图13 一个神经细胞层。 以下就是层的定义的源代码,它应该不再需要任何进一步的解释:
struct SNeuronLayer
{
// 本层使用的神经细胞数目
int m_NumNeurons;
// 神经细胞的层
vector<SNeuron> m_vecNeurons;
SNeuronLayer(int NumNeurons, int NumInputsPerNeuron);
};
4.4.3CNeuralNet(神经网络类)
这是创建神经网络对象的类。让我们来通读一下这一个类的定义:
class CNeuralNet
{
private:
int m_NumInputs;
int m_NumOutputs;
int m_NumHiddenLayers;
int m_NeuronsPerHiddenLyr;
// 为每一层(包括输出层)存放所有神经细胞的存储器
vector<SNeuronLayer>m_vecLayers;
所有private成员由其名称容易得到理解。需要由本类定义的就是输入的个数、输出的个数、隐藏层的数目、以及每个隐藏层中神经细胞的个数等几个参数。
public:
CNeuralNet();
该构造函数利用ini文件来初始化所有的Private成员变量,然后再调用CreateNet来创建网络。
// 由SNeurons创建网络
void CreateNet();
我过一会儿马上就会告诉你这个函数的代码。
// 从神经网络得到(读出)权重
vector<double> GetWeights()const;
由于网络的权重需要演化,所以必须创建一个方法来返回所有的权重。这些权重在网络中是以实数型向量形式表示的,我们将把这些实数表示的权重编码到一个基因组中。当我开始谈论本工程的遗传算法时,我将为您确切说明权重如何进行编码。
// 返回网络的权重的总数
int GetNumberOfWeights()const;
// 用新的权重代替原有的权重
void PutWeights(vector<double> &weights);
这一函数所做的工作与函数GetWeights所做的正好相反。当遗传算法执行完一代时,新一代的权重必须重新插入神经网络。为我们完成这一任务的是PutWeight方法。
// S形响应曲线
inline double Sigmoid(double activation, double response);
当已知一个神经细胞的所有输入*重量的乘积之和时,这一方法将它送入到S形的激励函数。
// 根据一组输入,来计算输出
vector<double> Update(vector<double> &inputs);
对此Update函数函数我马上就会来进行注释的。
}; // 类定义结束
4.4.3.1CNeuralNet::CreateNet(创建神经网络的方法)
我在前面没有对CNeuralNet的2个方法加以注释,这是因为我要为你显示它们的更完整的代码。这2个方法的第一个是网络创建方法CreateNet。它的工作就是把由细胞层SNeuronLayers所收集的神经细胞SNeurons聚在一起来组成整个神经网络,代码为:
void CNeuralNet::CreateNet()
{
// 创建网络的各个层
if (m_NumHiddenLayers > 0)
{
//创建第一个隐藏层[译注]
m_vecLayers.push_back(SNeuronLayer(m_NeuronsPerHiddenLyr,
m_NumInputs));
for( int i=O; i<m_NumHiddenLayers-l; ++i)
{
m_vecLayers.push_back(SNeuronLayer(m_NeuronsPerHiddenLyr,
m_NeuronsPerHiddenLyr));
}
[译注]如果允许有多个隐藏层,则由接着for循环即能创建其余的隐藏层。
// 创建输出层
m_vecLayers.push_back(SNeuronLayer(m_NumOutput,m_NeuronsPerHiddenLyr));
}
else //无隐藏层时,只需创建输出层
{
// 创建输出层
m_vecLayers.push_back(SNeuronLayer(m_NumOutputs, m_NumInputs));
}
}
4.4.3.2CNeuralNet::Update(神经网络的更新方法)
Update函数(更新函数)称得上是神经网络的“主要劳动力”了。这里,输入网络的数据input是以双精度向量std::vector的数据格式传递进来的。Update函数通过对每个层的循环来处理输入*权重的相乘与求和,再以所得的和数作为激励值,通过S形函数来计算出每个神经细胞的输出,正如我们前面最后几页中所讨论的那样。Update函数返回的也是一个双精度向量std::vector,它对应的就是人工神经网络的所有输出。
请你自己花两分钟或差不多的时间来熟悉一下如下的Update函数的代码,这能使你正确理解我们继续要讲的其他内容:
vector<double> CNeuralNet::Update(vector<double> &inputs)
{
// 保存从每一层产生的输出
vector<double> outputs;
int cWeight = 0;
// 首先检查输入的个数是否正确
if (inputs.size() != m_NumInputs)
{
// 如果不正确,就返回一个空向量
return outputs;
}
// 对每一层,...
for (int i=0; i<m_NumHiddenLayers+1; ++i)
{
if (i>O)
{
inputs = outputs;
}
outputs.clear();
cWeight = 0;
// 对每个神经细胞,求输入*对应权重乘积之总和。并将总和抛给S形函数,以计算输出
for (int j=0; j<m_vecLayers.m_NumNeurons; ++j)
{
double netinput = 0;
int NumInputs = m_vecLayers.m_vecNeurons.m_NumInputs;
// 对每一个权重
for (int k=O; k<NumInputs-l; ++k)
{
// 计算权重*输入的乘积的总和。
netinput += m_vecLayers.m_vecNeurons.m_vecWeight *
inputs;
}
// 加入偏移值
netinput += m_vecLayers.m_vecNeurons.m_vecWeight *
CParams::dBias;
别忘记每个神经细胞的权重向量的最后一个权重实际是偏移值,这我们已经说明过了,我们总是将它设置成为 –1的。我已经在ini文件中包含了偏移值,你可以围绕它来做文章,考察它对你创建的网络的功能有什么影响。不过,这个值通常是不应该改变的。
// 每一层的输出,当我们产生了它们后,我们就要将它们保存起来。但用Σ累加在一起的
// 激励总值首先要通过S形函数的过滤,才能得到输出
outputs.push_back(Sigmoid(netinput,CParams::dActivationResponse)); cWeight = 0:
}
}
return outputs;
}
神经网络入门 (连载之五)
4.5 神经网络的编码(Encoding the Network)在本书的开始几章中,你已经看到过怎样用各种各样的方法为遗传算法编码。但当时我并没有向你介绍过
一个用实数编码的具体例子,因为我知道我要留在这里向你介绍。我曾经讲到,为了设计一个前馈型神经网络,
编码是很容易的。我们从左到右读每一层神经细胞的权重,读完第一个隐藏层,再向上读它的下一层,把所读
到的数据依次保存到一个向量中,这样就实现了网络的编码。因此,如果我们有图14所示的网络,则它的权重
编码向量将为:
0.3, -O.8, -O.2, 0.6, O.1, -0.l, 0.4, 0.5
在这一网络中,为了简单,我没有把偏移值的权重包括进去。但在实际实现编码时,你必须包含偏移值这
个权重,否则你肯定无法获得你所需要的结果。
http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%207.14.jpg
图14 为权重编码。 在此之前讲的事情你都懂了吗?好极了,那下面就让我们转来考虑,怎样用遗传算法来操纵已编码的基因吧。
4.6遗传算法(The Genetic Algorithm)
到此,所有的权重已经象二进制编码的基因组那样,形成了一个串,我们就可以象本书早先讨论过的那样
来应用遗传算法了。遗传算法(GA)是在扫雷机已被允许按照用户指定的帧数(为了某种缘故, 我下面更喜欢
将帧数称作滴答数,英文是ticks)运转后执行的。你可以在ini文件中找到这个滴答数(iNumTicks)的设置。
下面是基因组结构体的代码。这些对于你应该是十分面熟的东西了。
Struct SGenome
{
vector <double> vecWeights;
double dFitness;
SGenome():dFitness(0) {}
SGenome(vector <double> w, double f):vecWeights(w),dFitness(f){}
//重载'<'的排序方法
friend booloperator<(const SGenome& lhs, const SGenome& rhs)
{
return (lhs.dFitness < rhs.dFitness);
}
};
从上面的代码你可看出,这一SGenome结构和我们在本书所有其他地方见到的SGenome结构几乎完全一致,唯一的差别就是这里的染色体是一个双精度向量std::vector。因此,可以和通常一样来应用杂交操作和选择
操作。但突变操作则稍微有些不同,这里的权重值是用一个最大值为dMaxPerturbation的随机数来搔扰的。这一
参数dMaxPerturbation在ini文件中已作了声明。另外,作为浮点数遗传算法,突变率也被设定得更高些。在本工
程中,它被设成为0.1。
下面就是扫雷机工程遗传算法类中所见到的突变函数的形式:
void CGenAlg::Mutate(vector<double> &chromo)
{
// 遍历权重向量,按突变率将每一个权重进行突变
for (int i=0; i<chromo.size(); ++i)
{
// 我们要骚扰这个权重吗?
if (RandFloat() < m_dMutationRate)
{
// 为权重增加或减小一个小的数量
chromo += (RandomClamped() * CParams::dMaxPerturbatlon);
}
}
}
如同以前的工程那样,我已为v1.0版本的Smart Minesweepers工程保留了一个非常简单的遗传算法。这样
就能给你留下许多余地,可让你利用以前学到的技术来改进它。就象大多数别的工程一样,v1.O版只用轮盘赌
方式选精英,并采用单点式杂交。
注意:
当程序运行时,权重可以被演化成为任意的大小,它们不受任何形式的限制。
4.7扫雷机类(The CMinesweeper Class)
这一个类用来定义一个扫雷机。就象上一章描述的登月艇类一样,扫雷机类中有一个包含了扫雷机位置、
速度、以及如何转换方向等数据的纪录。类中还包含扫雷机的视线向量(look-at vector);它的2个分量被用
来作为神经网络的2个输入。这是一个规范化的向量,它是在每一帧中根据扫雷机本身的转动角度计算出来的,
它指示了扫雷机当前是朝着哪一个方向,如图11所示。
下面就是扫雷机类CMinesweeper的声明:
class CMinesweeper
{
private:
// 扫雷机的神经网络
CNeuralNet m_ItsBrain;
// 它在世界坐标里的位置
SVector2D m_vPosition;
// 扫雷机面对的方向
SVector2D m_vLookAt;
// 它的旋转(surprise surprise)
double m_dRotation;
double m_dSpeed;
// 根据ANN保存输出
double m_lTrack,
m_rTrack;
m_lTrack和m_rTrack根据网络保存当前帧的输出。
这些就是用来决定扫雷机的移动速率和转动角度的数值。
// 用于度量扫雷机适应性的分数
double m_dFitness;
每当扫雷机找到一个地雷,它的适应性分数就要增加。
// 扫雷机画出来时的大小比例
double m_dScale;
// 扫雷机最邻近地雷的下标位置
int m_iClosestMine;
在控制器类CControl1er中,有一个属于所有地雷的成员向量std::vector。
而m_iClosestMine就是代表最靠近扫雷机的那个地雷在该向量中的位置的下标。
public:
CMinesweeper();
// 利用从扫雷机环境得到的信息来更新人工神经网
bool Update(vector<SVector2D> &mines);
// 用来对扫雷机各个顶点进行变换,以便接着可以画它出来
voidWorldTransform(vector<SPoint> &sweeper);
// 返回一个向量到最邻近的地雷
5Vector2D GetClosestMine(vector<SVector2D> &objects);
// 检查扫雷机看它是否已经发现地雷
int CheckForMine(vector<SVector2D> &mines, double size);
void Reset();
// ----------------- 定义各种供访问用的函数
SVector2DPosition()const { return m_vPosition; }
void IncrementFitness(double val) { m_dFitness += val; }
double Fitness()const { return m_dFitness; }
void PutWeights(vector<double> &w) { m_ItsBrain.PutWeights(w); }
int GetNumberOfWeights()const
{ return m_ItsBrain.GetNumberOfWeights(); }
};
4.7.1 The CMinesweeper::Update Function(扫雷机更新函数)
需要更详细地向你说明的CMinesweeper类的方法只有一个,这就是Update更新函数。该函数在每一帧中
都要被调用,以更新扫雷机神经网络。让我们考察这函数的肚子里有些什么货色:
bool CMinesweeper::Update(vector<SVector2D> &mines)
{
//这一向量用来存放神经网络所有的输入
vector<double> inputs;
//计算从扫雷机到与其最接近的地雷(2个点)之间的向量
SVector2D vClosestMine = GetClosestMine(mines);
//将该向量规范化
Vec2DNormalize(vClosestMine);
首先,该函数计算了扫雷机到与其最靠近的地雷之间的向量,然后使它规范化。(记住,向量规范化后它
的长度等于1。)但扫雷机的视线向量(look-at vector)这时不需要再作规范化,因为它的长度已经等于1了。
由于两个向量都有效地化成了同样的大小范围,我们就可以认为输入已经是标准化了,这我前面已讲过了。
//加入扫雷机->最近地雷之间的向量
Inputs.push_back(vClosestMine.x);
Inputs.push_back(vCIosestMine.y);
//加入扫雷机的视线向量
Inputs.push_back(m_vLookAt.x);
Inputs.push_back(m_vLookAt.y);
//更新大脑,并从网络得到输出
vector<double> output = m_ItsBrain.Update(inputs);
然后把视线向量,以及扫雷机与它最接近的地雷之间的向量,都输入到神经网络。函数CNeuralNet::Update利
用这些信息来更新扫雷机网络,并返回一个std::vector向量作为输出。
//保证在输出的计算中没有发生错误
if (output.size() < CParams::iNumOutputs)
{
return false;
}
// 把输出赋值到扫雷机的左、右轮轨
m_lTrack = output;
m_rTrack = output;
在更新神经网络时,当检测到确实没有错误时,程序把输出赋给m_lTrack和m_rTrack。 这些值代表施加
到扫雷机左、右履带轮轨上的力。
// 计算驾驶的力
double RotForce = m_lTrack - m_rTrack;
// 进行左转或右转
Clamp(RotForce, -CParams::dMaxTurnRate, CParams::dMaxTurnRate);
m_dSpeed = (m_lTrack + m_rTrack);
扫雷机车的转动力是利用施加到它左、右轮轨上的力之差来计算的。并规定,施加到左轨道上的力减去施
加到右轨道上的力,就得到扫雷机车辆的转动力。然后就把此力施加给扫雷机车,使它实行不超过ini文件所规
定的最大转动率的转动。而扫雷机车的行进速度不过就是它的左侧轮轨速度与它的右侧轮轨速度的和。既然我
们知道了扫雷机的转动力和速度,它的位置和偏转角度也就都能更新了。
//更新扫雷机左右转向的角度
m_dRotation += RotForce;
// 更新视线角度
m_vLookAt.x = -sin(m_dRotation);
m_vLookAt.y = cos(m_dRotation);
// 更新它的位置
m_vPosition += (m_vLookAt* m_dSpeed);
// 如果扫雷机到达窗体四周,则让它实行环绕,使它不至于离开窗体而消失
If (m_vPosition.x > CParams::WindowWidth) m_vPosition.x = 0;
If (m_vPosition.x < 0) m_vPosition.x = CParams::WindowWidth;
If (m_vPosition.y > CParams::WindowHeight) m_vPosition.y = 0;
If (m_vPosition.y < D) m_vPosition.y = CParams::WindowHeight;
为了使事情尽可能简单,我已让扫雷机在碰到窗体边框时就环绕折回(wrap)。采用这种方法程序就不再需
要做任何碰撞-响应方面的工作。环绕一块空地打转对我们人来说是一桩非常不可思议的动作,但对扫雷机,这
就像池塘中的鸭子。
Returen true;
}
4.8CController Class(控制器类)
CController类是和一切都有联系的类。图15指出了其他的各个类和CController类的关系。
下面就是这个类的定义:
class CController
{
private:
// 基因组群体的动态存储器(一个向量)
vector<SGenome> m_vecThePopulation;http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%207.15.jpg
图15minesweeper工程的程序流程图
// 保存扫雷机的向量
vector<CMinesweeper>m_vecSweepers;
// 保存地雷的向量
vector<SVector2D> m_vecMines; // 指向遗传算法对象的指针
CGenAIg* m_pGA;
int m_NumSweepers;
int m_NumMines;
// 神经网络中使用的权重值的总数
int m_NumWeightsInNN;
// 存放扫雷机形状各顶点的缓冲区
vector<SPoint> m_SweeperVB;
// 存放地雷形状各顶点的缓冲区
vector<SPoint> m_MineVB;
// 存放每一代的平均适应性分数,供绘图用
vector<double> m_vecAvFitness;
// 存放每一代的最高适应性分
vector<double> m_vecBestFitness;
// 我们使用的各种不同类型的画笔
HPEN m_RedPen;
HPEN m_BluePen;
HPEN m_GreenPen;
HPEN m_OldPen;
// 应用程序窗口的句柄
HWND m_hwndMain;
// 切换扫雷机程序运行的速度
bool m_bFastRender;
// 每一代的帧数(滴答数)
int m_iTicks;
// 代的计数
int m_iGenerations;
// 窗体客户区的大小
int cxClient,cyClient;
// 本函数在运行过程中画出具有平均-,和最优适应性值的图
void PlotStats(HDC surface);
public:
CController(HWND hwndMain);
~CController();
void Render(HDC surface);
void WorldTransform(vector<SPoint> &VBuffer,
SVector2D vPos);
bool Update();
// 几个公用的访问方法
bool FastRender() { return m_bFastRender; }
void FastRender(bool arg){ m_bFastRender = arg; }
void FastRenderToggle() { m_bFastRender = !m_bFastRender; }
};
当创建CController类的某个实例时,会有一系列的事情发生:
创建CMinesweeper对象。
统计神经网络中所使用的权重的总数,然后此数字即被利用来初始化遗传算法类的一个实例。
从遗传算法对象中随机提取染色体(权重)并(利用细心的脑外科手术)插入到扫雷机的经网络中。
创建了大量的地雷并被随机地散播到各地。
为绘图函数创建了所有需要用到的GDI画笔。
为扫雷机和地雷的形状创建了顶点缓冲区。
所有的一切现都已完成初始化,由此Update方法就能在每一帧中被调用来对扫雷机进行演化。
4.8.1CController::Update Method(控制器的更新方法)
控制器更新方法CController::Update方法(或函数)在每一帧中都要被调用。当调用update函数时,函数
的前一半通过对所有扫雷机进行循环,如发现某一扫雷机找到了地雷,就update该扫雷机的适应性分数。由于m_vecThePopulation包含了所有基因组的拷贝,相关的适应性分数也要在这时进行调整。如果为完成一个代(generation)所需要的帧数均已通过,本方法就执行一个遗传算法的时代(epoch)来产生新一代的权重。这些
权重被用来代替扫雷机神经网络中原有的旧的权重,使扫雷机的每一个参数被重新设置,从而为进入新一generation做好准备。
bool CController::Update()
{
// 扫雷机运行总数为CParams::iNumTicks次的循环。在此循环周期中,扫雷机的神经网络
// 不断利用它周围特有的环境信息进行更新。而从神经网络得到的输出,使扫雷机实现所需的
// 动作。如果扫雷机遇见了一个地雷,则它的适应性将相应地被更新,且同样地更新了它对应
// 基因组的适应性。
if (m_iTicks++ < CParams::iNumTicks)
{
for (int i=O; i<m_NumSweepers; ++i)
{
//更新神经网络和位置
if (!m_vecSweepers.Update(m_vecMines))
{
//处理神经网络时出现了错误,显示错误后退出
MessageBox(m_hwndMain, 'Wrong amount of NN inputs!",
"Error", MB_OK);
return false;
}
// 检查这一扫雷机是否已经发现地雷
int GrabHit = m_vecSweepers.CheckForMine(m_vecMines,
CParams::dMineScale);
if (GrabHit >= 0)
{
// 扫雷机已找到了地雷,所以要增加它的适应性分数
m_vecSweepers.IncrementFitness();
// 去掉被扫雷机找到的地雷,用在随机位置放置的一个新地雷来代替
m_vecMines = SVector2D(RandFloat() * cxClient,
RandFloat() * cyClient);
}
// 更新基因组的适应性值
m-vecThePopulation.dFitness = m_vecSweepers.Fitness();
}
}
// 一个代已被完成了。
// 进入运行遗传算法并用新的神经网络更新扫雷机的时期
else
{
// 更新用在我们状态窗口中状态
m_vecAvFitness.push_back(m_pGA->AverageFitness());
m_vecBestFitness.push_back(m_pGA->BestFitness());
// 增加代计数器的值
++m_iGenerations;
// 将帧计数器复位
m_iTicks = 0;
// 运行GA创建一个新的群体
m-vecThePopulation = m_pGA->Epoch(m_vecThePopulation);
// 在各扫雷机中从新插入新的(有希望)被改进的大脑
// 并将它们的位置进行复位,等
for(int i=O; i<m_NumSweepers; ++i)
{m_vecSweepers.m_ItsBrain.PutWeights(m_vecThePopulation.vecWeights);
m_vecSweepers.Reset();
}
}
returen true;
}
概括起来,程序为每一世代做的工作是:
l.为所有扫雷机和为iNumTicks个帧组织循环,调用Update函数
并根据情况增加扫雷机适应值的得分。
2.从扫雷机神经网络提取权重向量。
3.用遗传算法去演化出一个新的网络权重群体。
4.把新的权重插入到扫雷机神经网络。
5.转到第1步进行重复,直到获得理想性能时为止。
最后,表3列出了Smart Sweepers工程 v1.0版所有缺省参数的设置值。
表3Smart Sweepers v1.0工程的缺省设置 神经网络参
数
设 置 值
输入数目
4
输出数目
2
隐藏层数目
1
隐藏层神经元数目
10
激励响应
1
遗 传 算 法参
数
设 置 值
群体大小
30
选择类型
旋转轮
杂交类型
单点
杂交率
0.7
突变率
0.1
精英设置(on/off)
On
精英数目(N/copies)
4/1
总 体 特 性参
数
设 置 值
每时代的帧数
2000
4.9运行此程序 (Running the Program)
当你运行程序时,“F”键用来切换2种不同的显示状态,一种是显示扫雷机怎样学习寻找地雷,一种是
示在运行期中产生的最优的与平均的适当性分数的统计图表。 当显示图表时,程序将会加速运行。
神经网络入门 (连载之六)
4.10功能的两个改进 (A Couple of Improvements)尽管扫雷机学习寻找地雷的本领十分不错,这里我仍有两件事情要告诉你,它们能进一步改进扫雷机的性能。
4.10.1 改进一(Improvement Number One)
首先,单点crossover算子留下了许多可改进的余地。按照它的规定,算子是沿着基因组长度任意地方切开的,这样常有可能使个别神经细胞的基因组在权重的中间被一刀两段地分开。 为清楚起见,我们来考察图16的权重。这是我们以前在说明基因组如何编码时看过的一个简单网络。 在这
里,杂交算子可以沿向量长度的任意一处切开,这样,就会有极大几率在某个神经细胞(如第二个)的权重中
间断开,也就是说,在权重0.6和-0.1之间某处切开。这可能不会是我们想要的,因为,如果我们把神经细胞作
为一个完整的单元来看待,则它在此以前所获得的任何改良就要被骚扰了。事实上,这样的杂交操作有可能非
常非常象断裂性突变(disruptive mutation)操作所起的作用。
http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%207.16.jpg 图16 简单的网络 与此针锋相对,我已创建了另一种类型的杂交运算,它只在神经细胞的边界上进行切开。在图16的例子中,
就是在第3、4或第6、7的两个基因之间切开,如小箭头所示。 为了实现这一算法,我已在CNeuralNet类中补
充了另一个切割方法: CalculateSplitPoints。这一方法创建了一个用于保存所有网络权重边界的矢量,它的代
码如下:
vector<int> CNeuralNet::CalculateSplitPoints() const
{
vector<int> SplitPoints;
int WeightCounter = 0;
// 对每一层
for (int i=O; i<m_NumHiddenLayers + 1; ++i)
{
// 对每一个神经细胞
for (int j=O; j<m_vecLayers.m_NumNeurons; ++j)
{
// 对每一个权重
for (int k=O; k<m_vecLayers.m_vecNeurons.m_NumInputs; ++k)
{
++WeightCounter;
}
SplitPoints.push_back(WeightCounter - 1);
}
}
return SplitPoints;
}
这一方法是CController类构造函数在创建扫雷机并把断裂点向量传递给遗传算法类时调用的。它们被存储
在一个名叫m_vecSplitPoints的std::vector向量中。然后遗传算法就利用这些断裂点来实现两点杂交操作,其代
码如下:
void CGenAlg::CrossoverAtSplits(const vector<double>&mum,
const vector<double>&dad,
vector<double> &babyl,
vector<double> &baby2)
{
// 如果超过了杂交率,就不再进行杂交,把2个上代作为2个子代输出
// 如果2个上辈相同,也把它们作为2个下辈输出
if ( (RandFloat() > m_dCrossoverRate) || (mum == dad))
{
baby1 = mum;
baby2 = dad;
return;
}
// 确定杂交的2个断裂点
int index1 = RandInt(0, m_vecSplitPoints.size()-2);
int index2 = RandInt(Index1, m_vecSplitPoints.size()-1);
int cp1 = m_vecSplitPoints;
int cp2 = m_vecSplitPoints;
// 创建子代
for (int i=0; i<mum.size(); ++i)
{
if ( (i<cp1) || (i>=cp2) )
{
// 如果在杂交点外,保持原来的基因
babyl.push_back(mum);
baby2.push_back(dad);
}
else
{
// 把中间段进行交换
baby1.push_back(dad);
baby2.push_back(mum);
}
}
return;
}
根据我的经验,我已发现,在进行杂交时,把神经细胞当作一个不可分割的单位,比在染色体长度上任意
一点分裂基因组,能得到更好的结果。
4.10.2 改进二(Improvement Number Two)
我想和你讨论的另一个性能改进,是用另一种方式来观察网络的那些输入。在你已看到的例子中,我们为
网络使用了4个输入参数: 2个用于表示扫雷机视线方向的向量,另外2个用来指示扫雷机与其最靠近的地雷的方
向的向量。然而,有一种办法,可以把这些参数的个数减少到只剩下一个。
其实你想一想就可知道,扫雷机为了确定地雷的位置,只要知道从它当前的位置和朝向出发,需要向左或
向右转动多大的一个角度这一简单的信息就够了(如果你已经考虑到了这一点,那我在这里要顺便向您道贺了)。
由于我们已经计算了扫雷机的视线向量和从它到最邻近地雷的向量,再来计算它们之间的角度(θ)应是一件极为
简单的事情 – 这就是这两个向量的点积,这我们在第6章“使登陆月球容易一点”中已讨论过。见图17。
http://p.blog.csdn.net/images/p_blog_csdn_net/zzwu/fig%207.17.jpg图17 计算到最邻近地雷的转动角度。 不幸的是,点积仅仅给出角度的大小; 它不能指示这一角度是在扫雷机的那一侧。因此,我已写了另一个向
量函数返回一个向量相对于另一个向量的正负号。该函数的原型如下所示:
inline int Vec2DSign(SVector2D &v1,SVector2D &v2);
如果你对它的机理感兴趣,你可以在文件SVector2D.h中找到它的源码。但它的基本点就是: 如果v1至v2是
按顺时针方向转的,则函数返回 +1;如果v1至v2是按逆时针方向转,则函数返回 -1。
把点积和Vec2Dsign二者联合起来,就能把输入的精华提纯出来,使网络只需接受一个输入就行了。下面
就是新的CMinesweeper::Update函数有关段落的代码形式:
// 计算到最邻近地雷的向量
SVector2D vClosestMine = GetClosestMine(mines);
// 将它规范化
Vec2DNormalize(vClosestMine);
// 计算扫雷机视线向量和它到最邻近地雷的向量的点积。它给出了我们要面对
// 最邻近地雷所需转动的角度
double dot = Vec2DDot(m_vLookAt, vClosestMine);
// 计算正负号
int sign = Vec2DSign(m_vLookAt, vClosestMine);
Inputs.push_back(dot*sign);
运行一下光盘Chapter7/Smart Sweepers v1.1目录下的可执行程序executable,你就知道经过以上2个改
进,能为演化过程提速多少。
需要注意的一桩重要事情是,带有4个输入的网络要花很长时间进行演化,因为它必须在各输入数据之间找
出更多的关系才能确定它应如何行动。事实上,网络实际就是在学习怎么做点积并确定它的正负极性。因此,当
你设计自己的网络时,你应仔细权衡一下,是由你自己预先来计算许多输入数据好呢(它将使CPU负担增加,但
导致进化时间加快)还是让网络来找输入数据之间的复杂关系好(它将使演化时间变长,但能使CPU减少紧张)?
5 结束语(last words)
我希望你已享受到了你第一次攻入神经网络这一奇妙世界的快乐。我打赌你一定在为如此简单就能使用它
们而感到惊讶吧,对吗?我想我是猜对了。
在下面几章里我将要向你介绍更多的知识,告诉你一些新的训练手段和演绎神经网络结构的更多的方法。
但首先请你利用本章下面的提示去玩一下游戏是有意义的。
6 练习题 (Stuff to Try)
1。 在v1.0中,不用look-at向量作为输入,而改用旋转角度θ作为输入,由此就可以使网络的输入个数减少
成为1个。请问这对神经网络的演化有什么影响?你对此的看法怎样?
2。 试以扫雷机的位置(x1,y1)、和扫雷机最接近的地雷的位置(x2,y2)、以及扫雷机前进方向的向量
(x3,y3)等6个参数作为输入,来设计一个神经网络,使它仍然能够演化去寻找地雷。
3。 改变激励函数的响应。试用O.1 - O.3 之间的低端值,它将产生和阶跃函数非常相像的一种激励函数。
然后再试用高端值,它将给出较为平坦的响应曲线。考察这些改变对演化进程具有什么影响?
4。 改变神经网络的适应性函数,使得扫雷机不是去扫除地雷,而是要演化它,使它能避开地雷。
5。 理一理清楚有关遗传算法的各种不同设置和运算中使你感到模糊的东西!
6。 加入其他的对象类型,比如人。给出一个新环境来演化扫雷机,使它能避开人,但照样能扫除地雷。
(这可能没有你想象那么容易!)
从“神经网络股票分析软件BioComp预测走势”谈到“让潜意识回答你的问题”
从我用过的人工智能股票分析软件BioComp谈起它不仅限于进行投资分析,还可用于工业领域,举个大家能理解的例子,比如通过历史数据来分析出水、电、煤气的未来使用量预测。可结合多种数据,比如天气、节假日、居民消费水平、电器销量、历史用电量数据等这些都会对用电量产生影响的因素进行分析,然后就可预测将来的用电量趋势变化。
这个软件我是花钱买的正版,还寄来了一个加密狗,不过我在30天之内又把它给退了。因为我主要用它来分析和预测股票走势的。但那时正好是股市低迷的时候,用下来感觉效果并不好。且这个软件很贵,所以赶快退了。
用人工智能中的神经网络、遗传算法、模式识别等来进行炒股等的软件有很多,国外还有些其他的此类产品。有的甚至还可用于预测下期彩票中奖号码范围,我觉得预测彩票这种随机的事件还是太玄了,因为理论上说随机事件的历史并不能预测将来,因为是随机的,所以历史与将来毫无关系。看到有许多彩民、彩经试图通过研究历史来预测将来的中奖号码,我只能说:I服了YOU。
我想:人工智能中的神经网络是让电脑来模拟生物的神经系统进行运算,我们人类,本身就有一个非常复杂的神经网络----大脑,为什么不能用人脑的神经网络来进行分析和预测呢?为此我自己进行了实践,我将所有内年内的股票数据以不同的颜色和深浅在电脑上全部画在一个画面里面,然后可向右滚动,这样我的眼睛就看到了许多股票一段时间内的历史数据,然后反复训练,自已进行买入卖出的训练,这样的话就等于是在训练自己的神经网络(注:用电脑中的人工智能神经网络软件的话,也是要事先进行许多训练才可达到较好的效果的,若不训练,就根本不能用)。其实我想:一个人反复看传统的股票走势图形也是在进行一种神经网络的训练,区别就是,传统的是一个屏幕看一个股票,而我用过的办法是一个屏幕看许多个(上百个)股票在一年或数月内的走势。
是否因为人的大脑平时杂念太多,潜意识太微弱且无法表达呢?所以需要静心,想到气功就是在静心的状态下才能创造奇迹。电脑的神经网络虽然不如人的强,但电脑够专一,没有杂念,不受外界干扰。人若能通过静心的手段达到没有杂念,如气功中的入静,那也就能发挥其强大潜力。所谓“宁静致远”是也。
谈到这里,我还想起,我曾用过神秘方法来调用自己的潜意识来预测和投资股票。不知你听说过这个方法没有,很简单,用一精细的绳子系一水晶或明净透明之物,在纸上画一圆,圆内画十字交叉,端坐,一手拿绳一头使之悬着,下方挂物自然摆动,以自己深深认同的方式自已定义一些摆动的回答方式,如:是、否、不知、不想告诉你等。诚心敬重的默念一些调动潜意识的话语,然后有耐心的一一问你所想要知道的问题,闭眼,潜意识会令你的手控制悬物自然摆动,待觉差不多时,睁眼,看摆动方式,便可知道冥冥之中潜意识给你的问题的回答。还是那句话心诚则灵。有些问题,我觉得这个方法非常灵,当然刚开始时问题也别设得太难,要留有余地,待觉得娴熟且很灵验时,再慢慢加大问题的难度。
我觉得这个办法不错,刚开始我也没用于股票,后来才想到用此法来炒股的。
我现在又想到一个此法的应用场景:在考试时,若正好有道选择题做不出来,且又有多余时间,不妨借此法来问问自己潜意识,或许你的潜意识知道正确答案喔。不过我没试过,不敢保证。
以上内容,只是本人的一些经历和闲话漫谈,仅供消遣,不作保证,切勿实践否则后果自负
再提醒一句:你要控制潜意识,别让潜意识控制你。
基于时间序列的股票趋势预测模型
1、示例说明股票趋势预测代表经济预测中的一种特定类型,它具有其独有的特点。因为实际操作中我们不需要准确地知道下一天的收盘价,只需知道被观测市场的走向(升或降),从而用来决定我们的交易操作(长期/短期-买入/卖出)。我们所希望的是利用历史价格数据预测将来中短期(从2到10或15天)内的价格走势。因而我们的神经网络也不需要预测下一个交易日的准确收盘价,我们从预测的趋势上去发现我们的交易策略。
换句话说,我们需要预测的是市场的拐点。请看下图:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_16.gif
这是一只股票的日K曲线,我们要成功进行股市操作就要根据红色箭头来交易,在最低点买进,在最高点卖出。一个好的交易系统应当只是真正的拐点出现时给出提示,避免生成虚假信号,例如,象篮色箭头所指部分,市场只下降了几个百分点就马上又继续上升。
可见,我们所要设计的神经网络不需要预测市场的日准确收盘价,我们只对正确预测拐点感兴趣。
2、神经网络建模
打开2ndn神经网络设计工具,在主界面中通过拖拉方式添加下图所示的图元,这样神经网络模型就建好了,2ndn会自动的随机设置连接的权系数。 当然这个网络目前还没有进行训练,没有任何实际的功能。
用户也可以直接打开随应用程序附带的示例程序,C:\Program Files\2NDN\Sample\FinancePre\FinancePre.ser(假如系统安装在C:\Program Files\2NDN),选择文件FinancePre.ser后,示例程序则在主界面中打开,如下图所示:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_1.gif
下面对设计器中的各图元说明如下:
① Yahoo输入 (Input Data)
用于神经网络从yahoo接收金融市场得来的金融数据,设置方法:鼠标选中该图元,右键弹出快捷菜单,点击<属性>,弹出下面的对话框:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_4.gif 其中“符号”是指特定股票的代号。如600728.SS是指新太科技股份有限600728的股票。这个代号必须是由Yahoo定义的代号。“时期”指从Yahoo获取股票市值的周期,‘Daily’获取每天收市记录的股票市值,‘Monthly’获取每月月初记录的股票市值,‘Yearly’获取每年年初记录的股票市值。
“选择列”可选:
第一列:Open
第二列:High
第三列:Low
第四列:Close
第五列:Volume
第六列:Adjusted close
对于特定的股票代码,你必须根据所需的列来设置"选择列"。如果你希望将open,high及volume列作为输入,则需将‘1-2,5’写到“选择列”。
其它设置参考2ndn帮助文档说明。
② 规范化 (DeltaNorm1)
在此对输入样本数据进行归一化处理,设置方法:鼠标选中该图元,右键弹出快捷菜单,点击<属性>,弹出下面的对话框:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_6.gif 说明:若输入最大/最小值设置为0,表示自动取相应节点的最大/最小值。
下图为经归一化处理后进行查验的结果:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_5.gif ③ Delay (Delay Input Layer)
这里,我们使用YahooFinance输入组件从Yahoo获取股票价格的时间序列,将其与一个延时层相连。设置方法:鼠标选中该图元,右键弹出快捷菜单,点击<属性>,弹出下面的对话框:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_7.gif 这个组件的属性面板中,除"行数"之外,还可以设置"taps值"参数,它是指我们用来提供给神经网络的时间窗口的大小。
如果设taps值为5,我们就得到一个尺寸为6的时间窗口,由下面的值组成:
请记住时间窗口的尺寸等于taps+1,因为延时层还同时输出时间序列的当前值x(t)。
选中该图元,鼠标右键弹出快捷菜单,选"查验":
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_8.gif ④ Sigmoid (Hidden Layer)
网络隐层, 设置方法:鼠标选中该图元,右键弹出快捷菜单,点击<属性>,弹出下面的对话框:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_9.gif ⑤ Sigmoid (Output Layer)
网络输出层,设置方法参见④。
⑥ 图表 (NetOutput)
这个组件用来在测试阶段显示出网络的预测结果曲线。设置方法:鼠标选中该图元,右键弹出快捷菜单,点击<属性>,弹出下面的对话框:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_3.gif 说明:X轴最大值要大于网络所使用的金融数据有天数。
⑦ 训练 (Teacher)
神经网络训练层,属性设置如下:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_10.gif ⑧ Yahoo输入 (Desired Data)
用于神经网络从yahoo接收金融市场得来的金融数据,用于生成训练网络的拐点信息。设置方法同" ① Yahoo输入 (Input Data) ",如下:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_11.gif 下图为经归一化处理后的结果:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_13.gif ⑨ 规范化 (DeltaNorm2)
在此对训练目标样本数据进行归一化处理,设置方法同"② 规范化 (DeltaNorm1)"。
⑩ 拐点抽取 (TurningPnts)
生成用来训练网络的拐点信息,属性设置如下:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_12.gif "最小改变率"属性用来指示两拐点之间的最小变化率,来生成相应的信号。它不能设置太小值,否则会生成太多的信号(其中很多都是错误信号)。
算法如下: [*]当市场价格上升超过期望的变化率时,前面一个低点就被标注为'买'信号,相应的输出值设为0。[*]当市场价格下降超过期望的变化率时,前面一个高点就被标注为'卖'信号,相应的输出值设为+1。[*]上述两点之间的日期对应的期望值以插值到0与+1的方式进行规范化。
⑾图表 (RMSE Error)
均方误差曲线,用来显示训练过程中的误差变化情况。设置方法:鼠标选中该图元,右键弹出快捷菜单,点击<属性>,弹出下面的对话框:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_15.gif 说明:X轴最大值要大于网络所使用的金融数据有天数。将"显示"设置为"True"时,将打开图表显示。
3、神经网络训练
我们使用2007-6-1到2007-8-1的数据训练网络:将两个yahoo输入插件的时间段都设为2007-6-1至2007-8-1。打开控制面板,设置学习率为0.3,动量常数为0.3,训练样本数为41(该值可通过查验样本得到),训练步数为1000次,均方误差为0.001,是否训练设置为True,是否验证设置为False,是否指导设置为True,预测学习数设置为6(该值为taps+1),是否均方误差设置为True。点击【运行】开始训练。控制面板上会显示训练的进度和收敛情况。如果权值参数选择不合理的话有可能造成网络不能收敛。这时可以选择【工具】->【初始化】,重新随机生成初始的权系数。
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_14.gif 4、神经网络测试
网络训练完成后,就可以对生成的网络模型进行测试了,我们使用2007-7-1到2007-9-1的数据作为测试数据,对该时间段内的股票价格拐点进行预测,测试时,将两个yahoo输入插件的时间段都设为2007-7-1到2007-9-1。打开控制面板,设置测试样本数(这里为42),训练步数为1次,是否训练设置为False,是否验证设置为True。点击【运行】开始测试,预测结果将自动在图表插件中显示出来。
下面是2007-7-1到2007-9-1的股票实际价格走势:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_17.gif
下图是神经网络根据历史数据作出的拐点预测曲线:
http://www.2nsoft.cn/2ndn/Examples/FinancePre/FinancePre_2.gif
可以看出,该网络模型能够将绝大部分的股票走势的拐点正确预测出来,效果非常理想。
5、高级应用(把完成训练的神经网络移植到第三方应用中)
为了在第三方应用程序中使用训练好的神经网络,可以把训练好的网络输出到文件中,然后在程序中读取这个文件,以实现对未知对象的预测。选择【文件】->【导出模型…】,把当前神经网络保存到文件中。然后就可以在程序中使用了。
下面是从文件中读取神经网络的代码:
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/2ndn/sample/FinancePre/FinancePre.snet"));
Object obj = ois.readObject();
System.out.println("obj is " + obj);
ois.close();
NeuralNet net = (NeuralNet) obj;
然后在程序中就可以使用了。
智能算法综述
智能算法综述摘要:随着计算机技术的飞速发展,智能计算方法的应用领域也越来越广泛,本文介绍了当前存在的一些智能计算方法,阐述了其工作原理和特点,同时对智能计算方法的发展进行了展望。
关键词:人工神经网络 遗传算法 模拟退火算法 群集智能 蚁群算法 粒子群算
1 什么是智能算法
智能计算也有人称之为“软计算”,是们受自然(生物界)规律的启迪,根据其原理,模仿求解问题的算法。从自然界得到启迪,模仿其结构进行发明创造,这就是仿生学。这是我们向自然界学习的一个方面。另一方面,我们还可以利用仿生原理进行设计(包括设计算法),这就是智能计算的思想。这方面的内容很多,如人工神经网络技术、遗传算法、模拟退火算法、模拟退火技术和群集智能技术等。
2 人工神经网络算法
“人工神经网络”(ARTIFICIAL NEURAL NETWORK,简称ANN)是在对人脑组织结构和运行机制的认识理解基础之上模拟其结构和智能行为的一种工程系统。早在本世纪40年代初期,心理学家McCulloch、数学家Pitts就提出了人工神经网络的第一个数学模型,从此开创了神经科学理论的研究时代。其后,F Rosenblatt、Widrow和J. J .Hopfield等学者又先后提出了感知模型,使得人工神经网络技术得以蓬勃发展。
神经系统的基本构造是神经元(神经细胞),它是处理人体内各部分之间相互信息传递的基本单元。据神经生物学家研究的结果表明,人的一个大脑一般有1010~1011个神经元。每个神经元都由一个细胞体,一个连接其他神经元的轴突和一些向外伸出的其它较短分支——树突组成。轴突的功能是将本神经元的输出信号(兴奋)传递给别的神经元。其末端的许多神经末梢使得兴奋可以同时传送给多个神经元。树突的功能是接受来自其它神经元的兴奋。神经元细胞体将接受到的所有信号进行简单处理(如:加权求和,即对所有的输入信号都加以考虑且对每个信号的重视程度——体现在权值上——有所不同)后由轴突输出。神经元的树突与另外的神经元的神经末梢相连的部分称为突触。
2.1 人工神经网络的特点
人工神经网络是由大量的神经元广泛互连而成的系统,它的这一结构特点决定着人工神经网络具有高速信息处理的能力。人脑的每个神经元大约有103~104个树突及相应的突触,一个人的大脑总计约形成1014~1015个突触。用神经网络的术语来说,即是人脑具有1014~1015个互相连接的存储潜力。虽然每个神经元的运算功能十分简单,且信号传输速率也较低(大约100次/秒),但由于各神经元之间的极度并行互连功能,最终使得一个普通人的大脑在约1秒内就能完成现行计算机至少需要数10亿次处理步骤才能完成的任务。
人工神经网络的知识存储容量很大。在神经网络中,知识与信息的存储表现为神经元之间分布式的物理联系。它分散地表示和存储于整个网络内的各神经元及其连线上。每个神经元及其连线只表示一部分信息,而不是一个完整具体概念。只有通过各神经元的分布式综合效果才能表达出特定的概念和知识。
由于人工神经网络中神经元个数众多以及整个网络存储信息容量的巨大,使得它具有很强的不确定性信息处理能力。即使输入信息不完全、不准确或模糊不清,神经网络仍然能够联想思维存在于记忆中的事物的完整图象。只要输入的模式接近于训练样本,系统就能给出正确的推理结论。
正是因为人工神经网络的结构特点和其信息存储的分布式特点,使得它相对于其它的判断识别系统,如:专家系统等,具有另一个显著的优点:健壮性。生物神经网络不会因为个别神经元的损失而失去对原有模式的记忆。最有力的证明是,当一个人的大脑因意外事故受轻微损伤之后,并不会失去原有事物的全部记忆。人工神经网络也有类似的情况。因某些原因,无论是网络的硬件实现还是软件实现中的某个或某些神经元失效,整个网络仍然能继续工作。
人工神经网络是一种非线性的处理单元。只有当神经元对所有的输入信号的综合处理结果超过某一门限值后才输出一个信号。因此神经网络是一种具有高度非线性的超大规模连续时间动力学系统。它突破了传统的以线性处理为基础的数字电子计算机的局限,标志着人们智能信息处理能力和模拟人脑智能行为能力的一大飞跃。
2.2 几种典型神经网络简介
2.2.1 多层感知网络(误差逆传播神经网络)
在1986年以Rumelhart和McCelland为首的科学家出版的《Parallel Distributed Processing》一书中,完整地提出了误差逆传播学习算法,并被广泛接受。多层感知网络是一种具有三层或三层以上的阶层型神经网络。典型的多层感知网络是三层、前馈的阶层网络,即:输入层I、隐含层(也称中间层)J和输出层K。相邻层之间的各神经元实现全连接,即下一层的每一个神经元与上一层的每个神经元都实现全连接,而且每层各神经元之间无连接。
但BP网并不是十分的完善,它存在以下一些主要缺陷:学习收敛速度太慢、网络的学习记忆具有不稳定性,即:当给一个训练好的网提供新的学习记忆模式时,将使已有的连接权值被打乱,导致已记忆的学习模式的信息的消失。?
2.2.2 竞争型(KOHONEN)神经网络
它是基于人的视网膜及大脑皮层对剌激的反应而引出的。神经生物学的研究结果表明:生物视网膜中,有许多特定的细胞,对特定的图形(输入模式)比较敏感,并使得大脑皮层中的特定细胞产生大的兴奋,而其相邻的神经细胞的兴奋程度被抑制。对于某一个输入模式,通过竞争在输出层中只激活一个相应的输出神经元。许多输入模式,在输出层中将激活许多个神经元,从而形成一个反映输入数据的“特征图形”。竞争型神经网络是一种以无教师方式进行网络训练的网络。它通过自身训练,自动对输入模式进行分类。竞争型神经网络及其学习规则与其它类型的神经网络和学习规则相比,有其自己的鲜明特点。在网络结构上,它既不象阶层型神经网络那样各层神经元之间只有单向连接,也不象全连接型网络那样在网络结构上没有明显的层次界限。它一般是由输入层(模拟视网膜神经元)和竞争层(模拟大脑皮层神经元,也叫输出层)构成的两层网络。两层之间的各神经元实现双向全连接,而且网络中没有隐含层。有时竞争层各神经元之间还存在横向连接。竞争型神经网络的基本思想是网络竞争层各神经元竞争对输入模式的响应机会,最后仅有一个神经元成为竞争的胜者,并且只将与获胜神经元有关的各连接权值进行修正,使之朝着更有利于它竞争的方向调整。神经网络工作时,对于某一输入模式,网络中与该模式最相近的学习输入模式相对应的竞争层神经元将有最大的输出值,即以竞争层获胜神经元来表示分类结果。这是通过竞争得以实现的,实际上也就是网络回忆联想的过程。
除了竞争的方法外,还有通过抑制手段获取胜利的方法,即网络竞争层各神经元抑制所有其它神经元对输入模式的响应机会,从而使自己“脱颖而出”,成为获胜神经元。除此之外还有一种称为侧抑制的方法,即每个神经元只抑制与自己邻近的神经元,而对远离自己的神经元不抑制。这种方法常常用于图象边缘处理,解决图象边缘的缺陷问题。
竞争型神经网络的缺点和不足:因为它仅以输出层中的单个神经元代表某一类模式。所以一旦输出层中的某个输出神经元损坏,则导致该神经元所代表的该模式信息全部丢失。
2.2.3 Hopfield神经网络
1986年美国物理学家J.J.Hopfield陆续发表几篇论文,提出了Hopfield神经网络。他利用非线性动力学系统理论中的能量函数方法研究反馈人工神经网络的稳定性,并利用此方法建立求解优化计算问题的系统方程式。基本的Hopfield神经网络是一个由非线性元件构成的全连接型单层反馈系统。
网络中的每一个神经元都将自己的输出通过连接权传送给所有其它神经元,同时又都接收所有其它神经元传递过来的信息。即:网络中的神经元t时刻的输出状态实际上间接地与自己的t-1时刻的输出状态有关。所以Hopfield神经网络是一个反馈型的网络。其状态变化可以用差分方程来表征。反馈型网络的一个重要特点就是它具有稳定状态。当网络达到稳定状态的时候,也就是它的能量函数达到最小的时候。这里的能量函数不是物理意义上的能量函数,而是在表达形式上与物理意义上的能量概念一致,表征网络状态的变化趋势,并可以依据Hopfield工作运行规则不断进行状态变化,最终能够达到的某个极小值的目标函数。网络收敛就是指能量函数达到极小值。如果把一个最优化问题的目标函数转换成网络的能量函数,把问题的变量对应于网络的状态,那么Hopfield神经网络就能够用于解决优化组合问题。
对于同样结构的网络,当网络参数(指连接权值和阀值)有所变化时,网络能量函数的极小点(称为网络的稳定平衡点)的个数和极小值的大小也将变化。因此,可以把所需记忆的模式设计成某个确定网络状态的一个稳定平衡点。若网络有M个平衡点,则可以记忆M个记忆模式。
当网络从与记忆模式较靠近的某个初始状态(相当于发生了某些变形或含有某些噪声的记忆模式,也即:只提供了某个模式的部分信息)出发后,网络按Hopfield工作运行规则进行状态更新,最后网络的状态将稳定在能量函数的极小点。这样就完成了由部分信息的联想过程。
Hopfield神经网络的能量函数是朝着梯度减小的方向变化,但它仍然存在一个问题,那就是一旦能量函数陷入到局部极小值,它将不能自动跳出局部极小点,到达全局最小点,因而无法求得网络最优解。 转
3 遗传算法
遗传算法(Genetic Algorithms)是基于生物进化理论的原理发展起来的一种广为应用的、高效的随机搜索与优化的方法。其主要特点是群体搜索策略和群体中个体之间的信息交换,搜索不依赖于梯度信息。它是在70年代初期由美国密执根(Michigan)大学的霍兰(Holland)教授发展起来的。1975年霍兰教授发表了第一本比较系统论述遗传算法的专著《自然系统与人工系统中的适应性》(《Adaptation in Natural and Artificial Systems》)。遗传算法最初被研究的出发点不是为专门解决最优化问题而设计的,它与进化策略、进化规划共同构成了进化算法的主要框架,都是为当时人工智能的发展服务的。迄今为止,遗传算法是进化算法中最广为人知的算法。
近几年来,遗传算法主要在复杂优化问题求解和工业工程领域应用方面,取得了一些令人信服的结果,所以引起了很多人的关注。在发展过程中,进化策略、进化规划和遗传算法之间差异越来越小。遗传算法成功的应用包括:作业调度与排序、可靠性设计、车辆路径选择与调度、成组技术、设备布置与分配、交通问题等等。
3.1 特点
遗传算法是解决搜索问题的一种通用算法,对于各种通用问题都可以使用。搜索算法的共同特征为: ① 首先组成一组候选解; ② 依据某些适应性条件测算这些候选解的适应度; ③ 根据适应度保留某些候选解,放弃其他候选解; ④ 对保留的候选解进行某些操作,生成新的候选解。在遗传算法中,上述几个特征以一种特殊的方式组合在一起:基于染色体群的并行搜索,带有猜测性质的选择操作、交换操作和突变操作。这种特殊的组合方式将遗传算法与其它搜索算法区别开来。
遗传算法还具有以下几方面的特点:
(1)遗传算法从问题解的串集开始嫂索,而不是从单个解开始。这是遗传算法与传统优化算法的极大区别。传统优化算法是从单个初始值迭代求最优解的;容易误入局部最优解。遗传算法从串集开始搜索,覆盖面大,利于全局择优。(2)许多传统搜索算法都是单点搜索算法,容易陷入局部的最优解。遗传算法同时处理群体中的多个个体,即对搜索空间中的多个解进行评估,减少了陷入局部最优解的风险,同时算法本身易于实现并行化。
(3)遗传算法基本上不用搜索空间的知识或其它辅助信息,而仅用适应度函数值来评估个体,在此基础上进行遗传操作。适应度函数不仅不受连续可微的约束,而且其定义域可以任意设定。这一特点使得遗传算法的应用范围大大扩展。
(4)遗传算法不是采用确定性规则,而是采用概率的变迁规则来指导他的搜索方向。
(5)具有自组织、自适应和自学习性。遗传算法利用进化过程获得的信息自行组织搜索时,硬度大的个体具有较高的生存概率,并获得更适应环境的基因结构。
3.2 运用领域
前面描述是简单的遗传算法模型,可以在这一基本型上加以改进,使其在科学和工程领域得到广泛应用。下面列举了一些遗传算法的应用领域: ① 优化:遗传算法可用于各种优化问题。既包括数量优化问题,也包括组合优化问题。 ② 程序设计:遗传算法可以用于某些特殊任务的计算机程序设计。 ③ 机器学习:遗传算法可用于许多机器学习的应用,包括分类问题和预测问题等。 ④ 经济学:应用遗传算法对经济创新的过程建立模型,可以研究投标的策略,还可以建立市场竞争的模型。 ⑤ 免疫系统:应用遗传算法可以对自然界中免疫系统的多个方面建立模型,研究个体的生命过程中的突变现象以及发掘进化过程中的基因资源。 ⑥ 进化现象和学习现象:遗传算法可以用来研究个体是如何学习生存技巧的,一个物种的进化对其他物种会产生何种影响等等。 ⑦ 社会经济问题:遗传算法可以用来研究社会系统中的各种演化现象,例如在一个多主体系统中,协作与交流是如何演化出来的。
4 模拟退火算法
模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。根据Metropolis准则,粒子在温度T时趋于平衡的概率为e-ΔE/(kT),其中E为温度T时的内能,ΔE为其改变量,k为Boltzmann常数。用固体退火模拟组合优化问题,将内能E模拟为目标函数值f ,温度T演化成控制参数t,即得到解组合优化问题的模拟退火算法:由初始解i和控制参数初值t开始,对当前解重复“产生新解→计算目标函数差→接受或舍弃”的迭代,并逐步衰减t值,算法终止时的当前解即为所得近似最优解,这是基于蒙特卡罗迭代求解法的一种启发式随机搜索过程。退火过程由冷却进度表(Cooling Schedule)控制,包括控制参数的初值t及其衰减因子Δt、每个t值时的迭代次数L和停止条件S。
5 群体(群集)智能(Swarm Intelligence)
受社会性昆虫行为的启发,计算机工作者通过对社会性昆虫的模拟产生了一系列对于传统问题的新的解决方法,这些研究就是群集智能的研究。群集智能(Swarm Intelligence)中的群体(Swarm)指的是“一组相互之间可以进行直接通信或者间接通信(通过改变局部环境)的主体,这组主体能够合作进行分布问题求解”。而所谓群集智能指的是“无智能的主体通过合作表现出智能行为的特性”。群集智能在没有集中控制并且不提供全局模型的前提下,为寻找复杂的分布式问题的解决方案提供了基础。
群集智能的特点和优点:群体中相互合作的个体是分布式的(Distributed),这样更能够适应当前网络环境下的工作状态; 没有中心的控制与数据,这样的系统更具有鲁棒性(Robust),不会由于某一个或者某几个个体的故障而影响整个问题的求解。可以不通过个体之间直接通信而是通过非直接通信(Stimergy)进行合作,这样的系统具有更好的可扩充性(Scalability)。由于系统中个体的增加而增加的系统的通信开销在这里十分小。系统中每个个体的能力十分简单,这样每个个体的执行时间比较短,并且实现也比较简单,具有简单性(Simplicity)。因为具有这些优点,虽说群集智能的研究还处于初级阶段,并且存在许多困难,但是可以预言群集智能的研究代表了以后计算机研究发展的一个重要方向。
在计算智能(Computational Intelligence)领域有两种基于群智能的算法,蚁群算法(Ant Colony Optimization)和粒子群算法(Particle Swarm Optimization),前者是对蚂蚁群落食物采集过程的模拟,已经成功运用在很多离散优化问题上。
5.1 蚁群优化算法
受蚂蚁觅食时的通信机制的启发,90年代Dorigo提出了蚁群优化算法(Ant Colony Optimization,ACO)来解决计算机算法学中经典的“货郎担问题”。如果有n个城市,需要对所有n个城市进行访问且只访问一次的最短距离。
在解决货郎担问题时,蚁群优化算法设计虚拟的“蚂蚁”将摸索不同路线,并留下会随时间逐渐消失的虚拟“信息素”。虚拟的“信息素”也会挥发,每只蚂蚁每次随机选择要走的路径,它们倾向于选择路径比较短的、信息素比较浓的路径。根据“信息素较浓的路线更近"的原则,即可选择出最佳路线。由于这个算法利用了正反馈机制,使得较短的路径能够有较大的机会得到选择,并且由于采用了概率算法,所以它能够不局限于局部最优解。
蚁群优化算法对于解决货郎担问题并不是目前最好的方法,但首先,它提出了一种解决货郎担问题的新思路;其次由于这种算法特有的解决方法,它已经被成功用于解决其他组合优化问题,例如图的着色(Graph Coloring)以及最短超串(Shortest Common Supersequence)等问题。
5.2 粒子群优化算法
粒子群优化算法(PSO)是一种进化计算技术(Evolutionary Computation),有Eberhart博士和Kennedy博士发明。源于对鸟群捕食的行为研究。
PSO同遗传算法类似,是一种基于叠代的优化工具。系统初始化为一组随机解,通过叠代搜寻最优值。但是并没有遗传算法用的交叉(crossover)以及变异(mutation)。而是粒子在解空间追随最优的粒子进行搜索。
同遗传算法比较,PSO的优势在于简单容易实现并且没有许多参数需要调整。目前已广泛应用于函数优化,神经网络训练,模糊系统控制以及其他遗传算法的应用领域。
粒子群优化算法(PSO) 也是起源对简单社会系统的模拟,最初设想是模拟鸟群觅食的过程,但后来发现PSO是一种很好的优化工具。
5.2.1 算法介绍
PSO模拟鸟群的捕食行为。一群鸟在随机搜索食物,在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻目前离食物最近的鸟的周围区域。
PSO从这种模型中得到启示并用于解决优化问题。PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitness value),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO初始化为一群随机粒子(随机解),然后通过叠代找到最优解,在每一次叠代中,粒子通过跟踪两个“极值”来更新自己。第一个就是粒子本身所找到的最优解,这个解叫做个体极值pBest,另一个极值是整个种群目前找到的最优解,这个极值是全局极值gBest。另外也可以不用整个种群而只是用其中一部分最优粒子的邻居,那么在所有邻居中的极值就是局部极值。
5.2.2 PSO算法过程
① 种群随机初始化。
② 对种群内的每一个个体计算适应值(fitness value)。适应值与最优解的距离直接有关。
③ 种群根据适应值进行复制 。
④ 如果终止条件满足的话,就停止,否则转步骤 ② 。
从以上步骤,我们可以看到PSO和遗传算法有很多共同之处。两者都随机初始化种群,而且都使用适应值来评价系统,而且都根据适应值来进行一定的随机搜索。两个系统都不是保证一定找到最优解。但是,PSO没有遗传操作如交叉(crossover)和变异(mutation),而是根据自己的速度来决定搜索。粒子还有一个重要的特点,就是有记忆。
与遗传算法比较,PSO的信息共享机制是很不同的。在遗传算法中,染色体(chromosomes) 互相共享信息,所以整个种群的移动是比较均匀的向最优区域移动。在PSO中, 只有gBest (or lBest) 给出信息给其他的粒子, 这是单向的信息流动。整个搜索更新过程是跟随当前最优解的过程。与遗传算法比较, 在大多数的情况下,所有的粒子可能更快的收敛于最优解。
现在已经有一些利用PSO代替反向传播算法来训练神经网络的论文。研究表明PSO 是一种很有潜力的神经网络算法,同时PSO速度比较快而且可以得到比较好的结果。
6 展望
目前的智能计算研究水平暂时还很难使“智能机器”真正具备人类的常识,但智能计算将在21世纪蓬勃发展。不仅仅只是功能模仿要持有信息机理一致的观点。即人工脑与生物脑将不只是功能模仿,而是具有相同的特性。这两者的结合将开辟一个全新的领域,开辟很多新的研究方向。智能计算将探索智能的新概念,新理论,新方法和新技术,而这一切将在以后的发展中取得重大成就。
参考文献
“Ant-Colony Optimization Algorithms(ACO)”,
http://leanair4.mit.edu/docushare/dscgi/ds.py/Get/File-378/RG_EE141_W8ACO.pdf
“Swarm intelligence-what is it and why is it interesting”
http://www.micro.caltech.edu/Courses/EE150/dungeon/Week1/OH_W1SwarmIntel.pdf
Tony White,“Swarm Intelligence: A Gentle Introduction With Application”,
http://www.sce.carleton.ca/netmanage/tony/swarm-presentation/index.htm
胡守仁等.神经网络导论.长沙:国防科技大学出版社,1993.113~117.
姚新,陈国良,徐惠敏等.进化算法研究进展.计算机学报,1995,18(9):694-706.
张晓,戴冠中,徐乃平.一种新的优化搜索算法—遗传算法.控制理论与应用.1995, 12(3):265-273.
杨志英.BP神经网络在水质评价中的应用.中国农村水利水电,2001,9:27-29.
人工智能学习资源
科大人工智能实验室网址:http://ailab.ai.ustc.edu.cn/
图象识别与人工智能研究所
网址:http://iprai.hust.edu.cn/
人工智能实验室
网址:http://www.aiport.net/
人工智能历史
网址:http://www.longen.org/A-D/detaila~d/AIHistory.htm
神经网络在线
网址:http://www.2nsoft.com/
人工神经网络首页
网址:http://www.youngfan.com/ann/index.htm
北邮模式识别与智能系统网站
网址:http://www.pris.edu.cn/
复杂系统与计算智能实验室
网址:http://202.38.78.168/
欧洲人工智能联合会ECCAI
说明:European Coordinating Committee for Artificial Intelligence
网址:http://www.eccai.org/
国际人工智能联合会IJCAI
说明:IJCAI is the International Joint Conference on Artificial Intelligence, the main international gathering of researchers in AI.
网址:http://www.ijcai.org/
美国人工智能联合会AAAI
说明:American Association for Artificial Intelligence (AAAI) devote to advancing the scientific understanding of the mechanisms underlying thought and intelligent behavior and their embodiment in machines.
网址:http://www.aaai.org/
智能算法学习
在工程实践中,经常会接触到一些比较“新颖”的算法或理论,比如模拟退火,遗传算法,禁忌搜索,神经网络等。这些算法或理论都有一些共同的特性(比如模拟自然过程),通称为“智能算法”。它们在解决一些复杂的工程问题时大有用武之地。这些算法都有什么含义?首先给出个局部搜索,模拟退火,遗传算法,禁忌搜索的形象比喻:为了找出地球上最高的山,一群有志气的兔子们开始想办法。1.兔子朝着比现在高的地方跳去。他们找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是局部搜索,它不能保证局部最优值就是全局最优值。2.兔子喝醉了。他随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,他渐渐清醒了并朝最高方向跳去。这就是模拟退火。3.兔子们吃了失忆药片,并被发射到太空,然后随机落到了地球上的某些地方。他们不知道自己的使命是什么。但是,如果你过几年就杀死一部分海拔低的兔子,多产的兔子们自己就会找到珠穆朗玛峰。这就是遗传算法。4.兔子们知道一个兔的力量是渺小的。他们互相转告着,哪里的山已经找过,并且找过的每一座山他们都留下一只兔子做记号。他们制定了下一步去哪里寻找的策略。这就是禁忌搜索。智能优化算法的概述智能优化算法要解决的一般是最优化问题。最优化问题可以分为(1)求解一个函数中,使得函数值最小的自变量取值的函数优化问题和(2)在一个解空间里面,寻找最优解,使目标函数值最小的组合优化问题。典型的组合优化问题有:旅行商问题(Traveling Salesman Problem,TSP),加工调度问题(Scheduling Problem),0-1背包问题(Knapsack Problem),以及装箱问题(Bin Packing Problem)等。优化算法有很多,经典算法包括:有线性规划,动态规划等;改进型局部搜索算法包括爬山法,最速下降法等,本文介绍的模拟退火、遗传算法以及禁忌搜索称作指导性搜索法。而神经网络,混沌搜索则属于系统动态演化方法。优化思想里面经常提到邻域函数,它的作用是指出如何由当前解得到一个(组)新解。其具体实现方式要根据具体问题分析来定。一般而言,局部搜索就是基于贪婪思想利用邻域函数进行搜索,若找到一个比现有值更优的解就弃前者而取后者。但是,它一般只可以得到“局部极小解”,就是说,可能这只兔子登“登泰山而小天下”,但是却没有找到珠穆朗玛峰。而模拟退火,遗传算法,禁忌搜索,神经网络等从不同的角度和策略实现了改进,取得较好的 “全局最小解”。模拟退火算法(Simulated Annealing,SA) 模拟退火算法的依据是固体物质退火过程和组合优化问题之间的相似性。物质在加热的时候,粒子间的布朗运动增强,到达一定强度后,固体物质转化为液态,这个时候再进行退火,粒子热运动减弱,并逐渐趋于有序,最后达到稳定。模拟退火的解不再像局部搜索那样最后的结果依赖初始点。它引入了一个接受概率p。如果新的点(设为pn)的目标函数f(pn)更好,则p=1,表示选取新点;否则,接受概率p是当前点(设为pc)的目标函数f(pc),新点的目标函数f(pn)以及另一个控制参数“温度”T的函数。也就是说,模拟退火没有像局部搜索那样每次都贪婪地寻找比现在好的点,目标函数差一点的点也有可能接受进来。随着算法的执行,系统温度T逐渐降低,最后终止于某个低温,在该温度下,系统不再接受变化。模拟退火的典型特征是除了接受目标函数的改进外,还接受一个衰减极限,当T较大时,接受较大的衰减,当T逐渐变小时,接受较小的衰减,当T为0时,就不再接受衰减。这一特征意味着模拟退火与局部搜索相反,它能避开局部极小,并且还保持了局部搜索的通用性和简单性。在物理上,先加热,让分子间互相碰撞,变成无序状态,内能加大,然后降温,最后的分子次序反而会更有序,内能比没有加热前更小。就像那只兔子,它喝醉后,对比较近的山峰视而不见,迷迷糊糊地跳一大圈子,反而更有可能找到珠峰。值得注意的是,当T为0时,模拟退火就成为局部搜索的一个特例。模拟退火的伪码表达:
procedure simulated annealingbegint:=0;initialize temperature Tselect a current string vc at random;evaluate vc;repeat repeat select a new string vn in the neighborhood of vc; (1) if f(vc)<F(VN) ; value if else <exp T) (2) vc:="vn;" (termination-condition) (3)T:="g(T,t);" (4)T:="t+1;" until (stop-criterion) (5)end;上面的程序中,关键的是(1)新状态产生函数,(2)新状态接受函数,(3)抽样稳定准则,(4)退温函数,(5)退火结束准则(简称三函数两准则)是直接影响优化结果的主要环节。虽然实验结果证明初始值对于最后的结果没有影响,但是初温越高,得到高质量解的概率越大。所以,应该尽量选取比较高的初温。上面关键环节的选取策略:(1)状态产生函数:候选解由当前解的邻域函数决定,可以取互换,插入,逆序等操作产生,然后根据概率分布方式选取新的解,概率可以取均匀分布、正态分布、高斯分布、柯西分布等。(2)状态接受函数:这个环节最关键,但是,实验表明,何种接受函数对于最后结果影响不大。所以,一般选取min 。(3)抽样稳定准则:一般常用的有:检验目标函数的均值是否稳定;连续若干步的目标值变化较小;规定一定的步数;(4)退温函数:如果要求温度必须按照一定的比率下降,SA算法可以采用 ,但是温度下降很慢;快速SA中,一般采用 。目前,经常用的是 , 是一个不断变化的值。(5)退火结束准则:一般有:设置终止温度;设置迭代次数;搜索到的最优值连续多次保持不变;检验系统熵是否稳定。为了保证有比较优的解,算法往往采取慢降温、多抽样、以及把“终止温度”设的比较低等方式,导致算法运行时间比较长,这也是模拟退火的最大缺点。人喝醉了酒办起事来都不利索,何况兔子?遗传算法(Genetic Algorithm, GA)“物竞天择,适者生存”,是进化论的基本思想。遗传算法就是模拟自然界想做的事。遗传算法可以很好地用于优化问题,若把它看作对自然过程高度理想化的模拟,更能显出它本身的优雅——虽然生存竞争是残酷的。遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。作为一种新的全局优化搜索算法,遗传算法以其简单通用、健壮性强、适于并行处理以及高效、实用等显著特点,在各个领域得到了广泛应用,取得了良好效果,并逐渐成为重要的智能算法之一。遗传算法的伪码:procedure genetic algorithmbegin group and evaluate fitness (1) while not convergent (2) begin select; (3) random<pc crossover; (4) random (0,1)best_to_far then {va is a string in the tabu list}begin cur:=va; let va take place of the oldest string in the tabu list; best_to_far:=va;end elsebegin cur:=vn; let vn take place of the oldest string in the tabu list;end; until (termination-condition);end;以上程序中有关键的几点:
(1)禁忌对象:可以选取当前的值(cur)作为禁忌对象放进tabu list,也可以把和当然值在同一“等高线”上的都放进tabu list。
(2)为了降低计算量,禁忌长度和禁忌表的集合不宜太大,但是禁忌长度太小容易循环搜索,禁忌表太小容易陷入“局部极优解”。
(3)上述程序段中对best_to_far的操作是直接赋值为最优的“解禁候选解”,但是有时候会出现没有大于best_to_far的,候选解也全部被禁的“死锁”状态,这个时候,就应该对候选解中最佳的进行解禁,以能够继续下去。
(4)终止准则:和模拟退火,遗传算法差不多,常用的有:给定一个迭代步数;设定与估计的最优解的距离小于某个范围时,就终止搜索;当与最优解的距离连续若干步保持不变时,终止搜索;禁忌搜索是对人类思维过程本身的一种模拟,它通过对一些局部最优解的禁忌(也可以说是记忆)达到接纳一部分较差解,从而跳出局部搜索的目的。 人工神经网络(Artificial Neural Network,ANN)神经网络从名字就知道是对人脑的模拟。它的神经元结构,它的构成与作用方式都是在模仿人脑,但是也仅仅是粗糙的模仿,远没有达到完美的地步。和冯·诺依曼机不同,神经网络计算非数字,非精确,高度并行,并且有自学习功能。生命科学中,神经细胞一般称作神经元,它是整个神经结构的最基本单位。每个神经细胞就像一条胳膊,其中像手掌的地方含有细胞核,称作细胞体,像手指的称作树突,是信息的输入通路,像手臂的称作轴突,是信息的输出通路;神经元之间错综复杂地连在一起,互相之间传递信号,而传递的信号可以导致神经元电位的变化,一旦电位高出一定值,就会引起神经元的激发,此神经元就会通过轴突传出电信号。而如果要用计算机模仿生物神经,就需要人工的神经网络有三个要素:
(1)形式定义人工神经元;
(2)给出人工神经元的连接方式,或者说给出网络结构;
(3)给出人工神经元之间信号强度的定义。
历史上第一个人工神经网络模型称作M-P模型,非常简单: 其中, 表示神经元i在t时刻的状态,为1表示激发态,为0表示抑制态; 是神经元i和j之间的连接强度; 表示神经元i的阈值,超过这个值神经元才能激发。这个模型是最简单的神经元模型。但是功能已经非常强大:此模型的发明人McCulloch和Pitts已经证明,不考虑速度和实现的复杂性,它可以完成当前数字计算机的任何工作。以上这个M-P模型仅仅是一层的网络,如果从对一个平面进行分割的方面来考虑的话,M-P网络只能把一个平面分成个半平面,却不能够选取特定的一部分。而解决的办法就是“多层前向网路”。 图2图2 是多层前向网络的示意图。最下面的称作输入层,最上面一层称作输出层,任何一个中间层都接受来自前一层的所有输入,加工后传入后一层。每一层的神经元之间没有联系,输入输出层之间也没有直接联系,并且仅仅是单向联系,没有反馈。这样的网络被称作“多层前向网络”。数据在输入后,经过每一层的加权,最后输出结果。 图3如图3,用可覆盖面来说明多层网络的功能:单层网络只能把平面分成两部分,双层网络就可以分割任意凸域,多层网络则可以分割任意区域。为了让这种网络有合适的权值,必须给网络一定的激励,让它自己学习,调整。一种方法称作“向后传播算法(Back Propagation,BP)”,其基本思想是考察最后输出解和理想解的差异,调整权值,并把这种调整从输出层开始向后推演,经过中间层,达到输入层。可见,神经网络是通过学习来达到解决问题的目的,学习没有改变单个神经元的结构和工作方式,单个神经元的特性和要解决的问题之间也没有直接联系,这里学习的作用是根据神经元之间激励与抑制的关系,改变它们的作用强度。学习样本中的任何样品的信息都包含在网络的每个权值之中。BP算法中有考察输出解和理想解差异的过程,假设差距为w,则调整权值的目的就是为了使得w最小化。这就又包含了前文所说的“最小值”问题。一般的BP算法采用的是局部搜索,比如最速下降法,牛顿法等,当然如果想要得到全局最优解,可以采用模拟退火,遗传算法等。当前向网络采用模拟退火算法作为学习方法的时候,一般成为“波尔兹曼网络”,属于随机性神经网络。在学习BP算法学习的过程中,需要已经有一部分确定的值作为理想输出,这就好像中学生在学习的时候,有老师的监督。如果没有了监督,人工神经网络该怎么学习?就像没有了宏观调控,自由的市场引入了竞争一样,有一种学习方法称作“无监督有竞争的学习”。在输入神经元i的若干个神经元之间开展竞争,竞争之后,只有一个神经元为1,其他均为0,而对于失败的神经元,调整使得向对竞争有利的方向移动,则最终也可能在一次竞争中胜利;人工神经网络还有反馈网络如Hopfield网络,它的神经元的信号传递方向是双向的,并且引入一个能量函数,通过神经元之间不断地相互影响,能量函数值不断下降,最后能给出一个能量比较低的解。这个思想和模拟退火差不多。人工神经网络应用到算法上时,其正确率和速度与软件的实现联系不大,关键的是它自身的不断学习。这种思想已经和冯·诺依曼模型很不一样。总结模拟退火,遗传算法,禁忌搜索,神经网络在解决全局最优解的问题上有着独到的优点,并且,它们有一个共同的特点:都是模拟了自然过程。模拟退火思路源于物理学中固体物质的退火过程,遗传算法借鉴了自然界优胜劣汰的进化思想,禁忌搜索模拟了人类有记忆过程的智力过程,神经网络更是直接模拟了人脑。它们之间的联系也非常紧密,比如模拟退火和遗传算法为神经网络提供更优良的学习算法提供了思路。把它们有机地综合在一起,取长补短,性能将更加优良。这几种智能算法有别于一般的按照图灵机进行精确计算的程序,尤其是人工神经网络,是对计算机模型的一种新的诠释,跳出了冯·诺依曼机的圈子,按照这种思想来设计的计算机有着广阔的发展前景。