人工神经网络算法应用

同样是廖貅武教授的软计算方法课程作业。两个小作业之一。考虑到上一个遗传算法的作业做得实在太没有含量了,我决定把这个人工神经网络做得原创性高一点。
于是,OK,我就原创一个题目吧。
问题:
    给定一个超越函数在某些采样点的取值,使用人工神经网络模拟出这个超越函数。以Matlab自带的函数peaks()为例。peaks()在[0,30]的图像如下:

数据:
    产生一个数组r,结构为3*300,内容为从peaks()上随机采样的300个点的x,y,z坐标。我将把x,y坐标作为输入变量,z坐标作为输出变量构建一个BP人工神经网络。结构如下:
 
工具:
    Matlab 6.5+神经网络工具箱。
    这里出现了我遇到的最大教训。教训是:装软件一定要装完整版。我开始写了个ANN的程序,结果发现运行不了,提示函数未知。我以为要加载个什么工具包,于是在整个网络上搜,搜了两小时也没搜出来,似乎所有人都直接用了,根本不存在什么加载或调用的问题。然后,我才认识到我的matlab是个不完整版,没有NN工具包……我愤而下载了一个Matlab7,决意把这可恶的6.5彻底抛弃。然后……花了一小时下载的M7居然不能装!原因未知!我只好又花了半小时下了一个matlab6.5的完整版,这才把问题解决。
细节不再赘述,直接上程序。
 
train.m:训练函数
load r.mat;
[P,minp,maxp,T,mint,maxt]=premnmx(r(1:2,:),r(3,:));
 
%建立网络
S=6; %隐含神经元数
L=1; %输出神经元数
net=newff([minp,maxp],[S,L],{‘logsig’,’tansig’,’purelin’},’traincgb’,’learngdm’);
 
%初始化
net=init(net);
 
%网络训练
net.trainParam.show=20;%设置训练显示间隔次数
net.trainParam.epochs=600;%设置最大训练循环次数
net.trainParam.goal=0.0001;%设置性能目标值
net.trainParam.lr=0.1;%设置学习系数
[net,tr]=train(net,P,T);%网络训练
 
test.m:测试函数
te=[0 0];
for i=0:30;
for j=0:30;
tt=[i j];
te=[te;tt];
end;
end;
fi=sim(net,te’);
aa=zeros(30,30);
s=1;
for i=1:31;
for j=1:31;
aa(i,j)=fi(s);
s=s+1;
end;
end;
mesh(aa);
 
运算结果:
 
训练效果

绘制出神经网络所模拟的函数图像:

 
    经过多次计算,发现每次计算绘出的函数图样差异较大,同时与peaks函数本身也有较大的差异。
    运用人工神经网络算法对此超越函数的模拟效果较差,可能是由于多个原因。首先,对函数值的随机采样可能没有体现函数的全部特征;其次,神经网络结构较为简单,可能难以模拟一个如此复杂的函数;第三,输入变量较少,可能不适合使用神经网络进行计算。
 
=====================郁闷的分割线======================
就这样,我发现人工神经网络根本模拟不出这个复杂的peaks函数……可能是这神经网络的智商太低,也可能是我的智商问题……不过,反正是交作业,这也无所谓。

马王草莓记

二零零九年四月十九日,余与angie共游于西安西郊之马王,享春游之美,品草莓之鲜。
是日午间,余二人乘302路公交,自太乙路北上,过钟楼,穿城郭,一路而西,经斗门,终抵马王。
问路于当地人,曰:”好几公里哩。坐那个蹦蹦吧,一个人两块钱。”angie以为然,遂乘蹦蹦西行,途中坎坷颇多,蹦之不迭。至田间,乃止,曰:”就这儿了,到处都是。”余观之,见数十列草莓大棚散布于麦田之间,棚间有人往来。其时天高云淡,日光漫洒,棚中红点隐约可见,顿觉心中大快。
余二人行之棚前,问之价,曰:”直接买五块钱一斤,要自个儿采就是八块。” 其时城中草莓,佳者不过六七元之价,八元则闻所未闻。余二人面面相觑,余又问曰:”那采的时候能吃不?”答曰:”你吃呗!能吃多少。”余思之须臾,欲寻他家。
然余二人问之各处,皆曰:”八块钱。”angie遂曰:”这几家人多得很,估计好草莓都给采光了。咱找家人少的,采的质量能好点。”遍寻四处,终觅得一家。此处主人本不开放采摘,见余等寻来,竟起小利之心,以八元之价放余二人入棚。余二人本欲自行采摘,那主人却摘之不停,须臾间采了半筐,而余等尚未尽兴,悻悻而出。余揶揄之曰:”人家都是自个儿采八块钱,这半筐里有一大半是你采的,我们还玩的什么啊。”主人嗫嚅数句,终允之七元。
出之田间,乘蹦蹦折返回车站。见铁轨,遂拍照十数张,效果上佳。乘公交而返,途中食草莓甚多。草莓皆未洗也。
以为记。

