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程序与系统shell交互的方式
Apr 09 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
Aug 30 Python
Python中staticmethod和classmethod的作用与区别
Oct 11 Python
Python 访问限制 private public的详细介绍
Oct 16 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
浅谈python的输入输出,注释,基本数据类型
Apr 02 Python
用Python获取摄像头并实时控制人脸的实现示例
Jul 11 Python
python实现最大优先队列
Aug 29 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
浅析python,PyCharm,Anaconda三者之间的关系
Nov 27 Python
python实现从ftp上下载文件的实例方法
Jul 19 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+oracle 分页类
2006/10/09 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
详解Bootstrap按钮
2016/01/04 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
浅谈javascript中的 “ &amp;&amp; ” 和 “ || ”
2017/02/02 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
[02:25]DOTA2英雄基础教程 熊战士
2014/01/03 DOTA
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
Python 多线程抓取图片效率对比
2016/02/27 Python
Python 统计字数的思路详解
2018/05/08 Python
python实现简单多人聊天室
2018/12/11 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
入党申请人的自我鉴定
2013/12/01 职场文书
广告语设计及教案
2014/03/21 职场文书
个人四风对照检查材料
2014/09/26 职场文书
实习生个人总结范文
2015/02/28 职场文书
财务会计求职信范文
2015/03/20 职场文书
2016猴年春节问候语
2015/11/11 职场文书