转载自:http://blog.csdn.net/stan1989/article/details/8565499

引言

这里开始介绍神经网络方面的知识(Neural Networks)。首先我们会介绍几个监督式学习的算法,随后便是非监督式的学习。

一、感知器学习算法基本介绍

1.神经网络

就像进化计算,神经网络又是一个类似的概念。神经网络由一个或者多个神经元组成。而一个神经元包括输入、输出和“内部处理器”。神经元从输入端接受信息,通过“内部处理器”将这些信息进行一定的处理,最后通过输出端输出。

2.感知器

感知器(Perceptron),是神经网络中的一个概念,在1950s由Frank Rosenblatt第一次引入。

3.单层感知器

单层感知器(Single Layer Perceptron)是最简单的神经网络。它包含输入层和输出层,而输入层和输出层是直接相连的。

图1.1

图1.1便是一个单层感知器,很简单一个结构,输入层和输出层直接相连。

接下来介绍一下如何计算输出端。

利用公式1计算输出层,这个公式也是很好理解。首先计算输入层中,每一个输入端和其上的权值相乘,然后将这些乘机相加得到乘机和。对于这个乘机和做如下处理,如果乘机和大于临界值(一般是0),输入端就取1;如果小于临界值,就取-1。

以下就给出一段单层感知器的代码。

[cpp] view plaincopyprint?
  1. //
  2. //singlelayer perceptrons(SLP)
  3. bool slp_calculate_output(constdouble * inputs,constdouble * weights,intnInputs,int & output)
  4. {
  5. if(NULL ==inputs || NULL == weights)
  6. return false;
  7. double sum =0.0;
  8. for (int i = 0 ; i < nInputs ; ++i)
  9. {
  10. sum += (weights[i] * inputs[i]);
  11. }
  12. //这里我们对乘机和的处理:如果大于0,则输出值为1;其他情况,输出值为-1
  13. if(sum >0.0)
  14. output = 1;
  15. else
  16. output = -1;
  17. }
  18. //

单层感知器其简单的特性,可以提供快速的计算。它能够实现逻辑计算中的NOT、OR、AND等简单计算。

但是对于稍微复杂的异或就无能无力。下面介绍的多层感知器,就能解决这个问题。

4.多层感知器

多层感知器(Multi-Layer Perceptrons),包含多层计算。

相对于单层感知器,输出端从一个变到了多个;输入端和输出端之间也不光只有一层,现在又两层:输出层和隐藏层。

图2.2

图2.2就是一个多层感知器。

对于多层感知器的计算也是比较简单易懂的。首先利用公式1计算每一个。

看一下它代码,就能明白它的工作原理。

[cpp] view plaincopyprint?
  1. //
  2. //Multi-Layerperceptrons(MLP)
  3. const unsignedint nInputs  =4;
  4. const unsignedint nOutputs = 3;
  5. const unsignedint nHiddens = 4;
  6. struct mlp
  7. {
  8. doubleinputs[nInputs+1];//多一个,存放的bias,一般存放入1
  9. doubleoutputs[nOutputs];
  10. doublehiddens[nHiddens+1]; //多一个,存放的bias,一般存放入1
  11. doubleweight_hiddens_2_inputs[nHiddens+1][nInputs+1];
  12. doubleweight_outputs_2_hiddens[nOutputs][nHiddens+1];
  13. };
  14. //这里我们对乘机和的处理:如果大于0,则输出值为1;其他情况,输出值为-1
  15. double sigmoid (double val)
  16. {
  17. if(val >0.0)
  18. return1.0;
  19. else
  20. return-1.0;
  21. }
  22. //计算输出端
  23. bool mlp_calculate_outputs(mlp * pMlp)
  24. {
  25. if(NULL ==pMlp)
  26. return false;
  27. double sum =0.0;
  28. //首先计算隐藏层中的每一个结点的值
  29. for (int h = 0 ; h < nHiddens ; ++h)
  30. {
  31. doublesum = 0.0;
  32. for (int i = 0 ; i < nInputs + 1 ; ++i)
  33. {
  34. sum += pMlp->weight_hiddens_2_inputs[h][i]*pMlp->inputs[i];
  35. }
  36. pMlp->hiddens[h] = sigmoid (sum);
  37. }
  38. //利用隐藏层作为“输入层”,计算输出层
  39. for (int o = 0 ; o < nOutputs ; ++o)
  40. {
  41. doublesum = 0.0;
  42. for (int h = 0 ; h < nHiddens + 1 ; ++h)
  43. {
  44. sum += pMlp->weight_outputs_2_hiddens[o][h]*pMlp->hiddens[h];
  45. }
  46. pMlp->outputs[o] = sigmoid (sum);
  47. }
  48. return true;
  49. }
  50. //