博客故障记

那事情是前天发生的。我从没想到那么一个小小的失误,居然会造成这么严重的后果。
事件发生的具体时间是2009年4月25日14点34分50秒。有文件创建时间为证。那时我正在试验各种显示最新评论的插件,先尝试了recent-comments,然而这玩意儿在我博客首页上显示MySQL语法错误。于是我又下载了get-recent-comments打算试试看。
安装get-recent-comments的时候我偷了个懒,没有把Zip文件解压后通过ftp上传,而是直接用Wordpress的安装插件功能直接通过页面上传的方式安装了这个插件。
然后,一切都完蛋了。
当我刷新博客页面的时候,我觉得好笑。怎么每个页面的上方都出现了一大堆代码?我细细地读,发现是一个Changelog,是get-recent-comments这个插件的更新记录。无论是博客主页还是文章页面,甚至管理页面都是如此,在博客正文的最前面,长达两屏的Changelog密密麻麻地排满了屏幕,仿佛我家房顶上厚厚地盖了一层两米高的恶心的蝗虫尸体。
于是我就把这个插件禁用了。
无效。
我通过ftp把插件目录删了。
无效。
我崩溃了。我向那几个管理服务器的家伙求助,可他们都不在线。这时angie扯着我出去逛街,我一边走路一边心乱如麻。我试着登录Wap版,发现手机屏幕上也是那些恶心的蝗虫尸体。
逛街回来之后我向管理员要了远程桌面密码,可是家里的网通线路根本连不上远程桌面;我通过QQ的远程协助连到angie的电脑,然后从angie那里连接服务器的远程桌面,然后……发现管理员给的密码是错的。我心中大骂猪77,可那家伙又不在线了。我一行一行地研究模板代码,想搞明白什么原因能导致这种诡异的事件,居然页面与后台通杀!折腾一晚,无果。我只好写了一个”博客故障,抱歉”的文档,命名为index.html,扔到服务器根目录下,这样别人就不会看到那些恶心的蝗虫尸体,而只是这行字了。
我似乎从未觉得周末如此漫长,一心等着周一到学校去彻底解决问题。期间收到ephe的回复说我页面上方changelog的问题……心中更加纠结。
今天下午我终于来到工作室,要到了正确的远程桌面密码,连接远程桌面,在整个博客目录里搜索内文有”ChangeLog”的所有文件。然后,我在/wp-content/plugins/目录下发现了那个changelog.html。这里还有get-recent-comments的其他文件。
……
我把它们都删了。
打开博客主页的时候,我开心地发现蝗虫尸体一扫而光。我转到后台的插件管理,它告诉我changelog.html插件已被禁用,因为文件目录不存在。
原来如此!自动安装功能把这个插件直接安装到了plugins目录,于是wordpress就把changelog.html当作了一个插件。于是这个混账插件在所有页面都显示为页面最上方的一堆死蝗虫。
结论或教训:
1.安插件的时候要小心。
2.远程桌面是无敌的,ftp是白痴的。

如何让WordPress的不同页面显示不同侧边栏

昨天折腾了一天,只因为我不希望所有的页面都显示相同的sidebar。网上给出的方法很多,让我深感荣幸的是,我几乎把所有可能的方法都试了一次,除了最后一种之外全部失败了。我觉得我应该谢谢我使用的这个主题OpenAir……它让我大大加深了对Wordpress的了解。可它怎么就特殊到这种地步,什么法子都不顶用呢?
在此总结一下让Wordpress的不同页面显示不同侧边栏的各种方法。如果你挨个儿试到最后一种还是无效,那么恭喜你,你的模板比OpenAir还倔。
 
