機器學習基石 机器学习基石 (Machine Learining Foundations) 作业2 Q16-18 C++实现
大家好,我是Mac Jiang,今天和大家分享Coursera-NTU-機器學習基石(Machine Learning Foundations)-作业2 Q16-18的C++实现。尽管有非常多大神已经在非常多博客中给出了Phython的实现,可是给出C++实现的文章明显较少,这里为大家提供一条C++实现的思路!我的代码尽管可以得到正确答案。可是当中可能有某些思想或者细节是错误的,假设各位博友发现,请及时留言纠正,谢谢!
再次声明。博主提供实现代码的原因不是为了让各位通过測试,而是为学习有困难的同学提供一条解决思路,希望我的文章对您的学习有一些帮助!
本文出处:http://blog.csdn.net/a1015553840/article/details/51023193
其它解答看汇总帖:http://blog.csdn.net/a1015553840/article/details/51085129
1.第16题
(1)题意:这道题说的是“positive and negative rays”。这样的分类方法在老师课堂中已经分析过了,mH(N)=2N。我们在区间[-1,1]上取若干个点(17题为20个),这20个点将[-1。1]分成21个区间,theta能够取21个区间内随意一个,加上s的取值能够为-1或者1,共同拥有21*2=42种组合方式。
分别对这42种hyphothesis计算h(x),计算他与y的差别。即E_in,选择这42种组合最小E_in,把这个hyphothesis作为最佳理论。通过他计E_out。
(2)分析:由第一题我们知道加噪声后的计算方式是此式子。对于这道题我们加20%噪声。所以lambda = 0.8,我们仅仅要求mu就能够了。
mu的定义是h(x)与f(x)的不同。即错误率。
f(x)=s(x)=sign(x)已经在给出,h(x)=s*sign(x-theta)在题中也给出了。所以我们须要依据s和theta分类讨论
1.s = 1, theta > 0:错误率为theta/2
2.s=1,theta < 0;错误率为|theta|/2
3.s=-1,theta > 0:错误率为 (2 - theta)/2
4.s=-1,theta <0:错误率为(2- | theta |)/2
综上。s=1 错误率为 |theta|/2;s = -1,错误率为(2-|theta|)/2
利用一个式子写出来: mu = (s+1)/2 * (|theta|/2) - (s-1)/2 * ((2-|theta|)/2)
最后 E_out = mu * lambda + (1 - lambda) * (1 - mu)。lambda = 0.8,mu带入能够得到答案
(3)答案:0.5+0.3*s*(|theta| - 1)
2.第17,18题
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">
(1)题意:
第17题的意思是在[-1,1]种取20个点。分隔为21个区间作为theta的取值区间,每种分类有42个hyphothesis,枚举全部可能情况找到使E_in最小的hyphothesis,记录最小E_in
第18题的意思是在17题得到的最佳hyphothesis的基础上,利用第16题的公式计算E_out.
(2)实现代码
#include<iostream>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<math.h>
using namespace std; #define DATASIZE 20 //定义[-1,1]的内点的数目 //训练样本结构体
struct record{
double x;
int y;
}; //hyphothesis的结构体,s为+1或-1,theta在20个点分隔的21个区间取值
struct hyphothesis{
int s;
double theta;
}; //sign函数
int sign(double x){
if(x <= 0)return -1;
else return 1;
} //随机在[-1,1]内生成DATASIZE个点的x。并计算相应的y
void getRandData(vector<record> &trainingData){
int i;
for(i = 0; i < DATASIZE; i++){
record temp;
temp.x = 2.0 * rand() / double(RAND_MAX) - 1.0;
temp.y = sign(temp.x);
trainingData.push_back(temp);
}
} //加入噪声,即把20%的点的y值正负号颠倒。这里的20%能够通过随机方法得到[0,1]的数。若小于0.2则觉得这个点加噪声
void getNoise(vector<record> &trainingData){
int i;
for(i = 0; i < DATASIZE; i++){
double randnum = rand() / double(RAND_MAX);
if(randnum < 0.2)
trainingData[i].y = -1 * trainingData[i].y;
}
} //自定义的比較方法。用于sort
bool myCompare( record &v1, record &v2){
return v1.x < v2.x;
} //对MAXSIZE = 20个样本按X进行排序。这里直接调用自带sort函数,第三个參数是自定义的比較方法(C++并不认识record,不知道怎么比較。我们要定义mycompare告诉他)
void sortTrainingData(vector<record> &trainingData){
sort(trainingData.begin(),trainingData.end(),myCompare);
} //给定输入集合和指定的hyphothesis计算相应的错误率
double calculateError(vector<record> &trainingData,hyphothesis &h){
int i;
int error = 0;
for(i = 0; i < DATASIZE; i++){
int temp = h.s * sign(trainingData[i].x - h.theta);
if(temp != trainingData[i].y)error++;
}
return error/double(DATASIZE);
} //因为S = 1 or -1,theta取值有21中,共同拥有42中hyphothesis,我们计算得42种中最小的为E_in,并记录此时最小错误和相应的hyphothesis
double E_in(vector<record> &trainingData,hyphothesis &bestH){
hyphothesis temp;
double min_errorRate = 1.0;
int i;
//s = 1时
for(i = 0; i < DATASIZE+1; i++){
temp.s = 1;
if(i == 0)temp.theta = trainingData[0].x -1.0;//theta取值,theta小于最小
else if(i == DATASIZE) temp.theta = trainingData[DATASIZE - 1].x + 1.0;//theta取值在两点之间
else temp.theta = (trainingData[i-1].x + trainingData[i].x) / 2.0;//theta取值大于最大 double errorRate = calculateError(trainingData,temp);//假设此hyphothesis的错误更小。则替代
if(errorRate < min_errorRate){
bestH = temp;
min_errorRate = errorRate;
}
}
//s = -1时
for(i = 0; i < DATASIZE+1; i++){
temp.s = -1;
if(i == 0)temp.theta = trainingData[0].x -1.0;
else if(i == DATASIZE) temp.theta = trainingData[DATASIZE - 1].x + 1.0;
else temp.theta = (trainingData[i-1].x + trainingData[i].x) / 2.0; double errorRate = calculateError(trainingData,temp);
if(errorRate < min_errorRate){
bestH = temp;
min_errorRate = errorRate;
}
}
return min_errorRate;
} //利用16题得到的公式计算E_out。注意。浮点数求绝对值用fabs,而不是abs
double E_out(hyphothesis &bestH){
return 0.5 + 0.3 * double(bestH.s) * (double)(fabs(bestH.theta) - 1.0);
} void main(){
int i;
double totalE_inRate = 0.0;
double totalE_outRate = 0.0; int seed[5000];//因为要进行5000次求平均,所以要有5000个种子用于求随机数
int j;
for( j = 0; j < 5000; j++){
seed[j] = rand(); //这5000个种子通过一次取随机数产生
} for(i = 0; i < 5000; i ++){
srand(seed[i]);//每次取一个种子。那么每次产生的随机数序列就不一样了
vector<record> trainingData;
getRandData(trainingData);//随机生成训练样本
getNoise(trainingData);//加噪声
sortTrainingData(trainingData);//样本排序
hyphothesis bestH = {0,0};
double min_errorRate = E_in(trainingData,bestH);//计算最优hyphothesis并记录最小错误率
cout<<"mininum E_in:"<<min_errorRate<<endl;
totalE_inRate += min_errorRate;
totalE_outRate += E_out(bestH);
cout<<"E_out:"<<E_out(bestH)<<endl;//利用这次得到的最优hyphothesis求E_out
}
cout<<"average E_in:"<<totalE_inRate / 5000<<endl;//得平均E_in
cout<<"E_out:"<<totalE_outRate / 5000<<endl;//得平均E_out
}
機器學習基石 机器学习基石 (Machine Learining Foundations) 作业2 Q16-18 C++实现的更多相关文章
- 機器學習基石(Machine Learning Foundations) 机器学习基石 课后习题链接汇总
大家好,我是Mac Jiang,非常高兴您能在百忙之中阅读我的博客!这个专题我主要讲的是Coursera-台湾大学-機器學習基石(Machine Learning Foundations)的课后习题解 ...
- 機器學習基石 (Machine Learning Foundations) 作业1 Q15-17的C++实现
大家好,我是Mac Jiang.今天和大家分享Coursera-台湾大学-機器學習基石 (Machine Learning Foundations) -作业1的Q15-17题的C++实现. 这部分作业 ...
- 機器學習基石(Machine Learning Foundations) 机器学习基石 作业三 课后习题解答
今天和大家分享coursera-NTU-機器學習基石(Machine Learning Foundations)-作业三的习题解答.笔者在做这些题目时遇到非常多困难,当我在网上寻找答案时却找不到,而林 ...
- 機器學習基石(Machine Learning Foundations) 机器学习基石 作业四 Q13-20 MATLAB实现
大家好,我是Mac Jiang,今天和大家分享Coursera-NTU-機器學習基石(Machine Learning Foundations)-作业四 Q13-20的MATLAB实现. 曾经的代码都 ...
- 機器學習基石 机器学习基石(Machine Learning Foundations) 作业2 第10题 解答
由于前面分享的几篇博客已经把其他题的解决方法给出了链接,而这道题并没有,于是这里分享一下: 原题: 这题说白了就是求一个二维平面上的数据用决策树来分开,这就是说平面上的点只能画横竖两个线就要把所有的点 ...
- 機器學習基石 机器学习基石(Machine Learning Foundations) 作业1 习题解答 (续)
这里写的是 习题1 中的 18 , 19, 20 题的解答. Packet 方法,我这里是这样认为的,它所指的贪心算法是不管权重更新是否会对train data有改进都进行修正,因为这里面没有 ...
- Gazebo機器人仿真學習探索筆記(二)基本使用說明
在完成Gazebo7安裝後,需要熟悉Gazebo,方便之後使用. 部分源代碼可以參考:https://bitbucket.org/osrf/gazebo/src/ 如果還沒有安裝請參考之前內容完成安裝 ...
- Gazebo機器人仿真學習探索筆記(三)機器人模型
gazebo_models:https://bitbucket.org/osrf/gazebo_models 模型庫下載,可以參考如下命令: ~/Rob_Soft/Gazebo7$ hg clone ...
- 《机器学习基石》第一周 —— When Can Machine Learn?
(注:由于之前进行了吴恩达机器学习课程的学习,其中有部分内容与机器学习基石的内容重叠,所以以下该系列的笔记只记录新的知识) <机器学习基石>课程围绕着下面这四个问题而展开: 主要内容: 一 ...
随机推荐
- POJ 1703 带权并查集
直接解释输入了: 第一行cases. 然后是n和m代表有n个人,m个操作 给你两个空的集合 每个操作后面跟着俩数 D操作是说这俩数不在一个集合里. A操作问这俩数什么关系 不能确定:输出Not sur ...
- C#调用SMS短信接口,轻松搞定发送短信的任务。。。。
首先我们需要去这里http://sms.webchinese.cn/申请一个账号和短信接口秘钥,在该网址下有许多语言的demo介绍,下面我主要为大家贴一个C#中的Helper类: using Syst ...
- 使用IDEA搭建一个 Spring + Spring MVC 的Web项目(零配置文件)
注解是Spring的一个构建的一个重要手段,减少写配置文件,下面解释一下一些要用到的注解: @Configuration 作用于类上面,声明当前类是一个配置类(相当于一个Spring的xml文件)@C ...
- android随手记
Linearlayout: gravity:本元素中所有子元素的重力方向 layout_gravity:本元素对于父元素的重力方向 自定义权限:http://www.cnblogs.com/i ...
- 推荐10个超棒的jQuery工具 提示插件
脚本之家 http://www.jb51.net/article/28525.htm
- c++ 编译期与运行期
分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 转自:http://h ...
- swift Self
'Self' is the type of a protocol/class/struct/enum.And the 'self' is a instance of a class/struct/en ...
- gulp创建完整的项目流程
所有的环境都是在 node 安装好的基础上执行的. node -v 查看node的安装情况.npm -v查看npm 的安装情况. gulp自动化构建常用参数 1.src 读取文件或者文件夹 2.des ...
- logging模块、shutil模块、subprocess模块、xml模块
logging模块 shutil模块 subprocess模块 xml模块 logging模块 函数式简单配置 import logging logging.debug('debug message' ...
- 洛谷P1466 集合 Subset Sums_01背包水题
不多解释,适当刷刷水… Code: #include<cstdio> #include<algorithm> using namespace std; const int ma ...