二、感知器学习算法

1.感知器学习

其实感知器学习算法,就是利用第一节介绍的单层感知器。首先利用给的正确数据,计算得到输出值,将输出值和正确的值相比,由此来调整每一个输出端上的权值。

公式2便是用来调整权值,首先 是一个“学习参数”,一般我将它设置成小于1的正数。T便是训练数据中的正确结果, 便是第i个输入端的输入值,便是第i个输入端上面的权值。

2.代码

对于其介绍,我还是附上代码。

[cpp] view plaincopyprint?
  1. //
  2. //PerceptronLearning Algorithm(PLA)
  3. const unsignedint nTests   =4; //训练数据的数量
  4. const unsignedint nInputs  =2; //输入端的数量
  5. const double alpha =0.2;       //学习参数
  6. struct slp
  7. {
  8. doubleinputs[nInputs];
  9. doubleoutput;
  10. }; //单层感知器
  11. //计算输出值
  12. int compute(double *inputs,double * weights)
  13. {
  14. double sum =0.0;
  15. for (int i = 0 ; i < nInputs; ++i)
  16. {
  17. sum += weights[i]*inputs[i];
  18. }
  19. //bias
  20. sum += 1.0 * weights[nInputs];
  21. if(sum >0.0)
  22. return1;
  23. else
  24. return-1;
  25. }
  26. //
  27. int _tmain(int argc,_TCHAR* argv[])
  28. {
  29. //正确的训练数据
  30. slp slps[nTests] = {
  31. {-1.0,-1.0,-1.0},
  32. {-1.0, 1.0, 1.0},
  33. { 1.0,-1.0, 1.0},
  34. { 1.0, 1.0, 1.0}
  35. };
  36. doubleweights[nInputs + 1] = {0.0};
  37. boolbLearningOK = false;
  38. //感知器学习算法
  39. while(!bLearningOK)
  40. {
  41. bLearningOK = true;
  42. for (int i = 0 ; i < nTests ; ++i)
  43. {
  44. intoutput = compute(slps[i].inputs,weights);
  45. if(output!= (int)slps[i].output)
  46. {
  47. for(int w = 0 ; w < nInputs ; ++w)
  48. {
  49. weights[w] += alpha *slps[i].output * slps[i].inputs[w];
  50. }
  51. weights[nInputs] += alpha *slps[i].output ;
  52. bLearningOK = false;
  53. }
  54. }
  55. }
  56. for(int w = 0 ; w < nInputs + 1 ; ++w)
  57. {
  58. cout<<"weight"<<w<<":"<<weights[w] <<endl;
  59. }
  60. cout<<"\n";
  61. for (int i = 0 ;i < nTests ; ++i)
  62. {
  63. cout<<"rightresult:"<<slps[i].output<<"\t";
  64. cout<<"caculateresult:" << compute(slps[i].inputs,weights)<<endl;
  65. }
  66. //
  67. char temp ;
  68. cin>>temp;
  69. return 0;
  70. }

2.效果图

下面附上运行效果图

三、总结

感知器学习算法,算是神经网络中的最简单的学习算法。但是通过这个进入学习神经网络学习算法,是个不错的选择。

感知器学习算法,只要是利用了单层感知器。这篇文章中,我们还了解到了另一种感知器:多层感知器。多层感知器主要是用于方向传播学习算法中,这个我后面的文章中会进行介绍。

由于笔者不是专门研究人工智能方面,所以在写这些文章的时候,肯定会有一些错误,也请谅解,上面介绍中有什么错误或者不当地方,敬请指出,不甚欢迎。

如果有兴趣的可以留言,一起交流一下算法学习的心得。

声明:本文章是笔者整理资料所得原创文章,如转载需注明出处,谢谢。