(1) 简单有效的Widget插件:widget-logic
这个插件给每个widget 一个扩展控制Widget logic,你可以通过它根据不同页面自定义你的侧边栏内容。
最新版本支持2.5以上,在你使用Wordpress自带的Widget功能时有效。
最新版本下载:http://wordpress.org/extend/plugins/widget-logic/
安装:
上传 widget-logic.php 到 /wp-content/plugins/ ,而后在控制面板激活。这时你会发现,在你已使用的Widget选项下面会多出一个widget logic的框框。里面要填的是”在什么情况下显示该Widget”的判断条件。

示例语言:
is_home() 仅主页显示
!is_category(5) 仅在ID非5的分类显示
is_home() || is_category(‘baked-goods’) 在主页或名称为baked-goods的分类显示
is_page(‘about’) 仅在关于页显示
 
||表示或,&&表示和,!表示非。
更多条件语句可参考
http://codex.wordpress.org/Conditional_Tags
 
(2) 彪悍无敌的Widget管理组件:SBM
Widget-logic只是个小东西,它以最小的代价做到了widget的分页面显示。然而SBM则是完全不同的东西,它认为Wordpress自带的Widget功能太弱了,所以有必要干掉它,然后再启用一个新的侧边栏模块。所以它的名字才叫做Side Bar Module,或者叫做”傻逼妹”。
以下为引用汉化者提供的介绍:
傻逼妹侧边栏插件是迄今为止我见过的最好的侧边栏插件,它除了拥有widget的全部功能以外,还支持php、txt、html模块,且这些模块可以无限制的添加。
它可以让某些模板在特定页面、文章页显示或者隐藏。
基本上,只要支持widget的主题都支持sbm,参见widget的帮助信息修改模板即可。
此处不再赘述,给出作者链接:
http://dupola.com/post/65
我承认这显然是个很好用的东东,但当我运行SBM1/2,即它的两个组件中的第一个,用于禁用Wordpress的Widget功能后,我的Wordpress白了。
白了,就是什么都没有。
我懵了。连管理界面都进不去,怎么办……
好在作者给出了解决办法:把服务器上SBM插件目录的名称改掉,SBM就会自动被禁用。于是我的Widget回来了。
太劲爆了……不敢试了。
 
(3) Sidebar.php是可以自己写的
我承认这是一种广泛使用的方法。但当我打开我的sidebar.php文件时,我囧了。
它居然只有4行。网上看来的方法都说在某个widget的代码前面加一句类似”is_home()”的页面判断语句,然而我的sidebar根本没地方写!
看来版本新还是有坏处的……针对旧版本的方法在新版本里根本无效。
 
(4) WordPress自带的多sidebar功能
在你编辑widget时,肯定曾经注意到右上角有一个”侧边栏1″。可是,Wordpress界面中没有提供一个增加”侧边栏2″的功能。
是不是觉得很奇怪?
我翻遍中文资料,才找到一个真正的多sidebar添加方法。http://blog.ijliao.info/archives/2007/02/16/2889/ 严重感谢原作者。
方法抄录如下:
 
