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 2.7.x 和 3.x 版本的重要区别小结
Nov 28 Python
python写入中英文字符串到文件的方法
May 06 Python
Python获取运行目录与当前脚本目录的方法
Jun 01 Python
python实现排序算法解析
Sep 08 Python
启动Atom并运行python文件的步骤
Nov 09 Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 Python
Python 运行 shell 获取输出结果的实例
Jan 07 Python
python调用百度地图WEB服务API获取地点对应坐标值
Jan 16 Python
Python简易计算器制作方法代码详解
Oct 31 Python
Django框架表单操作实例分析
Nov 04 Python
Python实现七个基本算法的实例代码
Oct 08 Python
详细总结Python常见的安全问题
May 21 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
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
php数据库配置文件一般做法分享
2012/07/07 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
php实现删除空目录的方法
2015/03/16 PHP
PHP生成短网址方法汇总
2016/07/12 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
怎么用javascript进行拖拽
2006/07/20 Javascript
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
2016/01/01 Javascript
微信小程序 网络请求(GET请求)详解
2016/11/16 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
vue实现全匹配搜索列表内容
2019/09/26 Javascript
Python中使用支持向量机SVM实践
2017/12/27 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
HTML5 贪吃蛇游戏实现思路及源代码
2013/09/03 HTML / CSS
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
求职简历中的自我评价分享
2013/12/08 职场文书
八年级英语教学反思
2014/01/09 职场文书
《美丽的田园》教学反思
2014/03/01 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
父母对孩子说的话
2014/04/12 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
2014年绿化工作总结
2014/12/09 职场文书