2019独角兽企业重金招聘Python工程师标准>>>

二话不说先上题目:

训练数据格式如下:

输入有4个维度,输出为{-1,+1}。共有400条数据。

题目要求将权向量元素初始化为0,然后使用“Naive Cycle”遍历训练集,求停止迭代时共对权向量更新了几次。

所谓“Naive Cycle”指的是在某数据条目x(i)上发现错误并更新权向量后,下次从x(i+1)继续读数据,而不是回到第一条数据x(0)从头开始。

#include <fstream>
#include <iostream>
#include <vector>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<record> 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<demension;++i){ v1[i] = v1[i] + v2[i]; }
}//两个向量相乘,返回内积
double multiply(double *v1, double *v2, int demension)
{double innerProd = 0.0;for(int i=0;i<demension;++i){innerProd += v1[i] * v2[i];}return innerProd;
}//向量与实数相乘,结果通过*result返回,不改变参与计算的向量
void multiply(double *result, double *v, double num, int demension)
{for(int i=0;i<demension;++i){ result[i] = v[i] * num; }
}//读取所有训练数据
void getData(ifstream & dataFile)
{while(!dataFile.eof()){record curRecord;curRecord.input[0] = 1;      for(int i=1;i<DEMENSION;++i){ dataFile>>curRecord.input[i]; }dataFile>>curRecord.output;trainingSet.push_back(curRecord);}dataFile.close();length = trainingSet.size();
}void PLA()
{int start = index;double curInput[DEMENSION];//找到下一个错误记录的indexwhile( 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 = "<<step<<", weights = \n";for(int i=0;i<DEMENSION;++i){ cout<<weights[i]<<endl; }    return;}else{step++;//更新: weights = weights + curOutput * curInputmultiply( curInput, trainingSet[index].input, trainingSet[index].output, DEMENSION ); add( weights, curInput, DEMENSION );    if(index==length-1)   {index = 0;}else           {index++;}PLA();  }return;
}void main()
{   ifstream dataFile(file);if(dataFile.is_open()){getData(dataFile);       }else{cerr<<"ERROR ---> 文件打开失败"<<endl;exit(1);}for(int i=0;i<DEMENSION;++i){ weights[i] = 0.0; }PLA();
}

多次运行程序,迭代次数均为45次。

该题要求使用“fixed,pre-determined random cycle”对数据进行遍历,即对400条数据进行随机排序,然后在这轮计算中始终使用这一排序,直到下一轮计算开始再重新排序,重复2000次,求对权向量的平均修正次数。

#include <fstream>
#include <iostream>
#include <vector>
#include <ctime>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<record> &trainingSet, vector<int> &randIndexes)
{srand((unsigned)time(NULL)); int length = trainingSet.size(); vector<bool> assignedIndexes(length,false);     for(int i=0;i<length;++i){int randIndex = rand()%length;while(assignedIndexes[randIndex]==true){randIndex = rand()%length;  }randIndexes.push_back(randIndex); assignedIndexes[randIndex] = true;      }
}//读取所有训练数据
void getData(ifstream & dataFile, vector<record> &trainingSet)
{while(!dataFile.eof()){record curRecord;curRecord.input[0] = 1;      for(int i=1;i<DEMENSION;++i){ dataFile>>curRecord.input[i]; }dataFile>>curRecord.output;trainingSet.push_back(curRecord);}dataFile.close();
}void PLA(vector<record> &trainingSet, vector<int> &randIndexes, double *weights)
{int length = trainingSet.size();int start = index;   double curInput[DEMENSION];//找到下一个错误记录的indexwhile( 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 * curInputmultiply( 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<record> trainingSet;     //训练数据vector<int> randIndexes;        //访问数据的随机索引列表ifstream dataFile(file);step = 0;             index = 0;             isFinished = false;   if(dataFile.is_open()){getData(dataFile,trainingSet); setRandomOrder(trainingSet,randIndexes);}else{cerr<<"ERROR ---> 文件打开失败"<<endl;exit(1);}for(int i=0;i<DEMENSION;++i){ weights[i] = 0.0; }PLA(trainingSet, randIndexes, weights);totalSteps += step;}cout<<"Average Step = "<<totalSteps/2000<<endl;
}

本题要求在更新权向量时乘以一个0.5的系数,代码变动很少。

转载于:https://my.oschina.net/findbill/blog/208917

