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使用Tkinter显示网络图片的方法
Apr 24 Python
Python连接PostgreSQL数据库的方法
Nov 28 Python
Python 用Redis简单实现分布式爬虫的方法
Nov 23 Python
python实现彩票系统
Jun 28 Python
Python动态赋值的陷阱知识点总结
Mar 17 Python
python+jinja2实现接口数据批量生成工具
Aug 28 Python
Pytorch中accuracy和loss的计算知识点总结
Sep 10 Python
使用turtle绘制五角星、分形树
Oct 06 Python
python如何控制进程或者线程的个数
Oct 16 Python
tensorflow2.0教程之Keras快速入门
Feb 20 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 Python
python数字图像处理实现图像的形变与缩放
Jun 28 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类的使用 实例代码讲解
2009/12/28 PHP
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
2011/11/10 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
JQuery中each()的使用方法说明
2010/08/19 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
jquery实现类似淘宝星星评分功能有截图
2014/09/15 Javascript
浅谈JavaScript实现面向对象中的类
2014/12/09 Javascript
如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上
2015/12/26 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
vue-lazyload使用总结(推荐)
2018/11/01 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
js实现录音上传功能
2019/11/22 Javascript
Python自动调用IE打开某个网站的方法
2015/06/03 Python
python之PyMongo使用总结
2017/05/26 Python
python随机数分布random测试
2018/08/27 Python
Pandas库之DataFrame使用的学习笔记
2019/06/21 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
python实现电子词典
2020/03/03 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
canvas画布实现手写签名效果的示例代码
2019/04/23 HTML / CSS
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
英语专业个人求职自荐信
2013/09/21 职场文书
假日旅行社实习自我鉴定
2013/09/24 职场文书
给女儿的表扬信
2014/01/18 职场文书
篮球社团活动总结
2014/06/27 职场文书
借款协议书
2014/09/16 职场文书
企业宣传稿范文
2015/07/23 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书
如何使用SQL Server语句创建表
2022/04/12 SQL Server