《用 BP 神经网络解决” 徽章问题”》补充

本文主要在于补充 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 查看。

3 评论

    • 额.. 这个主题压缩前是 300+k, 第一次载入的确可能需要更多的时间.. 当然啦, 关键在于多访问, 这样会从历史记录里面获取图片..

      思想当然不是我想的, 但是代码的确是我写的, 而且调用 MATLAB 的工具箱也不算太难吧…好久没写 C++了,555…

留下评论

Captcha Code

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据