{ double t = 0; for(int j = 0; j < ou_num; j++) t += w[2][i][j] * d[2][j]; d[1][i] = t * x[1][i] * (A - x[1][i]) / (A * B); } } //根据计算出的调整量对BP网络进行调整 void BP::UpdateNetWork() { //隐含层和输出层之间权值和阈值调整 for(int i = 0; i < hd_num; i++) { for(int j = 0; j < ou_num; j++) w[2][i][j] -= LR * d[2][j] * x[1][i]; } for(int i = 0; i < ou_num; i++) b[2][i] -= LR * d[2][i]; //输入层和隐含层之间权值和阈值调整 for(int i = 0; i < in_num; i++) for(int j = 0; j < hd_num; j++) w[1][i][j] -= LR * d[1][j] * x[0][i]; for(int i = 0; i < hd_num; i++) b[1][i] -= LR * d[1][i]; } //计算Sigmoid激活函数的值 double BP::Sigmoid(const double x) { return A / (1 + exp(-x / B)); } int main() { FILE *fpTrain = fopen("/Users/really/Desktop/student_train.csv", "r"); FILE *fpTest = fopen("/Users/really/Desktop/student_test.csv", "r"); vector
data; double maxA = -1, minA = 1000, maxB = -1, minB = 1000; for(int i = 0; i < 200; i++) { double a, b, c; Data t; fscanf(fpTrain, "%lf,%lf,%lf", &a, &b, &c); t.x.push_back(a); t.x.push_back(b); t.y.push_back(c); maxA = max(maxA, a); minA = min(minA, a); maxB = max(maxB, b); minB = min(minB, b); data.push_back(t); } for(int i = 0; i < 200; i++) { data[i].x[0] = (data[i].x[0] - minA) / (maxA - minA); data[i].x[1] = (data[i].x[1] - minB) / (maxB - minB); } fclose(fpTrain); BP *bp = new BP(); bp->GetData(data); bp->Train(); for(int i = 0; i < 60; i++) { vector
in; double a, b; fscanf(fpTest, "%lf,%lf", &a, &b); a = (a - minA) / (maxA - minA); b = (b - minB) / (maxB - minB); in.push_back(a); in.push_back(b); vector
ou; ou = bp->ForeCast(in); if(ou[0] >= 0.5) ou[0] = 1; else ou[0] = 0; printf("%d\n", (int)ou[0]); } fclose(fpTest); return 0; }
|