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爬虫之神器正则表达式
Nov 06 Python
Python脚本文件打包成可执行文件的方法
Jun 02 Python
编写Python小程序来统计测试脚本的关键字
Mar 12 Python
python opencv设置摄像头分辨率以及各个参数的方法
Apr 02 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
python2和python3的输入和输出区别介绍
Nov 20 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 Python
Python如何操作docker redis过程解析
Aug 10 Python
解析python 类方法、对象方法、静态方法
Aug 15 Python
python的setattr函数实例用法
Dec 16 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留言本实例代码
2010/05/09 PHP
php disk_free_space 返回目录可用空间
2010/05/10 PHP
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
jQuery div层的放大与缩小简单实现代码
2013/03/28 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
js实现文字跑马灯效果
2017/02/23 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
2018/08/27 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
Python代码注释规范代码实例解析
2020/08/14 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
大学老师推荐信
2014/02/25 职场文书
毕业生就业协议书
2014/04/11 职场文书
老干部工作汇报材料
2014/10/28 职场文书
践行党的群众路线心得体会
2014/11/05 职场文书
vue3中的组件间通信
2021/03/31 Vue.js
Java 在线考试云平台的实现
2021/11/23 Java/Android