Machine Learning---感知器学习算法相关推荐

  1. 【Python-ML】感知器学习算法(perceptron)

    1.数学模型   2.权值训练 3.Python代码 感知器收敛的前提是两个类别必须是线性可分的,且学习速率足够小.如果两个类别无法通过一个线性决策边界进行划分,要为模型在训练集上的学习迭代次数设置一 ...

  2. 机器学习算法系列(一)- 感知器学习算法(PLA)

    阅读本文需要的背景知识点:数学基础知识.一丢丢编程知识 一.引言   前面一节我们了解了机器学习算法系列(〇)- 基础知识,接下来正式开始机器学习算法的学习,首先我们从最简单的一个算法--感知器学习算 ...

  3. 【Machine Learning】KNN学习算法与C语言实现

    KNN学习(K-Nearest Neighbor algorithm,K最邻近方法)是一种统计分类器,属于惰性学习,对包容型数据的特征变量筛选尤其有效.KNN的基本思想是:输入没有标签即未经分类的新数 ...

  4. 分类系列之感知器学习算法PLA 和 口袋算法Pocket Algorithm

    我们有一堆数据,默认他们是线性可分的.  定义f为这个数据分割线的最优解,但是我们不知道他的值.  我们仅有一个函数集H,这个函数一般是无穷大的.我们的目的就是从H中找出一条线g来尽可能的接近f.但是 ...

  5. ML之NB:基于news新闻文本数据集利用纯统计法、kNN、朴素贝叶斯(高斯/多元伯努利/多项式)、线性判别分析LDA、感知器等算法实现文本分类预测

    ML之NB:基于news新闻文本数据集利用纯统计法.kNN.朴素贝叶斯(高斯/多元伯努利/多项式).线性判别分析LDA.感知器等算法实现文本分类预测 目录 基于news新闻文本数据集利用纯统计法.kN ...

  6. 机器学习(Machine Learning)——深度学习(Deep Learning)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/abcjennifer/article/ ...

  7. Machine Learning:如何选择机器学习算法?

    2019独角兽企业重金招聘Python工程师标准>>> Machine Learning Algorithms Overview 关于目前最流行的一些机器学习算法,建议阅读: Mac ...

  8. 神经网络与机器学习 笔记—Rosenblatt感知器收敛算法C++实现

    Rosenblatt感知器收敛算法C++实现 算法概述 自己用C++实现了下,测试的例子和模式用的都是双月分类模型,关于双月分类相关看之前的那个笔记: https://blog.csdn.net/u0 ...

  9. 机器学习(Machine Learning)、深度学习(Deep Learning)、NLP面试中常考到的知识点和代码实现

    网址:https://github.com/NLP-LOVE/ML-NLP 此项目是机器学习(Machine Learning).深度学习(Deep Learning).NLP面试中常考到的知识点和代 ...

最新文章

  1. IDEA IntelliJ 如何给web项目配置tomcat
  2. 避免误删文件:Linux回收站机制
  3. mysql中文注释语法报错_Linux系统Python配置MySQL详细教程
  4. .NET-记一次架构优化实战与方案-前端优化
  5. python docx包_[Python02] Python-docx包的使用,快速处理 Word 文件!
  6. python登录界面实现密码在明文与星号间切换_两个API让星号密码框显示成明文
  7. 04.监控过程组-偏差分析
  8. 大数据学习笔记23:MR案例——采用Combiner做词频统计
  9. TCP/IP 网络协议
  10. Markdown 标记语言指北
  11. 什么是matlab拟合工具箱,Matlab拟合工具箱的使用
  12. 2020信息系统项目管理师备战1--开篇(项目范围说明书Project Scope Statement)
  13. linux下系统中的文件传输
  14. U盘病毒泛滥 专家解析病毒历史及防范方法
  15. pms解析--未完待续
  16. Python 解决execjs._exceptions.ProgramError: ReferenceError: document is not defined报错问题
  17. 安装配置Apache和php
  18. 域策略(6)——统一映射共享文件夹
  19. 比特率 波特率 数据传输速率 区别;波特率与比特率--转换公式
  20. python读取大智慧数据_大智慧365权息数据格式及读取过程步骤记录

热门文章

  1. VS Code 下载安装并设置中文面板显示
  2. OpenGL与shader区别(三十一)
  3. WebRTC报错:depot_tools/bootstrap_python3: um.8_bin/python3/bin/python3: 没有那个文件或目录(三)
  4. Android之汽车音频
  5. repo forall -c 用法
  6. 详解c++[指针的指针] 和 [指针的引用]
  7. Smali语法汇总(二)
  8. 主板插槽接口相关释义
  9. python处理表格很厉害么_还在用excel?太落伍了,现在都用Python和Jupyter处理数据了...
  10. Apache Log4j2 远程代码执行高危漏洞 解决方案