本文主要在于补充 CNKI 中文章《用 BP 神经网络解决 “徽章问题”》中由于篇幅所限而没有写完的东西。
徽章问题全文:
在 1994 年的 “机器学习与计算学习理论” 的国际会议上,参加会议的 280 名代表都收到会议组织者发给的一枚徽章,徽章的标记为 “+” 或 “-”(参加会议的名单及得到的徽章见附表)。会议的组织者声明:每位代表得到徽章 “+” 或 “-” 的标记只与他们的姓名有关,并希望代表们能够找出徽章 “+” 与 “-” 的分类方法。
1. 请你帮助参加会议的代表找出徽章的分类方法;
2. 对你的分类方法进行分析,如分类的理由、分类的正确与错误率等;
3. 由于客观原因,有14名代表(见附表)没能参加此次会议。按照你的方法,如果他们参加会议,他们将得到什么类型的徽章?
具体各个代表的姓名以及所得到的徽章数据在 http://tieba.baidu.com/f?kz=103914158
对数据进行预处理的 C++程序如下:
/***************************** Author:Linuxayn Last Update:2008.08.20 *****************************/ #include<iostream> #include<fstream> using namespace std; int main() { ifstream infile; infile.open("c:\\input.txt",ios::in);//输入数据文件 ofstream outfile; outfile.open("c:\\output.txt",ios::out);//输出数据文件 char c='a'; while(infile.peek()!=EOF) { c=infile.get(); if(c=='+'||c=='-') { if(c=='+')outfile<<"1 "; else outfile<<"0 "; int i=5; while(i) { c=infile.get(); if(c>='A'&&c<='Z') { outfile<<c-'A'<<" "; i--; } else if(c>='a'&&c<='z') { outfile<<c-'a'<<" "; i--; } } outfile<<endl; } } return 0; } |
得到了一个在 C 盘根目录下的 output.txt 文件, 可以用 MATLAB 命令输入该文件得到数据矩阵。
>>A=load('c:\output.txt'); >>p=A(:,2:6); >>t=A(:,1); >>net=newff([0 25;0 25;0 25;0 25; 0 25],[100,1],{'logsig','purelin'},'trainlm'); >>net=init(net); >>net.trainParam.min_grad=1e-020; >>p=p'; >>t=t'; >>net=train(net,p,t); |
//这是输出结果:
TRAINLM, Epoch 0/100, MSE 9.258/0, Gradient 8263.49/1e-020
TRAINLM, Epoch 25/100, MSE 0.00376779/0, Gradient 0.269321/1e-020
TRAINLM, Epoch 41/100, MSE 0.0032391/0, Gradient 1.68499e-012/1e-020
TRAINLM, Maximum MU reached, performance goal was not met.
横坐标是迭代次数, 纵坐标是训练精度, 关于 newff 的使用可以在 MATLAB 中使用 help newff 查看。
再问下,这个东西是你整的??
额.. 这个主题压缩前是 300+k, 第一次载入的确可能需要更多的时间.. 当然啦, 关键在于多访问, 这样会从历史记录里面获取图片..
思想当然不是我想的, 但是代码的确是我写的, 而且调用 MATLAB 的工具箱也不算太难吧…好久没写 C++了,555…
我觉得你这个新地址更慢了….