人工神经网络(从原理到代码) Step 01 感知器 梯度下降
版权声明:
本文由SimonLiang所有,发布于http://www.cnblogs.com/idignew/。如果转载,请注明出处,在未经作者同意下将本文用于商业用途,将追究其法律责任。
感知器
1.问题
人工神经网络(ANN)是机器学习的一重要分支,在没介绍神经网络之前,有必要先介绍感知器,感知器是人工神经网络的前身。
有这么一个问题,我们知道某人的体重及身高可否估计出人体脂肪的含量比例(就是肥瘦问题了)?
而实际的
在这之前,我们随机在街上找了几百人做测量,测量下面的数据:
1。年龄(岁)
2。体重(公斤)
3。身高(厘米)
4。颈围(厘米)
5。胸围(厘米)
6。腹部(厘米)
7。臀围(厘米)
8。大腿围(厘米)
9。膝围(厘米)
10。踝周长(厘米)
11。肱二头肌(扩展)腰围(cm)
12。前臂围(厘米)
13。腕围(厘米)
最后是测量这个人的脂肪比例(百分比)
看看是上面的13个因素和身体的脂肪比例有没关系?
为了方便理解,这里只选取测量的体重(X1)及身高(X2)中30组数据为说明对象,数据如下:
| 编号 | x1 体重(kg) | x2 身高(cm) | y 脂肪含量(%) |
| 1 | 70 | 172 | 12 |
| 2 | 79 | 184 | 6 |
| 3 | 70 | 168 | 25 |
| 4 | 84 | 184 | 10 |
| 5 | 84 | 181 | 29 |
| 6 | 95 | 190 | 21 |
| 7 | 82 | 177 | 19 |
| 8 | 80 | 184 | 12 |
| 9 | 87 | 188 | 4 |
| 10 | 90 | 187 | 12 |
| 11 | 84 | 189 | 7 |
| 12 | 98 | 193 | 8 |
| 13 | 82 | 177 | 21 |
| 14 | 93 | 181 | 21 |
| 15 | 85 | 177 | 22 |
| 16 | 74 | 168 | 21 |
| 17 | 89 | 180 | 29 |
| 18 | 95 | 180 | 23 |
| 19 | 83 | 172 | 16 |
| 20 | 96 | 187 | 17 |
| 21 | 81 | 173 | 19 |
| 22 | 91 | 177 | 15 |
| 23 | 64 | 173 | 16 |
| 24 | 67 | 178 | 18 |
| 25 | 69 | 172 | 14 |
| 26 | 72 | 182 | 4 |
| 27 | 60 | 171 | 8 |
| 28 | 67 | 171 | 23 |
| 29 | 60 | 164 | 4 |
| 30 | 73 | 175 | 9 |
-----
2.思路
思路是这样的,能否找到w1,w2,w0,使得y~=w1*x1+w2*x2+w0*x0(其中定义xo=1),这样只要求出w1,w2,wo就可以解决一开始的问题。
于是,我们把上面的模型简化为:

然后让h尽可能接近y的。
---
3.模型
于是每一组数据(一行为一组数据)输入到模型中有了(例子中共30组数据):

上面的其中一组数据可以简化写成:

定义一个函数J,通过函数J来衡量w1,w2,w0是否合适:
J=1/2*(([h(1)-y(1)])2+([h(2)-y(2)])2+...([h(30)-y(30)]) 2)
简写成:

-----
4.求导
下面的工作就是如何求w1,w2,w0了,
由于上面的式子中未知的只有w1,w2,w0(每一组的x1,x2,y都是知道的),
那么函数J实际上就是关于变量(w1,w2,w0)的函数。
为了方便理解,我们暂时把w0=0,这样
J=f(w1,w2)了
对应一个二元方程来说,可以通过一个立体图来直观的描述:

现在就是如何求出最低的位置。
这里用到的是一种称为梯度下降的方法,
首先,随意给定一个点A,然后求出其所在位置的最陡峭的方向(用偏导的方式),再给定一定长度,往下走一点,
停下来再求最陡峭的方向,然后往下走一点,循环直到到达最低的位置。
如下图,