要把它从 1 个 sidebar 变成 2 个 sidebar,有几个小地方要改;首先是 functions.php,本来是
register_sidebar(array(
,改成
register_sidebars(2, array(
,这意思就是在系统里注册两个 sidebar,你进
Presentation -> Sidebar Widgets
看就会看到 Sidebar 1 和 Sidebar 2;事情还没完,你还得要去改 sidebar.php,把
dynamic_sidebar()
改成
dynamic_sidebar(1)
,指定要用 Sidebar 1。
 
对 WordPress 的 theme 有点了解的人应该会知道其实 theme 里几乎可以完全靠
index.php
来处理包括首页 / 单篇文章 / 汇整页面 / 特殊页面等等,不过为了让结构单纯一点,也可以把这些功能分离出来,变成
index.php

single.php

archives.php

page.php
分别处理;GlossyBlue 就是这么做的。而在它的设计里,上面那四种页面的处理流程基本上就是
get_header()
->
content
->
get_sidebar()
->
get_footer()
,而
get_sidebar()
就是去呼叫
sidebar.php
;也就是说,在原本的设计里大家都用 Sidebar 1 (在
sidebar.php
里设定的)。而如果想让四种页面分别有不同的 sidebar,也很简单,就是不要去呼叫
get_sidebar()
,自己处理就是了:把
single.php
最下面的
get_sidebar()
改成
if ( function_exists(‘dynamic_sidebar’) ) dynamic_sidebar(2);
,也就是叫它使用 Sidebar 2。
 
到了这里,我本来以为问题解决了,很高兴地开始要设定不同 sidebar 的时候,突然惊觉在 WordPress Widget 系统里面,除了 text 和 RSS widget 以外,其他的 widget 只能出现一次,如果把它放在 Sidebar 1 就不能放在 Sidebar 2;原先的设计可能没有考虑到我上面讲的那种用法吧,可能只有考虑到三栏式设计 (其中两栏设为 sidebar),在这种情况下确实是不会有重复出现的需求 (不会有人想在同一页看到两个日历吧 ?) 为了解决这问题,我又开始到处翻数据,找到前人写的一个 plugin JAW Duplicate Widgets,可以任意 copy widget (不过好像不是每种 widget 都可以 copy 成功),这样我的问题就解决掉大部份啦 🙂
 
(然而……我发现我安装了JAW Duplicate Widgets之后却不能用。好吧……我只好去找更多的Widget。反正Wordpress中拥有相同功能的不同Widget多得是,想不重复也容易。)
好吧,终于完成了。赞叹一下我的曲折过程吧。

简单的遗传算法应用

  廖貅武教授的软计算方法课程,作业包括两个小作业和一个大作业。这是其中的一个小作业,花费时间大约2.5h。
  考虑到我是以一种应付差事的心态来做作业,因而我选择了一种最省力最没有技术含量的方法。使用Matlab的GAOT工具箱。
  基于Matlab的遗传算法工具箱有好多种,是不同的人在不同的时间开发的,现在已知的有:
  (1)GAOT,中国学术期刊网上大部分研究遗传算法的中文论文都是使用的这个工具箱这个工具箱用的似乎是最广的,虽然不是Matlab自带的,但在网上也很容易下载到。然而它的版本实在是太老了,是适用于Matlab5.0版的,因为它的全名是The Genetic Algorithm Optimization Toolbox (GAOT) for Matlab 5,而且似乎到目前为止还没有更新版本发布。
  (2)SGALAB 是在研学论坛上看到的,我对它并不了解,只是知道个名字而已,研学论坛的”遗传算法”板上有一些帖子是介绍这个工具箱的,有兴趣的话可以去看看。
  (3)GADS 这个是Matlab7.0版本自带的工具箱,全名叫Genetic Algorithm and Direct Search Toolbox。在Matlab7.0的Help里面有对这个工具箱的详细介绍,还有很多例子作演示。
  GAOT工具箱可以在http://www.ise.ncsu.edu/mirage/GAToolBox/gaot/ 下载。按照其中的readme所说,将压缩包解压到任意目录,然后在matlab的命令行输入如 >>path(path,’E:/GAToolBox/gaot’); ,其中引号内部分改为你的gaot文件夹位置。然后GAOT工具箱就可用了。
  GAOT工具箱中有一个求函数f(x)=x+10*sin(5*x)+7*cos(4*x)最大值的示例,网上讲GAOT的中文资料几乎全都拿这个例子来说事。考虑到作业应该有那么一点原创性,因而我把它改成了求f(x)=x+30*sin(0.5x)+16*cos(0.4x)的最大值……
  建立m文件fitness.m,内容为
    function[sol,eval]=fitness(sol,options)
    x=sol(1);
    eval=x+30*sin(0.5*x)+16*cos(0.4*x);
  建立m文件Gene.m,内容为
    initPop=initializega(20,[0 100],’fitness’);%生成初始种群,大小为20
    [x endPop,bPop,trace]=ga([0 100],’fitness’,[],initPop,[1e-4 1 1], ‘maxGenTerm’, 100, ‘normGeomSelect’,…
    [0.08],[‘arithXover’],[2],’nonUnifMutation’,[2 100 3])
  运行Gene.m,结果就出来了。
  Plot(:,2:3);就画出了历史最优值和当前代最优值的曲线。计算出最优结果为
  x = 91.9436 129.0239
即当x= 91.9436时,有最大值129.0239。

image002

  附上关于GAOT的简易说明:
核心函数:
(1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)–初始种群的生成函数
【输出参数】
pop–生成的初始种群
【输入参数】
num–种群中的个体数目
bounds–代表变量的上下界的矩阵
eevalFN–适应度函数
eevalOps–传递给适应度函数的参数
options–选择编码形式(浮点编码或是二进制编码)[precision F_or_B],如
precision–变量进行二进制编码时指定的精度
F_or_B–为1时选择浮点编码,否则为二进制编码,由precision指定精度)
(2)function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,…
termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)–遗传算法函数
【输出参数】
x–求得的最优解
endPop–最终得到的种群
bPop–最优种群的一个搜索轨迹
【输入参数】
bounds–代表变量上下界的矩阵
evalFN–适应度函数
evalOps–传递给适应度函数的参数
startPop-初始种群
opts[epsilon prob_ops display]–opts(1:2)等同于initializega的options参数,第三个参数控制是否输出,一般为0。如[1e-6 1 0]
termFN–终止函数的名称,如[maxGenTerm]
termOps–传递个终止函数的参数,如[100]
selectFN–选择函数的名称,如[normGeomSelect]
selectOps–传递个选择函数的参数,如[0.08]
xOverFNs–交*函数名称表,以空格分开,如[arithXover heuristicXover simpleXover]
xOverOps–传递给交*函数的参数表,如[2 02 32 0]
mutFNs–变异函数表,如[boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation]
mutOps–传递给交*函数的参数表,如[4 0 06 100 34 100 34 0 0]

附魔还是分裂?附魔就是分裂?

驱魔人
The Exorcist
译者: 姚向辉
作者: (美)布拉蒂
ISBN: 9787532747580
页数: 390
定价: 25.0
出版社: 上海译文出版社
装帧: 平装
出版年: 2009-3-1
   对我而言,这本书的最大意义在于,它给了我一个相对客观的对于附魔、巫术或人格分裂这样的现象的观察角度。
   一直以来,我对宗教都抱有极大的兴趣。在我看来,宗教是一种能够让人超越自我的精神力量。那是我不曾体验的,并让我感到神秘、刺激和希望窥探其中。
   作者想告诉我们什么?一个事件:一个小女孩表现出种种非自然的症状。一群人物:母亲、医生、神父、警官、佣人……对这同一个事件,每个人都给出了自己的不同看法。是人格分裂还是附魔?或者说,两者其实没有明确的界限?虽然蕾甘最终因为驱魔仪式而恢复正常,但如书中所说,也许驱魔仪式正是令患者的潜意识认为体内魔鬼已被赶走的一种心理暗示。
   这种纠结让我看到了西方人与中国人在世界观上的根本差异。鬼上身的事件在中国也多有记载,但与西方的教会对驱魔仪式的严格限制相比,中国人却草率得多。无非是和尚念经道士画符,或是巫婆神汉跳大神,完全不对这种现象本身进行任何探究,而只是按照从师父那儿学来的办法依样画个葫芦。好在心理暗示也不拘于细节,单有其形也往往会起作用。而当我开始阅读荣格的著作时,我就被完完全全地震撼了:他真真切切地研究易经卦象是否有意义,又试图解释为什么世界各地的古老传说都那么相似。这种视角是中国人从来不曾有过的,一句“子不语怪力乱神”就抹杀了一切相关的可能性。
   中国人对于科学的概念完全是从西方引入的,然而却又没能把握其真髓,把太多的东西想当然地归为科学或迷信。而我们从小所受到的教育也存在一种误导:似乎科学就意味着无神论——而事实根本不是这样。科学意味着实事求是,实践是检验真理的唯一标准。如果哪一天对超自然现象的研究能够确凿无疑地证明神灵或魔鬼的存在,那么这同样是科学。而在目前科学并不能证伪神灵或魔鬼的存在的情况下,也不应草率地将其定义为愚昧的迷信。
   所以——在读完全书之后,我最欣赏的便是这种对于未知事物的探索精神。与之相比,故事情节甚至人物塑造,都已经不再重要了。

流感出没注意

发信人: ArtDesign (兵马俑系统美工组), 信区: ArtDesign
标 题: [美工组公告]www进站画面变更”流感出没”
发信站: 兵马俑BBS (Mon Nov 24 18:27:14 2008), 本站(bbs.xjtu.edu.cn)
经过美工组讨论,现决定采用以下作品作为兵马俑BBS的www进站画面
特此公告。
【采用该幅进站画面的理由】
已经得到两位组长同意。大家谨防感冒!
【其他相关信息】
【进站画面作者】: rexcel
【起始悬挂日期】: 2008-11-24
【撤去悬挂日期】: 2008-11-30
感谢rexcel网友提供的进站画面! 🙂
系统美工组
2008-11-24
 flu