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中的True,False条件判断实例分析
Jan 12 Python
python实现数据图表
Jul 29 Python
Django 导出 Excel 代码的实例详解
Aug 11 Python
Python3安装Scrapy的方法步骤
Nov 23 Python
python定向爬取淘宝商品价格
Feb 27 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
Nov 06 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
Apr 29 Python
python微信撤回监测代码
Apr 29 Python
Django 项目通过加载不同env文件来区分不同环境
Feb 17 Python
Selenium常见异常解析及解决方案示范
Apr 10 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 Python
python 发送get请求接口详解
Nov 17 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
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
常用javascript表单验证汇总
2020/07/20 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
javascript简易画板开发
2020/04/12 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
js仿微博动态栏功能
2017/02/22 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
python xlsxwriter创建excel图表的方法
2018/06/11 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
How to spawning asynchronous work in J2EE
2016/08/29 面试题
高中生自我评价个人范文
2013/11/09 职场文书
亲子拓展活动方案
2014/02/20 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
农林环境专业求职信
2014/03/13 职场文书
实习单位鉴定评语
2014/04/26 职场文书
党员个人自我剖析材料
2014/10/08 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL