Question15

训练数据格式如下:

输入有4个维度,输出为{-1,+1}。共有400条数据。
题目要求将权向量元素初始化为0,然后使用“Naive Cycle”遍历训练集,求停止迭代时共对权向量更新了几次。
所谓“Naive Cycle”指的是在某数据条目x(i)上发现错误并更新权向量后,下次从x(i+1)继续读数据,而不是回到第一条数据x(0)从头开始。
#include
#include
#include
using namespace std; #define DEMENSION 5 //数据维度 double weights[DEMENSION]; //权重向量 int step= 0; //迭代次数 int length = 0; //数据条目个数 int index = 0; //当前数据条目索引 bool isFinished = false; //迭代终止状态 char *file = "training_data.txt"; struct record { double input[DEMENSION]; //输入 int output; //输出 }; vector
trainingSet; //训练数据 int sign(double x) { if(x<0) return -1; else if(x>0) return 1; else return -1; } //两个向量相加,更新第一个向量 void add(double *v1, double *v2, int demension) { for(int i=0;i
>curRecord.input[i]; } dataFile>>curRecord.output; trainingSet.push_back(curRecord); } dataFile.close(); length = trainingSet.size(); } void PLA() { int start = index; double curInput[DEMENSION]; //找到下一个错误记录的index while( trainingSet[index].output == sign(multiply(weights,trainingSet[index].input,DEMENSION)) ) { if(index==length-1) {index = 0;} else {index++;} if(index==start) {isFinished = true; break;} //没发现错误,迭代结束 } if(isFinished){ cout<<"计算结果:step = "<
文件打开失败"<
测试结果如下所示:
多次运行程序,迭代次数均为45次。
Question16
vc/C0rvC1rzGy+O/qsq81NnW2NDCxcXQ8qOs1ti4tDIwMDC0zqOsx/O21Mioz/LBv7XExr2++dDe1f20zsr9oaM8YnIgLz48L3A+PHA+PHByZSBjbGFzcz0="brush:java;">#include
#include
#include
#include
using namespace std; #define DEMENSION 5 //数据维度 int step= 0; //迭代次数 int index = 0; //当前数据条目索引 bool isFinished = false; //迭代终止状态 char *file = "training_data.txt"; struct record { double input[DEMENSION]; //输入 int output; //输出 }; int sign(double x) { //同Q15 } void add(double *v1, double *v2, int demension) { //同Q15 } //两个向量相乘,返回内积 double multiply(double *v1, double *v2, int demension) { //同Q15 } //向量与实数相乘,结果通过*result返回,不改变参与计算的向量 void multiply(double *result, double *v, double num, int demension) { //同Q15 } //对 traininig set 创建一个随机排序 void setRandomOrder(vector
&trainingSet, vector
&randIndexes) { srand((unsigned)time(NULL)); int length = trainingSet.size(); vector
assignedIndexes(length,false); for(int i=0;i
&trainingSet) { while(!dataFile.eof()){ record curRecord; curRecord.input[0] = 1; for(int i=1;i
>curRecord.input[i]; } dataFile>>curRecord.output; trainingSet.push_back(curRecord); } dataFile.close(); } void PLA(vector
&trainingSet, vector
&randIndexes, double *weights) { int length = trainingSet.size(); int start = index; double curInput[DEMENSION]; //找到下一个错误记录的index while( trainingSet[randIndexes[index]].output == sign(multiply(weights,trainingSet[randIndexes[index]].input,DEMENSION)) ){ if(index==length-1) {index = 0;} else {index++;} if(index==start) {isFinished = true; break;} //没发现错误,迭代结束 } if(isFinished){ return; }else{ step++; //更新: weights = weights + curOutput * curInput multiply( curInput, trainingSet[randIndexes[index]].input, trainingSet[randIndexes[index]].output, DEMENSION ); add( weights, curInput, DEMENSION ); if(index==length-1) {index = 0;} else {index++;} PLA(trainingSet, randIndexes, weights); } return; } void main() { int totalSteps = 0; for(int i=0;i<2000;++i){ double weights[DEMENSION]; //权重向量 vector
trainingSet; //训练数据 vector
randIndexes; //访问数据的随机索引列表 ifstream dataFile(file); step = 0; index = 0; isFinished = false; if(dataFile.is_open()){ getData(dataFile,trainingSet); setRandomOrder(trainingSet,randIndexes); }else{ cerr<<"ERROR ---> 文件打开失败"<
Question17

本题要求在更新权向量