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入门篇之面向对象
Oct 20 Python
使用beaker让Facebook的Bottle框架支持session功能
Apr 23 Python
python实现linux下使用xcopy的方法
Jun 28 Python
Python中运算符&quot;==&quot;和&quot;is&quot;的详解
Oct 08 Python
ubuntu17.4下为python和python3装上pip的方法
Jun 12 Python
win10系统下Anaconda3安装配置方法图文教程
Sep 19 Python
python3.x实现base64加密和解密
Mar 28 Python
关于Python 常用获取元素 Driver 总结
Nov 24 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
Feb 28 Python
parser.add_argument中的action使用
Apr 20 Python
python使用QQ邮箱实现自动发送邮件
Jun 22 Python
python 实现一个简单的线性回归案例
Dec 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
php 前一天或后一天的日期
2008/06/28 PHP
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
PHP中=赋值操作符对不同数据类型的不同行为
2011/01/02 PHP
PHP多态代码实例
2015/06/26 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
2015/08/23 PHP
PHP开发实现微信退款功能示例
2017/11/25 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
php redis setnx分布式锁简单原理解析
2020/10/23 PHP
超级退弹代码
2008/07/07 Javascript
Ext grid 添加右击菜单
2009/11/26 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
2016/01/26 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
微信小程序五星评分效果实现代码
2017/04/06 Javascript
vue2.0 实现导航守卫(路由守卫)
2018/05/21 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
小程序Request的另类用法详解
2019/08/09 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
Python基于DES算法加密解密实例
2015/06/03 Python
Python中装饰器高级用法详解
2017/12/25 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
Python模块、包(Package)概念与用法分析
2019/05/31 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
python中wheel的用法整理
2020/06/15 Python
Python实现上下文管理器的方法
2020/08/07 Python
Python利用socket模块开发简单的端口扫描工具的实现
2021/01/27 Python
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
大学生个人自荐信样本
2014/03/02 职场文书
巴黎圣母院观后感
2015/06/10 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS