版权声明:

本文由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大牛的

UFLDL教程

斯坦福机器学习网上教程

好了,就写到这里。

(end)

人工神经网络(从原理到代码) Step 01 感知器 梯度下降的更多相关文章

  1. 图机器学习(GML)&图神经网络(GNN)原理和代码实现(前置学习系列二)

    项目链接:https://aistudio.baidu.com/aistudio/projectdetail/4990947?contributionType=1 欢迎fork欢迎三连!文章篇幅有限, ...

  2. 机器学习笔记之人工神经网络(ANN)

    人工神经网络(ANN)提供了一种普遍而且实际的方法从样例中学习值为实数.离散值或向量函数.人工神经网络由一系列简单的单元相互连接构成,其中每个单元有一定数量的实值输入,并产生单一的实值输出. 上面是一 ...

  3. 二、单层感知器和BP神经网络算法

    一.单层感知器 1958年[仅仅60年前]美国心理学家FrankRosenblant剔除一种具有单层计算单元的神经网络,称为Perceptron,即感知器.感知器研究中首次提出了自组织.自学习的思想, ...

  4. 人工神经网络,支持任意数量隐藏层,多层隐藏层,python代码分享

    http://www.cnblogs.com/bambipai/p/7922981.html------误差逆传播算法讲解 人工神经网络包含多种不同的神经网络,此处的代码建立的是多层感知器网络,代码以 ...

  5. 深度学习原理与框架-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进行响应归一化操作 参数 ...

  6. BP神经网络算法推导及代码实现笔记zz

    一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! [毒鸡汤]:算法这东西,读完之后的状态多半是 --> “我是谁,我在哪?” 没事的 ...

  7. DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

    本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参 ...

  8. C#中调用Matlab人工神经网络算法实现手写数字识别

    手写数字识别实现 设计技术参数:通过由数字构成的图像,自动实现几个不同数字的识别,设计识别方法,有较高的识别率 关键字:二值化  投影  矩阵  目标定位  Matlab 手写数字图像识别简介: 手写 ...

  9. [DL学习笔记]从人工神经网络到卷积神经网络_3_使用tensorflow搭建CNN来分类not_MNIST数据(有一些问题)

    3:用tensorflow搭个神经网络出来 为什么用tensorflow呢,应为谷歌是亲爹啊,虽然有些人说caffe更适合图像啊mxnet效率更高等等,但爸爸就是爸爸,Android都能那么火,一个道 ...

随机推荐

  1. springboot06(静态资源映射)

    xxxxAutoConfiguration xxxxproperties 对静态资源的映射规则 webjars @ConfigurationProperties(prefix = "spri ...

  2. ColorPix——到目前为止最好用的屏幕取色器

    分享一个颜色取色器网页.PPT.EXCEL配色不再烦恼 简单易用 大家做商业.企业报告的时候是不是经常遇到要调色的困扰呢?PPT.EXCEL等颜色选取会对报告有质的影响!!要更专业要更有美感!给大家分 ...

  3. buuctf

    大白 | png图片改高度png图片改高度[外链图片转存失败(img-PojN2D3v-1567086301372)(evernotecid://74A3E6DA-E009-4797-AA60-5DE ...

  4. 网页链接在QQ内因多人投诉被拦截的解决方案

    背景 相信大家经常会遇到一个头疼的问题就是,明明自己的网页没有违规内容(比如线下活动的推广),但链接在QQ内转发分享会被QQ管家拦截,导致用户无法访问. 那么当大家遇到这个问题的时候应该怎么办呢?不用 ...

  5. linux中卸载mysql以及安装yum

    卸载mysql:https://blog.csdn.net/qq_41829904/article/details/92966943 链接2:https://www.cnblogs.com/nickn ...

  6. 【资源分享】Undertale(传说之下)简体中文精品整合包

    *----------------------------------------------[下载区]----------------------------------------------* ...

  7. Maven工程pom中定义jdk版本

    今天把之前做的项目导进eclipse,然后发现报错,一些类在1.6中不支持,需要将JDK版本设置为1.7,我直接通过eclipse中的提示进行更改,然后update project一下,发现又回到了S ...

  8. Visual Studio 2017进行Python开发环境的搭建,使用VS2017进行python代码的编写。

    Visual Studio 2017进行Python开发环境的搭建,使用VS2017进行python代码的编写. 前提:已经安装过VS2017且进行过配置. 第一部分: Python环境的搭建: 建议 ...

  9. JS-禁用浏览器前进后退

    使用jQuery: <script type="text/javascript" language="javascript"> $(document ...

  10. Java代码三级跳——表达式、语句和代码块

    Java代码三级跳—表达式.语句和代码块 表达式(expression):Java中最基本的一个运算.比如一个加法运算表达式.1+2是一个表达式,a+b也是. 语句(statement):类似于平时说 ...