写在前面:感知器有一个问题,当面对的数据集不是线性可分的时候,『感知器规则』可能无法收敛,这意味着我们永远也无法完成一个感知器的训练。为了解决这个问题,我们使用一个可导线性函数来替代感知器的阶跃函数,这种感知器就叫做线性单元。线性单元在面对线性不可分的数据集时,会收敛到一个最佳的近似值。

此篇文章涉及到的主要知识点是线性单元模型的实现,与感知器对比,只有激活函数的不同。本段代码中的线性函数是f(x)=x,大家可以自行更改激活函数,比如更改为sigmod函数。

代码如下(python3)

#!/usr/bin/env python
# -*- coding: UTF-8 -*-from __future__ import print_function
from functools import reduceclass VectorOp(object):"""实现向量计算操作"""def dot(x, y):"""计算两个向量x和y的内积"""# 首先把x[x1,x2,x3...]和y[y1,y2,y3,...]按元素相乘# 变成[x1*y1, x2*y2, x3*y3]# 然后利用reduce求和return reduce(lambda a, b: a + b, VectorOp.element_multiply(x, y), 0.0)@staticmethoddef element_multiply(x, y):"""将两个向量x和y按元素相乘"""# 首先把x[x1,x2,x3...]和y[y1,y2,y3,...]打包在一起# 变成[(x1,y1),(x2,y2),(x3,y3),...]# 然后利用map函数计算[x1*y1, x2*y2, x3*y3]return list(map(lambda x_y: x_y[0] * x_y[1], zip(x, y)))@staticmethoddef element_add(x, y):"""将两个向量x和y按元素相加"""# 首先把x[x1,x2,x3...]和y[y1,y2,y3,...]打包在一起# 变成[(x1,y1),(x2,y2),(x3,y3),...]# 然后利用map函数计算[x1+y1, x2+y2, x3+y3]return list(map(lambda x_y: x_y[0] + x_y[1], zip(x, y)))@staticmethoddef scala_multiply(v, s):"""将向量v中的每个元素和标量s相乘"""return map(lambda e: e * s, v)class Perceptron(object):def __init__(self, input_num, activator):"""初始化感知器,设置输入参数的个数,以及激活函数。激活函数的类型为double -> double"""self.activator = activator# 权重向量初始化为0self.weights = [0.0] * input_num# 偏置项初始化为0self.bias = 0.0def __str__(self):"""打印学习到的权重、偏置项"""return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)def predict(self, input_vec):"""输入向量,输出感知器的计算结果"""# 计算向量input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]的内积# 然后加上biasreturn self.activator(VectorOp.dot(input_vec, self.weights) + self.bias)def train(self, input_vecs, labels, iteration, rate):"""输入训练数据:一组向量、与每个向量对应的label;以及训练轮数、学习率"""for i in range(iteration):self._one_iteration(input_vecs, labels, rate)def _one_iteration(self, input_vecs, labels, rate):"""一次迭代,把所有的训练数据过一遍"""# 把输入和输出打包在一起,成为样本的列表[(input_vec, label), ...]# 而每个训练样本是(input_vec, label)samples = zip(input_vecs, labels)# 对每个样本,按照感知器规则更新权重for (input_vec, label) in samples:# 计算感知器在当前权重下的输出output = self.predict(input_vec)# 更新权重self._update_weights(input_vec, output, label, rate)def _update_weights(self, input_vec, output, label, rate):"""按照感知器规则更新权重"""# 首先计算本次更新的delta# 然后把input_vec[x1,x2,x3,...]向量中的每个值乘上delta,得到每个权重更新# 最后再把权重更新按元素加到原先的weights[w1,w2,w3,...]上delta = label - outputself.weights = VectorOp.element_add(self.weights, VectorOp.scala_multiply(input_vec, rate * delta))# 更新biasself.bias += rate * delta#定义激活函数f
f = lambda x: xclass LinearUnit(Perceptron):def __init__(self, input_num):'''初始化线性单元,设置输入参数的个数'''Perceptron.__init__(self, input_num, f)def get_training_dataset():'''捏造5个人的收入数据'''# 构建训练数据# 输入向量列表,每一项是工作年限input_vecs = [[5], [3], [8], [1.4], [10.1]]# 期望的输出列表,月薪,注意要与输入一一对应labels = [5500, 2300, 7600, 1800, 11400]return input_vecs, labels    def train_linear_unit():'''使用数据训练线性单元'''# 创建感知器,输入参数的特征数为1(工作年限)lu = LinearUnit(1)# 训练,迭代10轮, 学习速率为0.01input_vecs, labels = get_training_dataset()lu.train(input_vecs, labels, 10, 0.01)#返回训练好的线性单元return ludef plot(linear_unit):import matplotlib.pyplot as pltinput_vecs, labels = get_training_dataset()fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(map(lambda x: x[0], input_vecs), labels)weights = linear_unit.weightsbias = linear_unit.biasx = range(0,12,1)y = map(lambda x:weights[0] * x + bias, x)ax.plot(x, y)plt.show()if __name__ == '__main__': '''训练线性单元'''linear_unit = train_linear_unit()# 打印训练获得的权重print (linear_unit)# 测试print ('Work 3.4 years, monthly salary = %.2f' % linear_unit.predict([3.4]))print ('Work 15 years, monthly salary = %.2f' % linear_unit.predict([15]))print ('Work 1.5 years, monthly salary = %.2f' % linear_unit.predict([1.5]))print ('Work 6.3 years, monthly salary = %.2f' % linear_unit.predict([6.3]))plot(linear_unit)

