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进阶教程之函数对象(函数也是对象)
Aug 30 Python
python爬取NUS-WIDE数据库图片
Oct 05 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
May 29 Python
python读取.mat文件的数据及实例代码
Jul 12 Python
Python 分发包中添加额外文件的方法
Aug 16 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
python next()和iter()函数原理解析
Feb 07 Python
tensorflow 实现从checkpoint中获取graph信息
Feb 10 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
python 三种方法实现对Excel表格的读写
Nov 19 Python
windows系统Tensorflow2.x简单安装记录(图文)
Jan 18 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遍历数组的几种方法
2012/03/22 PHP
PHP简单创建压缩图的方法
2016/08/24 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
2017/06/09 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
PHP抽象类和接口用法实例详解
2019/07/20 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
python转换摩斯密码示例
2014/02/16 Python
python私有属性和方法实例分析
2015/01/15 Python
python类的继承实例详解
2017/03/30 Python
利用python批量修改word文件名的方法示例
2017/10/17 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
Tensorflow实现酸奶销量预测分析
2019/07/19 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
Python模块的制作方法实例分析
2019/12/21 Python
最小二乘法及其python实现详解
2020/02/24 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
如何做好工作总结!
2019/04/10 职场文书