本文目录:

1. 感知器

2. 感知器的训练法则

3. 梯度下降和delta法则

4. python实现

1. 感知器[1]

人工神经网络以感知器(perceptron)为基础。感知器以一个实数值向量作为输入,计算这些输入的线性组合,然后如果结果大于某个阈值,就输出1,否则输出-1(或0)。更精确地,如果输入为$x_1$到$x_n$,那么感知器计算的输出为:

其中,$w_i$是实数常量,叫做权值,用来决定输入$x_i$对感知器输出的贡献率。因为仅以一个阈值来决定输出,我们有时也把这种感知器叫做硬限幅感知器,当输出为1和-1时,也叫做sgn感知器(符号感知器)。

2. 感知器的训练法则[1]

感知器的学习任务是决定一个权向量,它可以是感知器对于给定的训练样例输出正确的1或-1。为得到可接受的权向量,一种办法是从随机的权值开始,然后反复应用这个感知器到每一个训练样例,只要它误分类样例就修改感知器的权值。重复这个过程,直到感知器正确分类所有的训练样例。每一步根据感知器训练法则(perceptron Iraining rule) 来修改权值:${w_{i + 1}} \leftarrow {w_i} + \Delta {w_i}$,其中$\Delta {w_i} = \eta (t - o){x_i}$,$\eta$是学习速率,用来缓和或者加速每一步调整权值的程度。

3. 梯度下降和delta法则[1]

4. python实现[2]

训练数据:总共500个训练样本,链接https://pan.baidu.com/s/1qWugzIzdN9qZUnEw4kWcww,提取码:ncuj

损失函数:均方误差(MSE)

代码如下:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3.  
  4. class hardlim():
  5. def __init__(self, path):
  6. self.path = path
  7.  
  8. def file2matrix(self, delimiter):
  9. fp = open(self.path, 'r')
  10. content = fp.read() # content现在是一行字符串,该字符串包含文件所有内容
  11. fp.close()
  12. rowlist = content.splitlines() # 按行转换为一维表
  13. # 逐行遍历
  14. # 结果按分隔符分割为行向量
  15. recordlist = [list(map(float, row.split(delimiter))) for row in rowlist if row.strip()]
  16. return np.mat(recordlist)
  17.  
  18. def drawScatterbyLabel(self, dataSet):
  19. m, n = dataSet.shape
  20. target = np.array(dataSet[:, -1])
  21. target = target.squeeze() # 把二维数据变为一维数据
  22. for i in range(m):
  23. if target[i] == 0:
  24. plt.scatter(dataSet[i, 0], dataSet[i, 1], c='blue', marker='o')
  25. if target[i] == 1:
  26. plt.scatter(dataSet[i, 0], dataSet[i, 1], c='red', marker='o')
  27.  
  28. def buildMat(self, dataSet):
  29. m, n = dataSet.shape
  30. dataMat = np.zeros((m, n))
  31. dataMat[:, 0] = 1
  32. dataMat[:, 1:] = dataSet[:, :-1]
  33. return dataMat
  34.  
  35. def classfier(self, x):
  36. x[x >= 0.5] = 1
  37. x[x < 0.5] = 0
  38. return x
  39.  
  40. if __name__ == '__main__':
  41. hardlimit = hardlim('testSet.txt')
  42.  
  43. print('1. 导入数据')
  44. inputData = hardlimit.file2matrix('\t')
  45. target = inputData[:, -1]
  46. m, n = inputData.shape
  47. print('size of input data: {} * {}'.format(m, n))
  48.  
  49. print('2. 按分类绘制散点图')
  50. hardlimit.drawScatterbyLabel(inputData)
  51.  
  52. print('3. 构建系数矩阵')
  53. dataMat = hardlimit.buildMat(inputData)
  54.  
  55. alpha = 0.1 # learning rate
  56. steps = 600 # total iterations
  57. weights = np.ones((n, 1)) # initialize weights
  58. weightlist = []
  59.  
  60. print('4. 训练模型')
  61. for k in range(steps):
  62. output = hardlimit.classfier(dataMat * np.mat(weights))
  63. errors = target - output
  64. print('iteration: {} error_norm: {}'.format(k, np.linalg.norm(errors)))
  65. weights = weights + alpha*dataMat.T*errors # 梯度下降
  66. weightlist.append(weights)
  67.  
  68. print('5. 画出训练过程')
  69. X = np.linspace(-5, 15, 301)
  70. weights = np.array(weights)
  71. length = len(weightlist)
  72. for idx in range(length):
  73. if idx % 100 == 0:
  74. weight = np.array(weightlist[idx])
  75. Y = -(weight[0] + X * weight[1]) / weight[2]
  76. plt.plot(X, Y)
  77. plt.annotate('hplane:' + str(idx), xy=(X[0], Y[0]))
  78. plt.show()
  79.  
  80. print('6. 应用模型到测试数据中')
  81. testdata = np.mat([-0.147324, 2.874846]) # 测试数据
  82. m, n = testdata.shape
  83. testmat = np.zeros((m, n+1))
  84. testmat[:, 0] = 1
  85. testmat[:, 1:] = testdata
  86. result = sum(testmat * (np.mat(weights)))
  87. if result < 0.5:
  88. print(0)
  89. else:
  90. print(1)