参考资料:https://www.zybuluo.com/hanbingtao/note/448086

根据工作年限预测工资python代码实现相关推荐

  1. 【负荷预测】基于灰色预测算法的负荷预测(Python代码实现)

    目录 1 概述 2 流程图 3 入门算例  4 基于灰色预测算法的负荷预测(Python代码实现) 1 概述 "由于数据列的离散性,信息时区内将出现空集(不包含信息的定时区),因此只能按近似 ...

  2. 基于ANFIS的股票价格预测附Python代码

    基于ANFIS的股票价格预测附Python代码 在金融领域,股票价格预测一直是一个重要的问题.随着机器学习技术的发展,人们开始尝试使用神经网络等方法进行股票价格的预测. ANFIS(自适应网络基石推理 ...

  3. 机械故障预测(Python代码实现)

    目录 1 概述 2 问题 3 解答(Python代码实现) 3.1 任务3 3.2 任务4 1 概述 制造业是国民经济的主体,近十年来,嫦娥探月.祝融探火.北斗组网,一大批重大标志性创新成果引领中国制 ...

  4. 基于Adam算法优化GRU神经网络的短期负荷预测(Python代码实现)

    目录 1 Adam优化算法 2 Adam算法中的学习率衰减策略 3 GRU神经网络 4 运行结果 5 参考文献 6 Python代码实现 1 Adam优化算法 2 Adam算法中的学习率衰减策略 该文 ...

  5. 美国队长的工资 python代码-Python到底是什么鬼?广科学姐靠它拿了5个offer!

    原标题:Python到底是什么鬼?广科学姐靠它拿了5个offer! 最近,网上流传着一个恐怖的鬼故事. 2020年即将完结,距离2021年仅有70多天--知道真相的小苑子眼泪掉下来. 想起自己年初信誓 ...

  6. 美国队长的工资 python代码-Python入门必学,用Python练习画个美队盾牌

    0 环境 Python版本:3.6.6 操作系统:Mac OS Mojave 10.14.2 1 引言 最近我媳妇每天晚上吃饭时候也拿手机看,上厕所也在看. 看着看着还会笑?WTF?你在干嘛呢? 没错 ...

  7. 美国队长的工资 python代码-用Python绘制美国队长盾牌

    结合中学的三角函数知识,采用Python函数方法,用turtle来实现美国队长盾牌的绘制.让我们开始学习吧! 阶段难度:??? image.png 美国队长之盾的外表涂装与美国国旗相似,由红色(象征勇 ...

  8. 美国队长的工资 python代码-Python画个美国队长队盾牌实例教程

    Python画个美队盾代码 0 环境 Python版本:3.6.6 操作系统:Mac OS Mojave 10.14.2 1 引言 最近我媳妇每天晚上吃饭时候也拿手机看,上厕所也在看. 看着看着还会笑 ...

  9. 美国队长的工资 python代码-Python有趣的小案例-美国队长盾牌

    # 导入 turtle 模块 # 模块是 python 自带的工具箱,这里将工具箱导入就能使用了 # turtle 模块是 python 用来画图的工具箱 import turtle # 将 turt ...

最新文章

  1. linux下打印机共享及监控
  2. JavaScript 要点(十四)HTML DOM 元素(节点)
  3. ant 改变表格数据_学不会这几个操作,面试时千万别说自己精通数据分析
  4. 深入理解Oracle表(5):三大表连接方式详解之Hash Join的定义,原理,算法,成本,模式和位图
  5. VTK:Points之FitImplicitFunction
  6. 如何删除eclipse多余的工作空间
  7. c html导出成word,html转word-html如何转换成WORD
  8. php_l3arning_notes_2
  9. 计算机等级考试二级c++2013 南开题库 答案光碟,全国计算机等级考试二级C++上机题库试卷一2013年.pdf...
  10. DataGear 1.13.1 发布,数据可视化分析平台
  11. dsp28335时钟 总结
  12. openGauss支持国密SM3和SM4算法
  13. centos使用wget下载jdk8
  14. Modbus协议解析
  15. 如何利用微信答题小程序实现盈利呢
  16. 网络协议和浏览器到网络简单攻防实现的探索(二)
  17. 读取.dwg文件“曲线救国”之读取.dxf
  18. Apple MDM Bypass 免越狱绕过MDM配置锁 免费
  19. HTML5期末大作业:电商购物网站设计——红色的服装商城B2C网站(40页) HTML+CSS+JavaScript 电商购物功能齐全 dw网页设计 大学生商城购物网站
  20. pwn的学习8 leg

热门文章

  1. how to come in an investnent bank team
  2. human-robotic eco system
  3. Cisco Ensoft
  4. Agile Development
  5. 吹爆google colab
  6. TCP粘包产生的原因
  7. windows 如何使用4GB(开启3GB和PAE)
  8. linux网络_防火墙-iptables基础
  9. BurpSuite 代理设置的小技巧
  10. Console-算法[]-数组求最大值和最小值(只能遍历一次)