由于课程设计选的题目是基于神经网络的综合评价,利用暑假时间用C#实现的bp神经网络。其中用到的_Matrix类是C#实现的矩阵类http://blog.csdn.net/lanqiuchaoren/article/details/37738665。此bp神经网络包含1个隐藏层,其中输入层,隐藏层,输出层个数都可以根据需要更改。
具体bp神经网络代码如下
BP类:
using Matrix_Mul;
using Excel = Microsoft.Office.Interop.Excel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Office.Interop.Excel;
namespace BPNETSerial
{
public class BP
{
/// <summary>
/// 判断是否训练过网络
/// </summary>
Boolean IsTrained;
/// <summary>
/// 用于矩阵的相关计算
/// </summary>
_Matrix_Calc matrix_Calc;
/// <summary>
/// 输入层节点数
/// </summary>
int innum;
/// <summary>
/// 测试数据组数
/// </summary>
int train_num;
/// <summary>
/// 训练数据组数
/// </summary>
int test_num;
public int Test_num
{
get
{
return test_num;
}
set
{
test_num = value;
}
}
/// <summary>
/// 测试数据维度;
/// </summary>
int sampdim;
/// <summary>
/// 隐藏层节点数
/// </summary>
int midnum;
/// <summary>
/// 输出层节点数
/// </summary>
int outnum;
/// <summary>
/// 迭代次数
/// </summary>
int iteration;
/// <summary>
/// 输入层与隐藏层间的权值
/// </summary>
_Matrix w1;
/// <summary>
/// 输入层与隐藏层间的阀值
/// </summary>
_Matrix b1;
/// <summary>
/// 输出层与隐藏层间的权值
/// </summary>
_Matrix w2;
/// <summary>
/// 输出层与隐藏层间的阀值
/// </summary>
_Matrix b2;
/// <summary>
/// 保存w1的值
/// </summary>
_Matrix w1_1;
/// <summary>
/// 保存w2的值
/// </summary>
_Matrix w2_1;
/// <summary>
/// 用于综合评价的矩阵(基于bp神经网络测试结果)
/// </summary>
_Matrix comprehesiveEvaluationMatrix;
/// <summary>
/// 综合评价结果输出矩阵(基于bp神经网络测试结果)
/// </summary>
_Matrix comprehensiveEvaluationResultMatrix;
/// <summary>
/// 保存b1的值
/// </summary>
_Matrix b1_1;
/// <summary>
/// 保存b2的值
/// </summary>
_Matrix b2_1;
/// <summary>
/// 学习率
/// </summary>
double xite;
/// <summary>
/// 误差
/// </summary>
double error;
public double[] comprehensiveEvaluation;
double accu_average;
/// <summary>
/// 误差率
/// </summary>
double[] accuracy;
/// <summary>
/// 训练输入数据
/// </summary>
_Matrix input_train;
public _Matrix Input_train
{
get
{
return input_train;
}
set
{
this.input_train = value;
}
}
/// <summary>
/// 训练输出数据
/// </summary>
_Matrix output_train;
public _Matrix Output_train
{
get
{
return output_train;
}
set
{
this.output_train = value;
}
}
/// <summary>
/// 归一化后的训练输入数据
/// </summary>
_Matrix input_train_Norm;
/// <summary>
/// 归一化后的训练输出数据
/// </summary>
_Matrix output_train_Norm;
/// <summary>
/// 测试输入数据
/// </summary>
_Matrix input_test;
public _Matrix Input_test
{
get
{
return input_test;
}
set
{
this.input_test = value;
}
}
/// <summary>
/// 预期输出数据(归一化前)
/// </summary>
public _Matrix fore_test;
/// <summary>
/// 预期输出数据(归一化后)
/// </summary>
public _Matrix fore;
/// <summary>
/// 测试输出数据
/// </summary>
_Matrix output_test;
public _Matrix Output_test
{
get
{
return output_test;
}
set
{
this.output_test = value;
}
}
/// <summary>
/// 误差矩阵
/// </summary>
_Matrix error_test;
/// <summary>
/// 归一化后的测试输入数据
/// </summary>
_Matrix input_test_Norm;
/// <summary>
/// 归一化后的测试输出数据
/// </summary>
_Matrix output_test_Norm;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="innum"></param>
/// <param name="midnum"></param>
/// <param name="outnum"></param>
/// <param name="num"></param>
/// <param name="sampDim"></param>
/// <param name="input_train"></param>
/// <param name="output_train"></param>
/// <param name="xite"></param>
public BP(int innum, int midnum, int outnum, int train_num, int sampDim, int iteration, double xite)
{
this.innum = innum;
this.midnum = midnum;
this.outnum = outnum;
this.iteration = iteration;
matrix_Calc = ne