训练结果如下:

【参考文献】

《机器学习》Mitshell,第四章

《机器学习算法原理与编程实践》郑捷,第五章5.2.2

感知器做二分类的原理及python实现的更多相关文章

  1. softmax分类算法原理(用python实现)

    逻辑回归神经网络实现手写数字识别 如果更习惯看Jupyter的形式,请戳Gitthub_逻辑回归softmax神经网络实现手写数字识别.ipynb 1 - 导入模块 import numpy as n ...

  2. 逻辑回归(Logistic Regression)二分类原理及python实现

    本文目录: 1. sigmoid function (logistic function) 2. 逻辑回归二分类模型 3. 神经网络做二分类问题 4. python实现神经网络做二分类问题 1. si ...

  3. Python_sklearn机器学习库学习笔记(七)the perceptron(感知器)

    一.感知器 感知器是Frank Rosenblatt在1957年就职于Cornell航空实验室时发明的,其灵感来自于对人脑的仿真,大脑是处理信息的神经元(neurons)细胞和链接神经元细胞进行信息传 ...

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

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

  5. 【2008nmj】Logistic回归二元分类感知器算法.docx

    给你一堆样本数据(xi,yi),并标上标签[0,1],让你建立模型(分类感知器二元),对于新给的测试数据进行分类. 要将两种数据分开,这是一个分类问题,建立数学模型,(x,y,z),z指示[0,1], ...

  6. 人工神经网络(从原理到代码) Step 01 感知器 梯度下降

    版权声明: 本文由SimonLiang所有,发布于http://www.cnblogs.com/idignew/.如果转载,请注明出处,在未经作者同意下将本文用于商业用途,将追究其法律责任. 感知器 ...

  7. tensorflow学习笔记——自编码器及多层感知器

    1,自编码器简介 传统机器学习任务很大程度上依赖于好的特征工程,比如对数值型,日期时间型,种类型等特征的提取.特征工程往往是非常耗时耗力的,在图像,语音和视频中提取到有效的特征就更难了,工程师必须在这 ...

  8. python之感知器-从零开始学深度学习

    感知器-从零开始学深度学习 未来将是人工智能和大数据的时代,是各行各业使用人工智能在云上处理大数据的时代,深度学习将是新时代的一大利器,在此我将从零开始记录深度学习的学习历程. 我希望在学习过程中做到 ...

  9. 深度学习炼丹术 —— Taoye不讲码德,又水文了,居然写感知器这么简单的内容

    手撕机器学习系列文章就暂时更新到此吧,目前已经完成了支持向量机SVM.决策树.KNN.贝叶斯.线性回归.Logistic回归,其他算法还请允许Taoye在这里先赊个账,后期有机会有时间再给大家补上. ...

随机推荐

  1. CF732F Tourist Reform[边双缩点]

    题意:给无向图每一条边定向,使得每个点可达点数$R_i$最小值尽可能大,求方案. 条件反射想到二分答案,然后看怎么检验,发现要让所有点$R_i$大于等于某一个值,首先我们关注某些特殊的子图:如果有环的 ...

  2. Idea中Module is not specified解决办法

    打开idea,想跑一个类,但是,给我报了一个红叉: 当我点击run的时候,弹出来一个框: “Error:Module not specified”  Module 未指定 “这个原因是项目文件夹有修改 ...

  3. CloseableHttpClient设置超时

    Java开发我们常常需要和第三方系统进行通信,通信的方式有多种,如dubbo方式,webservice,微服务和CloseableHttpClient等方式,常涉及到超时问题,这里主要说的是Close ...

  4. @JsonIgnore等

    作用:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响. 使用方法:一般标记在属性或者方法上,返回的json数据即不包含该属性. 场景模拟: 需要把一个List< ...

  5. 【线性代数】2-7:转置与变换(Transposes and Permutation)

    title: [线性代数]2-7:转置与变换(Transposes and Permutation) toc: true categories: Mathematic Linear Algebra d ...

  6. Meathill的博客地址

    https://blog.meathill.com/ 安装mysql: https://blog.meathill.com/tech/setup-windows-subsystem-linux-for ...

  7. P1359 租用游艇 && P3905 道路重建 ------Floyd算法

    P1359 租用游艇   原题链接https://www.luogu.org/problemnew/show/P1359 P3905 道路重建   原题链接https://www.luogu.org/ ...

  8. Linux+CLion+树莓派远程编译时,Cmake编译出现undefined reference to 'dlopen'的解决办法

    在Clion中链接讯飞的语音库并传至树莓派上编译时,出现如下错误. undefined reference to `dlopen' undefined reference to `dlclose' u ...

  9. Django基础之template

    1. 模板系统的介绍 def current_datetime(request): now = datetime.datetime.now() html = "<html>< ...

  10. UVA 12501 Bulky process of bulk reduction ——(线段树成段更新)

    和普通的线段树不同的是,查询x~y的话,给出的答案是第一个值的一倍加上第二个值的两倍一直到第n个值的n倍. 思路的话,就是关于query和pushup的方法.用一个新的变量sum记录一下这个区间里面按 ...