4.1 - 《机器学习基石》Home Work 1 Q.15-17相关推荐

  1. 太赞了!NumPy 手写所有主流 ML 模型,由普林斯顿博士后 David Bourgin打造的史上最强机器学习基石项目!...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 用 NumPy 手写所有主流 ML 模型,普林斯顿博士后 David Bourgi ...

  2. NumPy 手写所有主流 ML 模型,由普林斯顿博士后 David Bourgin打造的史上最强机器学习基石项目!...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 用 NumPy 手写所有主流 ML 模型,普林斯顿博士后 David Bourgi ...

  3. 台湾大学林轩田机器学习基石课程学习笔记14 -- Regularization

    红色石头的个人网站:redstonewill.com 上节课我们介绍了过拟合发生的原因:excessive power, stochastic/deterministic noise 和limited ...

  4. 台湾大学林轩田机器学习基石课程学习笔记12 -- Nonlinear Transformation

    红色石头的个人网站:redstonewill.com 上一节课,我们介绍了分类问题的三种线性模型,可以用来解决binary classification和multiclass classificati ...

  5. 机器学习基石12-Nonlinear Transformation

    注: 文章中所有的图片均来自台湾大学林轩田<机器学习基石>课程. 笔记原作者:红色石头 微信公众号:AI有道 上一节课介绍了分类问题的三种线性模型,可以用来解决binary classif ...

  6. 台大机器学习基石学习笔记

    台大机器学习基石学习笔记 标签(空格分隔): 机器学习 目录 台大机器学习基石学习笔记 目录 Lecture 1 The Learning Problem Course Introduction Wh ...

  7. 机器学习基石12:非线性变换(Nonlinear Transformation)

    本文介绍了非线性变换的整体流程:通过非线性变换,将非线性模型映射到另一个空间,转换为线性模型,再来进行线性分类. 之后介绍了非线性变换存在的问题:时间复杂度和空间复杂度的增加. 最后证明了非线性变换的 ...

  8. 台湾大学林轩田机器学习基石课程学习笔记1 -- The Learning Problem

    红色石头的个人网站:redstonewill.com 最近在看NTU林轩田的<机器学习基石>课程,个人感觉讲的非常好.整个基石课程分成四个部分: When Can Machine Lear ...

  9. 台湾大学林轩田机器学习基石课程学习笔记15 -- Validation

    红色石头的个人网站:redstonewill.com 上节课我们主要讲了为了避免overfitting,可以使用regularization方法来解决.在之前的EinEinE_{in}上加上一个reg ...

  10. 台湾大学林轩田机器学习基石课程学习笔记13 -- Hazard of Overfitting

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了非线性分类模型,通过非线性变换,将非线性模型映射到另一个空间,转换为线性模型,再来进行分类,分析了非线性变换可能会使计算复杂度 ...

最新文章

  1. 信息熵及其相关概念--数学
  2. 循环: 打印1~10
  3. Java中String、StringBuffer、StringBuilder的区别
  4. SAP S/4HANA装到Docker里的镜像有多大
  5. Python小数据保存,有多少中分类?不妨看看他们的类比与推荐方案...
  6. Linux系统管理第七周作业【Linux微职位】
  7. SVN Error: Unreadable path encountered; access denied;
  8. 推荐几个最好用的CRM软件,本人亲测
  9. 试用officescan 10.5
  10. 使用vue-pdf-signature实现pdf预览
  11. 不骗你,全网首创的超硬核的万字SQL题
  12. Stream系列(六)Match方法使用
  13. 【评测】MP SARS-CoV-2单抗、重组蛋白
  14. Pycharm一键选中多个东西(数据、函数等)进行修改、删除、替换等
  15. 俄罗斯天才少女也选华为,22岁拿下世界编程冠军,同天队友也宣布加盟
  16. 批处理bat实现常用软件一键开启
  17. 导出音乐软件歌单为txt文本
  18. 计算机上的查找替换功能快速格式化,Excel 2016中使用查找替换功能应用技巧
  19. 畅游Python 二十一:Web框架 - Tornado
  20. Leetcode(4)寻找两个有序数组的中位数

热门文章

  1. python求高阶导数_Pythorch中的高阶梯度
  2. Git报错解决:OpenSSL SSL_read: Connection was reset, errno 10054 错误解决
  3. java final 详解_java中Final详解
  4. oracle如何设置权限,Oracle创建用户并设置权限
  5. python控制窗口_Python : Turtle窗口控制
  6. linux关机_LINUX快速入门第二章:Linux 系统启动过程
  7. python导入requests库_windows环境中python导入requests
  8. mysql词法分析antlr4_词法分析器和语法分析器的界线 - ANTLR 4 简明教程
  9. python 代码行数统计工具_使用Python设计一个代码统计工具
  10. 南京师范大学与南京林业大学计算机,这8所高校“同宗同源”但不同命!有些是“985”,有些却是“双非”?...