公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

0 投票
2.6k 浏览

前几天刚接触了神经网络...今天花时间写了个很简陋的M-P模型,来实现“给定一组整数能分辨出其中某个是奇数还是偶数”这种显而易见的事情ORZ

(*初始化数据*)
indata = {11, 2, 3, 4, 5, 6, 7, 8, 9}        (*给定整数*)
outdata = 
 Table[Abs[Sin[\[Pi]/2 i]], {i, 1, 9}]      (*对应结果,奇数为1,偶数为0*)
mdata = {12, 34, 45, 48, 78, 58, 73, 45, 47}       (*一组随机的权值*)
st = 83;err = 0;
activeF[x_?IntegerQ, y_?IntegerQ] := HeavisideTheta[x y - st](*跃迁激励函数*)


combf[x_?ListQ, y_?ListQ] := 
 Table[{x[[i]], y[[i]]}, {i, 1, 
   Length[x]}](*比较过程所需的函数,貌似MMA内置有这种功能的函数但是我找不到了ORZ*)
(*训练过程*)
For[p1 = {0}; p2 = {0}; err = 0, Length[Join[p1, p2]] > 0, ,
 mxdata = Table[activeF[indata[[i]], mdata[[i]]], {i, 1, 9}]; 
 p1 = Flatten[Position[combf[mxdata, outdata], {x_, y_} /; x > y]];
 p2 = Flatten[Position[combf[mxdata, outdata], {x_, y_} /; x < y]]; 
 mdata[[p1]] = mdata[[p1]] - indata[[p1]];
 mdata[[p2]] = mdata[[p2]] + indata[[p2]];
 err++;]
(*判断函数 若是奇数输出1 若是偶数 输出0*)
evdo[x_?IntegerQ /; 0 < x < 9] := activeF[indata[[x]], mdata[[x]]]

这段程序是能得出结果的,但是看好多资料上都说FOR、DO之类的循环在MMA中效率很低,于是就在想能不能换掉....但是没有任何思路啊..

用户: gadfhykft (111 分)
修改于 用户:gadfhykft

1个回答

+1 投票
 
已采纳

因为弄不清代码意图所以可能有过度修改的地方:

(*初始化数据*)indata = {11, 2, 3, 4, 5, 6, 7, 8, 9}        (*给定整数*)
outdata = PadRight[{}, 9, {1, 0}]      (*对应结果,奇数为1,偶数为0*)
mdata = {12, 34, 45, 48, 78, 58, 73, 45, 47}       (*一组随机的权值*)
st = 83; err = 0;
activeF[x_, y_] := HeavisideTheta[x y - st](*你确定跃迁激励函数不该用UnitStep吗*)
mdata = FixedPoint[(mxdata = activeF[indata, #];
    equalpos = Abs[mxdata - outdata];
    # - indata equalpos) &, mdata]

-----------

根据修正后的问题代码:

(* 前面的部分同上 *)
activeF[x_, y_] := UnitStep[x y - st]
mdata = FixedPoint[(mxdata = activeF[indata, #];
    pos = outdata - mxdata;
    # + indata pos) &, mdata]

 

用户: xzczd (2.2k 分)
修改于 用户:xzczd
FixedPoint这个函数太好用辣~问题最后的判断函数写错了抱歉(已改)- -还有For有个地方符号写错了(已改),这个错误导致你误解mxdata - outdata的值是不区分正负的..确实UnitStep比HeavisideTheta好用因为在零点有定义,这样初始数据就可以直接写Range[9]了 ...这个模型算是个简陋的感知器吧...(我没理解错的话╮(╯▽╰)╭)这段代码这么多问题你都能帮忙修改这是何等的功力啊
啊~区分正负啊,那可以用Sign啊……不对,连Sign都不用,直接减就行。具体参看编辑。
嗯嗯 原来的答案只要把Abs去掉就可以正常运行了
...