人工神经网络(从原理到代码) 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都能那么火,一个道 ...
随机推荐
- springboot06(静态资源映射)
xxxxAutoConfiguration xxxxproperties 对静态资源的映射规则 webjars @ConfigurationProperties(prefix = "spri ...
- ColorPix——到目前为止最好用的屏幕取色器
分享一个颜色取色器网页.PPT.EXCEL配色不再烦恼 简单易用 大家做商业.企业报告的时候是不是经常遇到要调色的困扰呢?PPT.EXCEL等颜色选取会对报告有质的影响!!要更专业要更有美感!给大家分 ...
- buuctf
大白 | png图片改高度png图片改高度[外链图片转存失败(img-PojN2D3v-1567086301372)(evernotecid://74A3E6DA-E009-4797-AA60-5DE ...
- 网页链接在QQ内因多人投诉被拦截的解决方案
背景 相信大家经常会遇到一个头疼的问题就是,明明自己的网页没有违规内容(比如线下活动的推广),但链接在QQ内转发分享会被QQ管家拦截,导致用户无法访问. 那么当大家遇到这个问题的时候应该怎么办呢?不用 ...
- linux中卸载mysql以及安装yum
卸载mysql:https://blog.csdn.net/qq_41829904/article/details/92966943 链接2:https://www.cnblogs.com/nickn ...
- 【资源分享】Undertale(传说之下)简体中文精品整合包
*----------------------------------------------[下载区]----------------------------------------------* ...
- Maven工程pom中定义jdk版本
今天把之前做的项目导进eclipse,然后发现报错,一些类在1.6中不支持,需要将JDK版本设置为1.7,我直接通过eclipse中的提示进行更改,然后update project一下,发现又回到了S ...
- Visual Studio 2017进行Python开发环境的搭建,使用VS2017进行python代码的编写。
Visual Studio 2017进行Python开发环境的搭建,使用VS2017进行python代码的编写. 前提:已经安装过VS2017且进行过配置. 第一部分: Python环境的搭建: 建议 ...
- JS-禁用浏览器前进后退
使用jQuery: <script type="text/javascript" language="javascript"> $(document ...
- Java代码三级跳——表达式、语句和代码块
Java代码三级跳—表达式.语句和代码块 表达式(expression):Java中最基本的一个运算.比如一个加法运算表达式.1+2是一个表达式,a+b也是. 语句(statement):类似于平时说 ...