上面的是一个比较好理解的情形,实际上这个J(w1,w2,w0)是一个难以用图表示的,但道理是一样的。
下面给出w1求偏导的具体过程,真的的很详细。。。(可怜的电脑编辑公式实在慢)。

同理求出w2,及w0的偏导(注意x0=1);

---
5.梯度下降求答案
求出偏导后,可以设定一个固定的步长α,向低洼的地方出发了。
下面的公式中的“:=”为编程中的更新公式

代入上面的求导结果后

为了形象的说明为什么减去“α*偏导”,下图形象的说明,其中w’为更新后的w值

---
6.代码实现
%数据
bodyData =
1 70 172 12
1 79 184 6
1 70 168 25
1 84 184 10
1 84 181 29
1 95 190 21
1 82 177 19
1 80 184 12
1 87 188 4
1 90 187 12
1 84 189 7
1 98 193 8
1 82 177 21
1 93 181 21
1 85 177 22
1 74 168 21
1 89 180 29
1 95 180 23
1 83 172 16
1 96 187 17
1 81 173 19
1 91 177 15
1 64 173 16
1 67 178 18
1 69 172 14
1 72 182 4
1 60 171 8
1 67 171 23
1 60 164 4
1 73 175 9
%% matlab 代码
%加载数据
x=bodyData(:,:);%注意x(:,)=;
y=bodyData(:,); %初始化
step=0.000001;%设定步长,就是
stepn=;%步骤数
w=[-0.5;0.5;-0.5];%初始化w值,注意w()对应的是上面的x0; while stepn<;
h=x*w; %计算出h
e=(h-y); %计算出差值e
e1=e.*x(:,);
e2=e.*x(:,);
e3=e.*x(:,);
w()=w()-step*sum(e1);%计算出w1,就是上面讲的w0;
w()=w()-step*sum(e2);%计算出w1,就是上面讲的w1;
w()=w()-step*sum(e3);%计算出w1,就是上面讲的w2;
J(stepn)=/*sum(power(e,)); %计算出代价函数J;
if stepn>
J_gradient=J(stepn-)-J(stepn); %计算梯度值
end %绘制图形
plot(stepn,J(stepn),'o');
hold on;
title(['步数=',num2str(stepn),' 梯度=',num2str(J_gradient)]); pause(0.1); %暂停0.5秒
stepn=stepn+;
end
运行结果:

最后的w值:
w =
-0.4979
0.6018
-0.1820
----
7 后话
1.关于数据扩充
对于上面的例子,可以很容易把上面的3个x变为m个x,数据从30个变为m个。


2.关于BGD与SGD,还有Mini-BGD。
还记得上面的

留意一下,这个是需要对整个数据集都要求和计算的。
而对整体求出梯度的下降方式是叫批量梯度下降(Batch Gradient Descent,简称BGD);
如果数据的维度少(所谓维度就是x1,x2,x3,...,xn,如果上面的例子就是体重,身高,腰围等)的数据没问题。
但对于大数据,如图形那样过万的维度数据,效率就很低了。
所以就有了随机梯度下降,Stochastic Gradient Descent(简称SGD),
及常用的小批量梯度下降 Mini Batch Gradient Descent。
这里不展开,有兴趣可以Search一下区别。
3.关于编程
对应上面的数据,或者类似这样的数据,要做线性回归,
可以自己不写代码,而matlab有一个简单的方式可以实现:
% 把上面的数据用regress 函数就可以解决 w = regress(y,x)
ans:
w =
116.0441
0.5502
-0.8103
参考:
NG大牛的
好了,就写到这里。
(end)
人工神经网络(从原理到代码) Step 01 感知器 梯度下降的更多相关文章
- 图机器学习(GML)&图神经网络(GNN)原理和代码实现(前置学习系列二)
项目链接:https://aistudio.baidu.com/aistudio/projectdetail/4990947?contributionType=1 欢迎fork欢迎三连!文章篇幅有限, ...
- 机器学习笔记之人工神经网络(ANN)
人工神经网络(ANN)提供了一种普遍而且实际的方法从样例中学习值为实数.离散值或向量函数.人工神经网络由一系列简单的单元相互连接构成,其中每个单元有一定数量的实值输入,并产生单一的实值输出. 上面是一 ...
- 二、单层感知器和BP神经网络算法
一.单层感知器 1958年[仅仅60年前]美国心理学家FrankRosenblant剔除一种具有单层计算单元的神经网络,称为Perceptron,即感知器.感知器研究中首次提出了自组织.自学习的思想, ...
- 人工神经网络,支持任意数量隐藏层,多层隐藏层,python代码分享
http://www.cnblogs.com/bambipai/p/7922981.html------误差逆传播算法讲解 人工神经网络包含多种不同的神经网络,此处的代码建立的是多层感知器网络,代码以 ...
- 深度学习原理与框架-Tensorflow卷积神经网络-cifar10图片分类(代码) 1.tf.nn.lrn(局部响应归一化操作) 2.random.sample(在列表中随机选值) 3.tf.one_hot(对标签进行one_hot编码)
1.tf.nn.lrn(pool_h1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75) # 局部响应归一化,使用相同位置的前后的filter进行响应归一化操作 参数 ...
- BP神经网络算法推导及代码实现笔记zz
一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! [毒鸡汤]:算法这东西,读完之后的状态多半是 --> “我是谁,我在哪?” 没事的 ...
- DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解
本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参 ...
- C#中调用Matlab人工神经网络算法实现手写数字识别
手写数字识别实现 设计技术参数:通过由数字构成的图像,自动实现几个不同数字的识别,设计识别方法,有较高的识别率 关键字:二值化 投影 矩阵 目标定位 Matlab 手写数字图像识别简介: 手写 ...
- [DL学习笔记]从人工神经网络到卷积神经网络_3_使用tensorflow搭建CNN来分类not_MNIST数据(有一些问题)
3:用tensorflow搭个神经网络出来 为什么用tensorflow呢,应为谷歌是亲爹啊,虽然有些人说caffe更适合图像啊mxnet效率更高等等,但爸爸就是爸爸,Android都能那么火,一个道 ...
随机推荐
- django url映射的时候指定默认参数
使用path或者re_path后,在url中都可以包含参数,而有时候想指定默认的参数,可以通过在urls.py中写两个url都指向同一个视图函数.一个带参数一个不带参数.同时,在视同函数的参数中设置默 ...
- 6_14 Abbott的复仇(UVa816)<图的最短路BFS>
1999次世界总决赛的比赛包括一个骰子迷宫问题.在这个问题被写的时候,法官们无法发现骰子迷宫概念的原始来源.不久之后的比赛,但是,罗伯特先生雅培,无数的迷宫和对作者的创造者主题,联系大赛评委,自称是骰 ...
- .h头文件 .lib库文件 .dll动态链接库文件关系
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...
- 【StarUML】时序图
时序图是可视化地展示对象与对象之间的联系的图,与其他的图相比,它跟侧重于表现为了完成一个用例,对象之间是怎么协同工作的. 之前学习的组件图.用例图都能表现对象之间的联系,侧重的是"有哪些联系 ...
- 吴裕雄 python 机器学习——人工神经网络感知机学习算法的应用
import numpy as np from matplotlib import pyplot as plt from sklearn import neighbors, datasets from ...
- 【Node.js安装步骤】
"Node.js是一个Javascript运行环境(runtime environment),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.本文详 ...
- django 创建管理员用户
7.2 create 创建管理员用户: python manage.py run server python manage.py createsuperuser password :123456789 ...
- EntityFramework 插入自增ID主从表数据
原因: 数据库中的两个表是主从表关系,但是没有建外键,而表的id用的是数据库的自增整数,导致在使用EF导入主从表数据时,需要先保存主表数据,取到 主表的自增id后才能插入从表数据,这样循环之下,数据插 ...
- idea2019.2激活至2089年!
上图! 激活到2089年8月,绝对够用! 注意:在激活之前,无需改动 host 文件. 资料自取:链接:https://pan.baidu.com/s/1MzX5ewt6lbzHYuggP5sGE ...
- 如何重启Cisco LAP?
在Cisco WLC上进入对应的AP,能够看到Reset这个AP,但是这里会有两种选择: 看到上述的描述,可能很多人都不敢轻易的操作: 1.Hardware Reset:Perform a hardw ...