机器学习笔记——第1篇
来源:互联网 发布:开票软件怎么用 编辑:程序博客网 时间:2024/05/14 15:25
文章作者是我的一位大神学长陈雨学长~,征得学长同意后将文章转载到了我的blog上,特在此感谢学长~
代码在学长的github上:
https://github.com/unnamed2/MDL
欢迎猛击
- 自己实现的机器学习1
- 1 机器学习学的是什么
- 10 featureslabels和parameters
- 11 误差函数 LossFunctionLossFunction
- 12 学习率
- 2 简单的例子
- 20 实现
- 21 尝试
- 3 说明
- 1 机器学习学的是什么
自己实现的机器学习(1):
1.1 机器学习,学的是什么?
1.1.0 features,labels和parameters
对于给定的一组数据,我们通过人类的智慧,可以得到一组数据观测值:
给定一个(28x28)的图片,我们可以用双眼看出来这个图片上面写的数字是几:
给定这16组,每组28x28=784个数值,我们可以很容易的看出来每组数据所代表的图片上刻画的数字最接近哪个数字; 但是这对于一个机器来讲,就不那么简单了,他看到的仅仅是一堆数字而已(0.0,0.1,0.02,0.5…);
如果现在 让我们手工编写一个以一个包含784个数字的数组作为输入,以这个数组描述的图片所描述的数字(0 - 9)作为输出的函数 get_picture_number,这将是非常困难的(欢迎勇者尝试) ,就算是人类的智力,对于一些手写数字(0和6 4和9,3和5等等手写出来比较潦草的情况下)也会是难以分辨的.
不过,也正是这些难度很高的函数对人类来说难以编写,所以才有了机器学习: 人类只需要给计算机编写一个学习的算法,让机器从数据里面学习. 之后的实验证明,一个难度很大的函数等于一个简单的学习算法+好的训练数据.
现在训练数据已经有了(MINST数据集),就差了一个简单的学习算法而已.
人类之所以智力上强于其他生物,正是因为人类懂得学习; 让人类变得更强大的是,人类吧学习方法告诉了忠于人类的计算机: 某些智慧之人发明了一种方法–设计一个数学的函数去拟合这个结果:
其中
1.1.1 误差函数 LossFunction
在给定一组
对于这种总是输出正数的函数 很容易想到一些:
二次函数
C(X)=X2 绝对值函数
C(X)=|X| 一些稍微复杂一些的函数:
C(X)=X−log2(X) 指数函数
C(X)=eX
等等 .
我们将使用二次误差函数作为起点,慢慢尝试着其他误差函数.使用二次函数的好处就是偏导数非常容易求得.
对于其他的初等函数,他们的偏导数不难求得,简单的高数知识足够用.
1.1.2 学习率
既然我们让我们的参数沿着梯度去下降,那么一次性下降多少?
我们可以使用一个固定的步长,每次进行梯度下降 下降一个固定的值;
也可与动态变化 根据当前误差 和迭代次数 决定学习率等等;
总之 学习率是一个表述下降步长的值 我们将再之后的实验中慢慢探索这个值的意义:smile_cat:_
1.2 简单的例子:
1.2.0 实现
我们先尝试着用一个数字作为输入,一个数字作为
我选择了一个3次多项式去拟合一个函数:该函数以
float target_func(float x){ return sinf(x) + ((float)rand() / RAND_MAX) *0.1f - 0.05f;//}
我们并不会告诉我们的多项式这是一个什么样的函数, 让多项式去自己学习这些参数去拟合这条曲线, 也可以不断改变这个函数看看多项式的参数会发生什么样的变化.
我们选择的多项式是这样的一个函数:
其中
显然,
关于误差函数,我们选用一个最简单的二次误差函数:
综述我们的误差模型是:
我们要做的就是利用梯度下降算法不断调整
这里误差对每个
首先 声明一个保存参数的数组:
float parameters[3];//a0 - a2 for (auto& b : parameters) b = ((float)rand() / RAND_MAX);//initialize parameters
学习率我们选择0.9:
const float learning_rate = 0.9f;
先随机的采样: 选择一个样本训练数据:
float x = ((float)rand() / RAND_MAX) - 0.5f;float labels = target_func(x);
计算
float exps[3];exps[0] = 1.0f;//x^0float sum = parameters[0];//parameters[0] * exps[0]for (int j = 1; j < 3; j++) { exps[j] = exps[j - 1] * x; sum += parameters[j] * exps[j];}
计算误差:
float err = sum - labels;
梯度下降:
for (int j = 0; j < 3; j++) { parameters[j] -= err * exps[j] * learning_rate;}
这样就完成了一次迭代:
在经过1000次迭代之后,我得到了这样的结果:
parameters = {0.000f,0.977f,-0.002f};//Tylor:{0.0f,1.0f,0.0f}
这个和泰勒公式告诉我们的结果相差很小.
1.2.1 尝试
如果我们试着把sin(x)变成cos(x)或者其他函数,一样可以得到一个比较不错的结果.
但是如果我们把多项式的次数调的很大,会发现误差实在是有点大 ,这是因为在梯度下降的时候,因为
同样如果我们把学习率调的很小的情况下;会发现算法学习的速度非常缓慢,以至于也需要很多迭代才能得到比较好的值;不过我们把学习率调的很大,会发现最后结果都变成了NaN: 因为误差和下降的距离形成了正反馈,即误差越大,下降的距离太大,全微分方程里面的
1.3 说明
上面的这个例子虽然没有什么卵用,但是至少演示了梯度下降的方法和一般机器学习的总步骤.
在这之后,就会看到真正的有点用的机器学习算法: 对minst数据集里面手写数字的识别;
- 机器学习笔记——第1篇
- 机器学习笔记——第0篇
- 机器学习笔记——第2篇
- 机器学习笔记——第3篇
- 《机器学习》学习笔记 第1章
- 吴恩达机器学习课程笔记——第一周
- 机器学习笔记第1周
- 机器学习实战—第1章
- 机器学习笔记1——什么是机器学习
- Coursera机器学习课程笔记——第1周——Introduction引言
- Coursera吴恩达机器学习课程 总结笔记及作业代码——第1,2周
- 机器学习第一周笔记
- 机器学习第一天笔记
- 机器学习—学习笔记
- 机器学习第一篇(stanford大学公开课学习笔记) —机器学习的概念和梯度下降
- 机器学习笔记1——Regression
- 《机器学习实战》学习笔记——第3章 决策树
- Coursera机器学习第一周学习笔记(二)——Gradient descent
- fatal error: Python.h: No such file or directory
- vim
- 应力分析(2)
- python网络爬虫抓取图片
- 好朋友好算账 隐私权政策
- 机器学习笔记——第1篇
- RMAN 备份恢复系列之controlfile恢复
- UVALive
- leetcode75. Sort Colors
- 判断ImageView当前的图片是哪个图片,然后根据当前图片来做一些操作
- 关于tcp网络通讯的几个场景的小测试
- 机器学习笔记——第2篇
- poj1915之BFS
- 高仿CSDN编写文章,发表文章的工具