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 相关文章推荐
本地文件上传到七牛云服务器示例(七牛云存储)
Jan 11 Python
深入讲解Python中面向对象编程的相关知识
May 25 Python
在java中如何定义一个抽象属性示例详解
Aug 18 Python
python实现比较文件内容异同
Jun 22 Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 Python
解决Python pandas plot输出图形中显示中文乱码问题
Dec 12 Python
python字符串查找函数的用法详解
Jul 08 Python
浅谈python多进程共享变量Value的使用tips
Jul 16 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
django数据模型中null和blank的区别说明
Sep 02 Python
python爬虫工具例举说明
Nov 30 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
利用static实现表格的颜色隔行显示
2006/10/09 PHP
用PHP写的MySQL数据库用户认证系统代码
2007/03/22 PHP
Destoon模板制作简明教程
2014/06/20 PHP
CI框架中redis缓存相关操作文件示例代码
2016/05/17 PHP
让焦点自动跳转
2006/07/01 Javascript
2012年开发人员的16款新鲜的jquery插件体验分享
2012/12/28 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
js运动动画的八个知识点
2015/03/12 Javascript
javascript中使用new与不使用实例化对象的区别
2015/06/22 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
js获取本机操作系统类型的两种方法
2015/12/19 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
python 编码规范整理
2018/05/05 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
Django如何实现上传图片功能
2019/08/16 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
利用python 读写csv文件
2020/09/10 Python
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
2013/01/30 HTML / CSS
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
Html5定位终极解决方案
2020/02/05 HTML / CSS
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
学习党章思想汇报
2014/01/07 职场文书
科研先进个人典型材料
2014/01/31 职场文书
CAD制图人员的自荐信
2014/02/07 职场文书
python基础之文件处理知识总结
2021/05/23 Python
Spring Cloud OpenFeign模版化客户端
2022/06/25 Java/Android