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 图片验证码代码
Dec 07 Python
Python logging模块学习笔记
May 24 Python
跟老齐学Python之开始真正编程
Sep 12 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
python实现百度语音识别api
Apr 10 Python
详解Python 协程的详细用法使用和例子
Jun 15 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
Pycharm 2020年最新激活码(亲测有效)
Sep 18 Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 Python
django中related_name的用法说明
May 20 Python
Numpy(Pandas)删除全为零的列的方法
Sep 11 Python
判断Python中的Nonetype类型
May 25 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
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
JQuery 写的个性导航菜单
2009/12/24 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
js实现仿京东2级菜单效果(带延时功能)
2015/08/27 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
ajax分页效果(bootstrap模态框)
2017/01/23 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
vue实现购物车列表
2020/06/30 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
详解Python爬虫的基本写法
2016/01/08 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
Python 可视化神器Plotly详解
2020/12/26 Python
HTML5为输入框添加语音输入功能的实现方法
2017/02/06 HTML / CSS
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
大学生个人总结的自我评价
2013/10/05 职场文书
毕业生个人的求职信范文
2013/12/03 职场文书
《散步》教学反思
2014/03/02 职场文书
副董事长岗位职责
2014/04/02 职场文书
家庭困难证明
2014/10/12 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js