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 23 Python
Python装饰器的函数式编程详解
Feb 27 Python
python简单实现基数排序算法
May 16 Python
python中字典(Dictionary)用法实例详解
May 30 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
Python 旋转打印各种矩形的方法
Jul 09 Python
使用Tensorflow将自己的数据分割成batch训练实例
Jan 20 Python
numpy中生成随机数的几种常用函数(小结)
Aug 18 Python
python中的对数log函数表示及用法
Dec 09 Python
教你使用Python pypinyin库实现汉字转拼音
May 27 Python
用Python将GIF动图分解成多张静态图片
Jun 11 Python
Python面试不修改数组找出重复的数字
May 20 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/07/05 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
零基础php编程好学吗
2019/10/11 PHP
Discuz! 6.1_jQuery兼容问题
2008/09/23 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
有效提高JavaScript执行效率的几点知识
2015/01/31 Javascript
js文字横向滚动特效
2015/11/11 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
python 实现学生信息管理系统的示例
2020/11/28 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
Java语言的优势
2015/01/10 面试题
普通员工辞职信
2014/01/17 职场文书
2014年前台接待工作总结
2014/12/05 职场文书
文明家庭事迹材料
2014/12/20 职场文书
三峡人家导游词
2015/01/31 职场文书
2015年感恩节演讲稿(优选篇)
2015/03/20 职场文书
2016大一新生军训心得体会
2016/01/11 职场文书