python实现感知机模型的示例


Posted in Python onSeptember 30, 2020
from sklearn.linear_model import Perceptron
import argparse #一个好用的参数传递模型
import numpy as np
from sklearn.datasets import load_iris #数据集
from sklearn.model_selection import train_test_split #训练集和测试集分割
from loguru import logger #日志输出,不清楚用法

#python is also oop 
class PerceptronToby():
  """
  n_epoch:迭代次数
  learning_rate:学习率
  loss_tolerance:损失阈值,即损失函数达到极小值的变化量
  """
  def __init__(self, n_epoch = 500, learning_rate = 0.1, loss_tolerance = 0.01):
    self._n_epoch = n_epoch
    self._lr = learning_rate
    self._loss_tolerance = loss_tolerance
  
  """训练模型,即找到每个数据最合适的权重以得到最小的损失函数"""
  def fit(self, X, y):
    # X:训练集,即数据集,每一行是样本,每一列是数据或标签,一样本包括一数据和一标签
    # y:标签,即1或-1
    n_sample, n_feature = X.shape #剥离矩阵的方法真帅

    #均匀初始化参数
    rnd_val = 1/np.sqrt(n_feature)
    rng = np.random.default_rng()
    self._w = rng.uniform(-rnd_val,rnd_val,size = n_feature)
    #偏置初始化为0
    self._b = 0

    #开始训练了,迭代n_epoch次
    num_epoch = 0 #记录迭代次数
    prev_loss = 0 #前损失值
    while True:
      curr_loss = 0 #现在损失值
      wrong_classify = 0 #误分类样本

      #一次迭代对每个样本操作一次
      for i in range(n_sample):
        #输出函数
        y_pred = np.dot(self._w,X[i]) + self._b
        #损失函数
        curr_loss += -y[i] * y_pred
        # 感知机只对误分类样本进行参数更新,使用梯度下降法
        if y[i] * y_pred <= 0:
          self._w += self._lr * y[i] * X[i]
          self._b += self._lr * y[i]
          wrong_classify += 1

      num_epoch += 1
      loss_diff = curr_loss - prev_loss
      prev_loss = curr_loss
      # 训练终止条件:
      # 1. 训练epoch数达到指定的epoch数时停止训练
      # 2. 本epoch损失与上一个epoch损失差异小于指定的阈值时停止训练
      # 3. 训练过程中不再存在误分类点时停止训练
      if num_epoch >= self._n_epoch or abs(loss_diff) < self._loss_tolerance or wrong_classify == 0:
        break


  """预测模型,顾名思义"""
  def predict(self, x):
    """给定输入样本,预测其类别"""
    y_pred = np.dot(self._w, x) + self._b
    return 1 if y_pred >= 0 else -1

#主函数
def main():
  #参数数组生成
  parser = argparse.ArgumentParser(description="感知机算法实现命令行参数")
  parser.add_argument("--nepoch", type=int, default=500, help="训练多少个epoch后终止训练")
  parser.add_argument("--lr", type=float, default=0.1, help="学习率")
  parser.add_argument("--loss_tolerance", type=float, default=0.001, help="当前损失与上一个epoch损失之差的绝对值小于该值时终止训练")
  args = parser.parse_args()
  #导入数据
  X, y = load_iris(return_X_y=True)
  # print(y)
  y[:50] = -1
  # 分割数据
  xtrain, xtest, ytrain, ytest = train_test_split(X[:100], y[:100], train_size=0.8, shuffle=True)
  # print(xtest)
  #调用并训练模型
  model = PerceptronToby(args.nepoch, args.lr, args.loss_tolerance)
  model.fit(xtrain, ytrain)

  n_test = xtest.shape[0]
  # print(n_test)
  n_right = 0
  for i in range(n_test):
    y_pred = model.predict(xtest[i])
    if y_pred == ytest[i]:
      n_right += 1
    else:
      logger.info("该样本真实标签为:{},但是toby模型预测标签为:{}".format(ytest[i], y_pred))
  logger.info("toby模型在测试集上的准确率为:{}%".format(n_right * 100 / n_test))

  skmodel = Perceptron(max_iter=args.nepoch)
  skmodel.fit(xtrain, ytrain)
  logger.info("sklearn模型在测试集上准确率为:{}%".format(100 * skmodel.score(xtest, ytest)))
if __name__ == "__main__":
  main()```

视频参考地址

以上就是python实现感知机模型的示例的详细内容,更多关于python 实现感知机模型的示例代码的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用python编写脚本获取手机当前应用apk的信息
Jul 21 Python
Python最基本的输入输出详解
Apr 25 Python
深入讲解Python中面向对象编程的相关知识
May 25 Python
详解Django通用视图中的函数包装
Jul 21 Python
python批量导入数据进Elasticsearch的实例
May 30 Python
Python中psutil的介绍与用法
May 02 Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 Python
python使用Pandas库提升项目的运行速度过程详解
Jul 12 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
Python装饰器的应用场景代码总结
Apr 10 Python
Python3.8安装Pygame教程步骤详解
Aug 14 Python
浅谈python中的多态
Jun 15 Python
python 实现关联规则算法Apriori的示例
Sep 30 #Python
Python之字典添加元素的几种方法
Sep 30 #Python
Python之字典对象的几种创建方法
Sep 30 #Python
python 实现朴素贝叶斯算法的示例
Sep 30 #Python
Python字典取键、值对的方法步骤
Sep 30 #Python
Python根据字典的值查询出对应的键的方法
Sep 30 #Python
python字典通过值反查键的实现(简洁写法)
Sep 30 #Python
You might like
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
jQuery 点击图片跳转上一张或下一张功能的实现代码
2010/03/12 Javascript
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
bootstrap手风琴制作方法详解
2017/01/11 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
详解创建自定义的Angular Schematics
2018/06/06 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
vue学习笔记之作用域插槽实例分析
2020/02/01 Javascript
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
2017/11/29 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
python 读取yaml文件的两种方法(在unittest中使用)
2020/12/01 Python
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
公务员培训自我鉴定
2013/09/19 职场文书
大学生应聘自荐信
2013/10/11 职场文书
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
生产现场禁烟通知
2015/04/23 职场文书