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协程的用法和例子详解
Sep 09 Python
详解pyqt5 动画在QThread线程中无法运行问题
May 05 Python
Python实现的爬取网易动态评论操作示例
Jun 06 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
python pytest进阶之fixture详解
Jun 27 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
Aug 20 Python
Python封装成可带参数的EXE安装包实例
Aug 24 Python
Python hashlib模块实例使用详解
Dec 24 Python
tensorflow多维张量计算实例
Feb 11 Python
python小程序基于Jupyter实现天气查询的方法
Mar 27 Python
基于python 取余问题(%)详解
Jun 03 Python
OpenCV 之按位运算举例解析
Jun 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 高手之路(一)
2006/10/09 PHP
PHP 地址栏信息的获取代码
2009/01/07 PHP
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
2011/06/24 PHP
php数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
php正则表达式学习笔记
2015/11/13 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
js打开windows上的可执行文件示例
2014/05/27 Javascript
JQUERY简单按钮轮换选中效果实现方法
2015/05/07 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
2015/08/11 Javascript
JavaScript的jQuery库中ready方法的学习教程
2015/08/14 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
JavaScript实现格式化字符串函数String.format
2016/12/16 Javascript
ES6概念 ymbol.for()方法
2016/12/25 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
python读取图片任意范围区域
2019/01/23 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
高档奢华时装在线目的地:FORWARD by elyse walker
2017/10/16 全球购物
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
学生励志演讲稿
2014/01/06 职场文书
初中地理教学反思
2014/01/11 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
宣传保护环境的公益广告词
2014/03/13 职场文书
卫生标语大全
2014/06/21 职场文书
机关保密工作承诺书
2015/05/04 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
大学生支教感言
2015/08/01 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python