ld.lld的undefined symbol错误

报错 在编译Android12的代码时,我遇到下面这个错误,提示在链接libpdfium.so时找不到以下符号: CPDF_StreamContentParser::~CPDF_StreamContentParser() CPDF_StreamContentParser::CPDF_StreamContentParser(CPDF_Document*, CPDF_Dictionary*, CPDF_Dictionary*, CFX_Matrix const*, CPDF_PageObjectHolder*, CPDF_Dictionary*, CFX_FloatRect const&, CPDF_AllStates const*, std::__1::set<unsigned char const*, std::__1::less<unsigned char const*>, std::__1::allocator<unsigned char const*> >) CPDF_StreamContentParser::Parse(unsigned char const, unsigned int, unsigned int, unsigned int, std::__1::vector<unsigned int, std::__1::allocator > const&) FAILED: //external/pdfium:libpdfium link libpdfium.so Outputs: out/soong/.intermediates/external/pdfium/libpdfium/android_arm64_armv8-a_shared/unstripped/libpdfium.so Error: exited with code: 1 Command: prebuilts/clang/host/linux-x86/clang-r416183b1/bin/clang++ out/soong/.intermediates/bionic/libc/crtbegin_so/android_arm64_armv8-a/crtbegin_so.o @out/soong/.intermediates/external/pdfium/libpdfium/android_arm64_armv8-a_shared/unstripped/libpdfium.so.rsp -Wl,--whole-archive out/soong/.intermediates/external/pdfium/fpdfsdk/libpdfium-fpdfsdk/android_arm64_armv8-a_static/libpdfium-fpdfsdk.a -Wl,--no-whole-archive out/soong/.intermediates/external/pdfium/core/fpdfapi/edit/libpdfium-edit/android_arm64_armv8-a_static/libpdfium-edit.a out/soong/.intermediates/external/pdfium/fpdfsdk/formfiller/libpdfium-formfiller/android_arm64_armv8-a_static/libpdfium-formfiller.a out/soong/.intermediates/external/pdfium/core/fpdftext/libpdfium-fpdftext/android_arm64_armv8-a_static/libpdfium-fpdftext.a out/soong/.intermediates/external/pdfium/fxjs/libpdfium-fxjs/android_arm64_armv8-a_static/libpdfium-fxjs.a out/soong/.intermediates/external/pdfium/fpdfsdk/pwl/libpdfium-pwl/android_arm64_armv8-a_static/libpdfium-pwl.a out/soong/.intermediates/external/pdfium/core/fpdfdoc/libpdfium-fpdfdoc/android_arm64_armv8-a_static/libpdfium-fpdfdoc.a out/soong/.intermediates/external/pdfium/core/fpdfapi/render/libpdfium-render/android_arm64_armv8-a_static/libpdfium-render.a out/soong/.intermediates/external/pdfium/core/fpdfapi/page/libpdfium-page/android_arm64_armv8-a_static/libpdfium-page.a out/soong/.intermediates/external/pdfium/core/fpdfapi/font/libpdfium-font/android_arm64_armv8-a_static/libpdfium-font.a out/soong/.intermediates/external/pdfium/core/fpdfapi/cmaps/libpdfium-cmaps/android_arm64_armv8-a_static/libpdfium-cmaps.a out/soong/.intermediates/external/pdfium/core/fpdfapi/parser/libpdfium-parser/android_arm64_armv8-a_static/libpdfium-parser.a out/soong/.intermediates/external/pdfium/core/fdrm/libpdfium-fdrm/android_arm64_armv8-a_static/libpdfium-fdrm.a out/soong/.intermediates/external/pdfium/core/fxcodec/libpdfium-fxcodec/android_arm64_armv8-a_static/libpdfium-fxcodec.a out/soong/.

ld.lld的unknown file type错误

报错 在一次编译aosp源码中,出现以下错误: FAILED: //external/pdfium:libpdfium link libpdfium.so [arm] Outputs: out/soong/.intermediates/external/pdfium/libpdfium/android_arm_armv8-a_shared/unstripped/libpdfium.so Error: exited with code: 1 Command: prebuilts/clang/host/linux-x86/clang-r416183b1/bin/clang++ out/soong/.intermediates/bionic/libc/crtbegin_so/android_arm_armv8-a/crtbegin_so.o @out/soong/.intermediates/external/pdfium/libpdfium/android_arm_armv8-a_shared/unstripped/libpdfium.so.rsp -Wl,--whole-archive out/soong/.intermediates/external/pdfium/fpdfsdk/libpdfium-fpdfsdk/android_arm_armv8-a_static/libpdfium-fpdfsdk.a -Wl,--no-whole-archive out/soong/.intermediates/external/pdfium/core/fpdfapi/edit/libpdfium-edit/android_arm_armv8-a_static/libpdfium-edit.a out/soong/.intermediates/external/pdfium/fpdfsdk/formfiller/libpdfium-formfiller/android_arm_armv8-a_static/libpdfium-formfiller.a out/soong/.intermediates/external/pdfium/core/fpdftext/libpdfium-fpdftext/android_arm_armv8-a_static/libpdfium-fpdftext.a out/soong/.intermediates/external/pdfium/fxjs/libpdfium-fxjs/android_arm_armv8-a_static/libpdfium-fxjs.a out/soong/.intermediates/external/pdfium/fpdfsdk/pwl/libpdfium-pwl/android_arm_armv8-a_static/libpdfium-pwl.a out/soong/.intermediates/external/pdfium/core/fpdfdoc/libpdfium-fpdfdoc/android_arm_armv8-a_static/libpdfium-fpdfdoc.a out/soong/.intermediates/external/pdfium/core/fpdfapi/render/libpdfium-render/android_arm_armv8-a_static/libpdfium-render.a out/soong/.intermediates/external/pdfium/core/fpdfapi/page/libpdfium-page/android_arm_armv8-a_static/libpdfium-page.a out/soong/.intermediates/external/pdfium/core/fpdfapi/font/libpdfium-font/android_arm_armv8-a_static/libpdfium-font.a out/soong/.intermediates/external/pdfium/core/fpdfapi/cmaps/libpdfium-cmaps/android_arm_armv8-a_static/libpdfium-cmaps.a out/soong/.intermediates/external/pdfium/core/fpdfapi/parser/libpdfium-parser/android_arm_armv8-a_static/libpdfium-parser.a out/soong/.intermediates/external/pdfium/core/fdrm/libpdfium-fdrm/android_arm_armv8-a_static/libpdfium-fdrm.a out/soong/.intermediates/external/pdfium/core/fxcodec/libpdfium-fxcodec/android_arm_armv8-a_static/libpdfium-fxcodec.a out/soong/.intermediates/external/pdfium/third_party/libpdfium-libopenjpeg2/android_arm_armv8-a_static/libpdfium-libopenjpeg2.a out/soong/.intermediates/external/pdfium/core/fxge/libpdfium-fxge/android_arm_armv8-a_static/libpdfium-fxge.a out/soong/.intermediates/external/pdfium/third_party/libpdfium-agg/android_arm_armv8-a_static/libpdfium-agg.a out/soong/.intermediates/external/pdfium/core/fxcrt/libpdfium-fxcrt/android_arm_armv8-a_static/libpdfium-fxcrt.a out/soong/.intermediates/external/pdfium/third_party/libpdfium-skia_shared/android_arm_armv8-a_static/libpdfium-skia_shared.a out/soong/.intermediates/external/pdfium/third_party/libpdfium-third_party-base/android_arm_armv8-a_static/libpdfium-third_party-base.a out/soong/.intermediates/external/pdfium/third_party/libpdfium-lcms2/android_arm_armv8-a_static/libpdfium-lcms2.a out/soong/.intermediates/external/libcxxabi/libc++demangle/android_arm_armv8-a_static/libc++demangle.a prebuilts/clang/host/linux-x86/clang-r416183b1/lib64/clang/12.0.7/lib/linux/libclang_rt.builtins-arm-android.a out/soong/.intermediates/external/freetype/libft2/android_arm_armv8-a_shared/libft2.so out/soong/.intermediates/external/icu/libicu/libicu/android_arm_armv8-a_shared_current/libicu.so out/soong/.intermediates/external/libjpeg-turbo/libjpeg/android_arm_armv8-a_shared/libjpeg.so out/soong/.intermediates/external/zlib/libz/android_arm_armv8-a_shared/libz.so out/soong/.intermediates/external/libcxx/libc++/android_arm_armv8-a_shared/libc++.so out/soong/.intermediates/bionic/libc/libc/android_arm_armv8-a_shared_current/libc.so out/soong/.intermediates/bionic/libm/libm/android_arm_armv8-a_shared_current/libm.so out/soong/.intermediates/bionic/libdl/libdl/android_arm_armv8-a_shared_current/libdl.so out/soong/.intermediates/bionic/libc/crtend_so/android_arm_armv8-a/obj/bionic/libc/arch-common/bionic/crtend_so.o -o out/soong/.intermediates/external/pdfium/libpdfium/android_arm_armv8-a_shared/unstripped/libpdfium.so -target armv7a-linux-androideabi10000 -Bprebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/arm-linux-androideabi/bin -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--build-id=md5 -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined-version -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_stripped.a -Wl,--exclude-libs,libunwind_llvm.a -Wl,--exclude-libs,libunwind.a -Wl,--icf=safe -fuse-ld=lld -Wl,--pack-dyn-relocs=android+relr -Wl,--no-undefined -Wl,--hash-style=gnu -Wl,-m,armelf -Wl,--exclude-libs=libclang_rt.

探索Python编程世界:开启你的代码之旅

亲爱的小伙伴们,大家好!很高兴向大家推荐我的新专栏《Python编程指南:从入门到高级》。在这个专栏里,我将带领大家深入探索Python编程的奇妙世界,为您提供有趣、实用、易懂的内容,帮助您在编程的道路上越走越远。 写作目的 我创建这个专栏的目的很简单,就是与大家分享我对Python的一些认知。Python作为一门多才多艺的编程语言,不仅可以用于Web开发、数据科学、人工智能等领域,还具备易学易用的特点,非常适合初学者入门。 我希望通过这个专栏,能够为大家提供一个良好的学习平台,帮助您掌握Python编程的基础知识,从而在日常工作和学习中更加得心应手。 专栏中的内容将涵盖从Python基础语法到高级技巧的全面范围。我会采用通俗易懂的方式来解释复杂的概念,用生动有趣的案例来展示实际应用。无论您是刚刚入门的初学者,还是已经有一定编程经验的开发者,我都会为您准备有价值的内容。 以下是本专栏的目录结构,后续博客发布会第一时间将每一篇同步到该目录中。 引言 为什么选择Python?Python在编程领域的应用设置开发环境 Python基础语法 变量和数据类型运算符和表达式控制流程:条件语句和循环 函数和模块 定义和调用函数参数和返回值内置函数和自定义函数导入和使用模块 面向对象编程 类和对象的概念定义和使用类继承和多态类的特殊方法 文件操作和异常处理 打开、读取和写入文件异常的基本概念try-except语句自定义异常类 数据结构和算法 列表、元组和字典集合和集合操作排序和搜索算法 Python高级特性 生成器和迭代器装饰器和上下文管理器多线程和多进程编程 Web开发与框架 Flask和Django简介创建简单的Web应用路由、模板和表单 数据分析和可视化 使用Pandas进行数据处理Matplotlib和Seaborn进行数据可视化基本数据分析案例 机器学习初步 机器学习基本概念使用Scikit-learn进行分类和回归实例:简单的机器学习项目 实战项目 构建简单的待办清单应用创建基本的数据分析报告实现一个简单的图像识别模型 进阶学习资源 推荐书籍和在线课程开源项目和社区资源持续学习的路径和建议 总结和展望 回顾所学内容Python在未来的应用和趋势 如何订阅专栏? 订阅我的专栏非常简单,只需要在文章页面的右上角点击“订阅”按钮,您就可以即时收到我的更新通知。如果您有CSDN账号,您还可以通过个人中心设置订阅提醒方式,确保不错过任何精彩内容。 结语 在这个数字化时代,学习一门编程语言变得愈发重要。Python作为一门强大且易学的语言,为您创造了许多机会。订阅《Python编程指南:从入门到高级》专栏,让我们一起踏上这段有趣的代码之旅,共同成长,共同进步! 如果您对Python有兴趣,无论您是初学者还是有经验的开发者,我都欢迎您加入我的专栏大家庭,与我一同分享、学习、进步。期待您的订阅!

为什么选择Python?探索这门多才多艺的编程语言

文章目录 1. 简单而易学的语法缩进代替大括号强制可读性的命名约定没有繁琐的分号和括号强类型语言丰富的内置函数和标准库 2. 大量的库和框架标准库数据科学和机器学习库Web开发框架数据库连接和ORM自动化和脚本编写游戏开发框架 3. 跨平台性支持多种操作系统一次编写,多平台运行跨平台的应用程序开发跨团队协作跨学科应用 4.强大的社区和支持开源精神Python Software Foundation (PSF)PyPI(Python Package Index)社交媒体和在线社区教育和培训资源多样性和包容性活跃的开发者 5. 多用途性Web开发数据科学和机器学习科学计算和数学建模自动化和脚本编写游戏开发数据库连接和后端开发自然语言处理(NLP)图像处理和计算机视觉云计算和DevOps教育和科研 结论 Python,这门编程语言在过去几十年里取得了令人瞩目的成功。从初学者到专业开发者,它已经吸引了数百万人的注意力,并且被广泛用于各种领域,包括Web开发、数据科学、人工智能和自动化。那么,为什么选择Python?这个问题在许多人的脑海中一直存在,而本文将深入探讨Python之所以如此受欢迎的原因以及它的优势。 1. 简单而易学的语法 Python的语法被广泛认为是编程世界中最容易学习的之一。它的语法结构非常清晰、简单,使用空格来表示代码块,而不是像其他语言那样使用大括号。这种简洁的语法使得Python非常容易阅读和理解,特别适合初学者。 让我们从Python的"Hello, World!"程序开始。下面是一个打印"Hello, World!"的Python代码: print("Hello, World!") 相比之下,让我们看看同样的任务在其他语言中是如何实现的。比如,Java: public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } 缩进代替大括号 Python使用缩进来表示代码块,而不是像其他编程语言那样使用大括号。这种做法迫使开发者编写更整洁的代码,并强制保持一致性。 例如,下面是一个使用条件语句的Python代码: if x > 5: print("x 大于 5") else: print("x 不大于 5") 这种缩进的方式使得代码更加清晰,不容易出现混淆。但是需要注意,缩进必须保持一致,否则会导致语法错误。 强制可读性的命名约定 Python有一套强制的命名约定,这使得变量、函数和类的名称更具描述性,有助于代码的可读性。一般来说: 变量名通常使用小写字母,单词之间用下划线分隔,例如 my_variable。 函数名也使用小写字母,单词之间用下划线分隔,例如 calculate_average()。 类名使用大写字母开头的驼峰命名法,例如 MyClass。 这种命名约定使得代码更易于理解,减少了猜测变量和函数名称的需要。 没有繁琐的分号和括号 与某些编程语言不同,Python的语法中没有繁琐的分号和括号。这意味着您不需要在每一行代码的末尾添加分号,并且代码块之间也不需要使用大括号来标记。 例如,在Python中,以下代码是有效的: x = 10 if x > 5: print("

Python量化交易学习笔记(25)——Data Feeds扩展

背景:需要扩展data feeds的场景 在backtrader中,data feeds中包含了被普遍认为是业界标准的几个字段: datetimeopenhighlowclosevolumeopeninterest 可以使用GenericCSVData读取CSV文件,来方便地加载这些数据。但是在很多情况下,还需要在回测框架中使用其他的数据,例如: 利用分类算法,预测出股票是否已经达到买点及卖点(转化为分类问题),在backtrader中按照预测的买点及卖点进行交易,就需要将预测结果读入到框架中进行回测。利用序列预测算法,预测出模型每日的收盘价,将预测值与其他技术指标综合分析,制定交易策略,然后进行回测,这也需要将预测得到的序列值读入到框架中。 因此,我们要想办法从CSV中读入自定义的数据,来使得这些数据可以在策略中得以应用。本文就针对上面提到的第2个场景,来扩展data feeds,实现自定义数据在backtrader回测框架中的使用。 应用场景设定 我们假定这样的应用场景: 已知某只股票的历史日线数据,包含datetime,open,high,low,close字段;已经通过序列预测算法,利用历史数据计算出每日收盘价(或开盘价)的预测值;利用历史日线数据及预测数据对该股票进行策略回测;策略为:当收盘价小于前1日的预测值时,进行买入;当收盘价大于前1日的预测值时,进行卖出。 实现步骤 生成待读入CSV文件,文件中包含datetime,open,high,low,close及自定义数据字段(这里使用predict进行标识)。由于这里只是做示意,因此简单的使用predict = (high + low) / 2来计算predict的值。合并后CSV文件截图如下: 创建GenericCSVData的子类,扩展新的lines对象,添加新的参数,这样在使用这个子类时,调用者就可以通过这个参数,来指定自定义的数据在CSV文件中的哪一列,代码如下: # 扩展DataFeed class GenericCSVDataEx(GenericCSVData): # 添加自定义line lines = ('predict', ) # openinterest在GenericCSVData中的默认索引是7,这里对自定义的line的索引加1,用户可指定 params = (('predict', 8),) 这里创建了一个GenericCSVData的子类GenericCSVDataEx,定义了一个新的lines对象predict,并且添加了一个新的参数predict,默认值设置为8,在后续调用时,根据自定义数据具体在文件中的哪一列,再对这个参数进行重新赋值。 使用创建的子类导入数据,代码如下: # 创建数据 data = GenericCSVDataEx( dataname = datapath, fromdate = datetime.datetime(2019, 1, 1), todate = datetime.datetime(2019, 12, 31), nullvalue = 0.0, dtformat = ('%Y/%m/%d'), datetime = 0, open = 1, high = 2, low = 3, close = 4, volume = -1, openinterest = -1, predict = 5 ) 这里使用了新创建的类GenericCSVDataEx来导入数据。在参数中,从datetime开始,等号后面的值均表示对应字段在CSV文件中的列号,-1表示文件没有该字段数据,可以回看前面的CSV文件的截图,确认一下数据的对应关系。

Python量化交易学习笔记(40)——backtrader的resample浅析

本文主要包含以下三部分内容: backtrader的日志功能。backtrader的交易日历。backtrader的resample结果浅析。 日志功能 可以通过下面的代码在backtrader中添加日志功能: cerebro.addwriter(bt.WriterFile, out = 'log.csv', csv = True) 日志信息将被输出到工作目录下的log.csv文件中,输出内容包括: 种子数据(Data Feeds)策略数据(lines和参数)指标和观察者(Observer)数据(lines和参数)分析数据(参数和分析结果数据) 交易日历 交易日历适用于以下场景: 由日线数据resample得到周线数据时,使用交易日历可以准确识别每周的最后1根日线。 以2019年1月1日至12月31日的数据为例,在策略的next()方法中打印一下内容: print('Strategy len {} datetime {}'.format( len(self), self.datetime.date()), end=' ') print('Data0 len {} datetime {}'.format( len(self.data0), self.data0.datetime.date()), end=' ') if len(self.data1): print('Data1 len {} datetime {}'.format( len(self.data1), self.data1.datetime.date())) else: print() 当不使用交易日历时,部分输出结果为: Strategy len 1 datetime 2019-01-02 Data0 len 1 datetime 2019-01-02 Strategy len 2 datetime 2019-01-03 Data0 len 2 datetime 2019-01-03 Strategy len 3 datetime 2019-01-04 Data0 len 3 datetime 2019-01-04 Strategy len 4 datetime 2019-01-07 Data0 len 4 datetime 2019-01-07 Data1 len 1 datetime 2019-01-04 Strategy len 5 datetime 2019-01-08 Data0 len 5 datetime 2019-01-08 Data1 len 1 datetime 2019-01-04 Strategy len 6 datetime 2019-01-09 Data0 len 6 datetime 2019-01-09 Data1 len 1 datetime 2019-01-04 Strategy len 7 datetime 2019-01-10 Data0 len 7 datetime 2019-01-10 Data1 len 1 datetime 2019-01-04 Strategy len 8 datetime 2019-01-11 Data0 len 8 datetime 2019-01-11 Data1 len 1 datetime 2019-01-04 Strategy len 9 datetime 2019-01-14 Data0 len 9 datetime 2019-01-14 Data1 len 2 datetime 2019-01-11 .

Python量化交易学习笔记(42)——深度学习挖短线股2

上篇文章介绍了深度学习挖短线股的数据预处理部分,本文将介绍模型训练的内容。 模型训练 模型训练过程主要参考Keras的官方示例Structured data classification from scratch(https://keras.io/examples/structured_data/structured_data_classification_from_scratch/),该示例展示了对结构化的数据进行分类,分别处理了特征为字符串、整形、浮点型的数据。对于当前我们所选用的股票训练特征而言,我们只需要处理浮点型特征。 首先,判断预处理后的数据是否存在,如果存在则直接读入,否则进行预处理计算: for stk_code in stk_list: print('processing {}...'.format(stk_code)) # 判断是否已经经过预处理(文件是否存在) data_file = './baostock/data_pre/{}.csv'.format(stk_code) if os.path.exists(data_file): df = pd.read_csv(data_file) else: df = pd.read_csv('./baostock/data_ext/{}.csv'.format(stk_code)) df = df[df['date'] <= '2017-12-31'] df = data_preprocessing(df, stk_code, FEATURE_N) 然后,依次获取特征的维度,分割训练集及验证集,将数据转为Dataset,并设置batch的大小。 # 特征维度 ft_num = df.shape[1] - 1 # 分割训练集与验证集 val_df = df.sample(frac=0.2, random_state=1337) train_df = df.drop(val_df.index) print( "Using %d samples for training and %d for validation" % (len(train_df), len(val_df)) ) # 生成tf.

每日筛取候选股票——从零到实盘14

前文介绍了多进程更新股票数据的过程。在实盘的过程中,每日更新股票数据后,筛出符合候选条件的股票,这样我们就可以在后续交易中,监测候选股票的价格,判断是否进行买入。本文记录筛取候选股票的过程,主要通过查询latest表获取最新一日所有股票的日线数据,然后选取candidate因子为True的股票。 主要代码分析 新建源文件,命名为data_center_v12.py,全部内容见文末,v12新增4个函数: 新增最新日线数据表函数 def update_latest_table(stock_codes): 该函数用于更新数据库中最新日线数据表,从数据库中读取每只股票的最新一天数据并返回,其中: 参数stock_codes为待更新数据的股票代码返回值为包含所有待处理股票的最新日线数据的DataFrame engine = create_mysql_engine() 创建数据库引擎对象。 latest_df = pd.DataFrame() 创建空的DataFrame。 for index, code in enumerate(stock_codes): 更新数据循环。 table_name = '{}_{}'.format(code[3:], code[:2]) 股票数据在数据库中的表名。 if table_name not in sqlalchemy.inspect(engine).get_table_names(): continue 判断是否存在该表,不存在则跳过。 sql_cmd = 'SELECT * FROM {} ORDER BY date DESC LIMIT 1;'.format(table_name) df = pd.read_sql(sql=sql_cmd, con=engine) 从数据库中读取股票的最新一天数据。 if np.any(df.isnull()): continue 有缺失字段就不参与候选。 df['code'] = code[3:] latest_df = latest_df.append(df) 添加code字段,并append到latest_df中。 return latest_df 将查询到最新日线数据返回。 新增多进程更新最新日线数据表 def update_latest_table_mp(stock_codes, process_num=61): 该函数使用多进程更新数据库中最新日线数据表,从各个子进程收集每只股票的最新日线数据并返回,其中:

开聊PTrade交易——从零到实盘16

从本文开始,“从零到实盘”系列文章进入针对PTrade进行交易的相关介绍。 PTrade简介 PTrade专业交易系统,是一款面向高净值个人用户和主动管理型产品,集程序化交易(策略投研、回测、交易)、日内回转交易、快速交易、投机套利工具等功能,以及异常交易风控在内的一体化智能投资平台。 以上是湘财证券对PTrade的简单介绍,笔者目前只是把PTrade作为一个交易的接口,因此只探索了交易相关的功能。如果想了解更多PTrade的功能,还请读者自行探索。 下图为进入PTrade后的默认界面: PTrade部署策略过程 PTrade不提供对外的接口,因此没有办法在PyCharm等IDE里进行策略的开发调试,我们只能在PTrade编写策略,策略会被上传到券商的服务器,也就是说策略最终是在券商的服务器上运行的,即使我们的PC关机了,策略依然能够保持运行状态。 下面介绍在PTrade中部署策略的过程: 入下图所示,界面最左侧一列分别为,“行情”、“交易”、“工具”、“量化”、“日内”,共5个标签,选择“量化”标签(默认打开就是“量化”标签)。在左上角位置,横向有“研究”、“回测”、“交易”、“帮助”,共4个标签,点击选择“回测”标签。 回测标签下一行的“策略”下的“+”号,会弹出下面的菜单。 例如我们可以将名称设置为demo,业务类型选择为股票。 点击确定,ptrade就会创建出一个简单的策略,如下图所示,我们就可以在编辑窗口编写自己的策略了。 当策略编写完成后,保存策略(重要!!!)。下一步我们将进行策略的部署,点击进入“交易”标签,界面如下图所示: 在左侧“交易列表”窗口右侧有个“新增”按钮,点击后弹出如下窗口: 可以根据需要填写交易名称,例如我们还是命名为demo,策略方案选择刚才在“回测”标签中新建的策略“分钟-demo”(这里的“分钟”是自动添加的)。点击确定,就可以看到如下界面。 左侧“交易列表”里也显示“demo”策略正在运行,这样就完成了策略的部署,策略正运行在券商的服务器上,等到达交易时间会自动进行交易。 修改策略 在”交易“标签窗口下,我们无法对策略进行修改。如果我们想修改正在运行的策略,需要按以下步骤进行: 点击切换到“回测”标签窗口点击待修改的策略(例如demo),打开策略进行修改点击保存(重要!!!)点击切换到“交易”标签窗口在“交易列表”窗口下找到对应策略(例如demo),点击后面的“重启”,策略重启后即完成了部署在服务器端的策略修改。 我们也可以根据需要对特定的策略进行停止和删除,只需要勾选策略,然后点击对应按钮即可。 PTrade文档 在“帮助”标签窗口内,有PTrade的API文档,对PTrade的使用及API都有说明,读者可以自行查阅。 数据中心与PTrade的交互方式 在前面的文章中,我们创建了数据中心(data_center.py)程序,完成了每日候选股票的筛选功能。 下一步,我们需要完成数据中心与PTrade完成数据交互,才能实现真正的实盘交易。虽然,PTrade无法提供外部调用API,但是提供了“算法单”功能,来实现PTrade内外部数据的交互。简单来说,算法单就是通过输入、输出文件的形式,实现数据的交互。在实盘中,我们用到数据中心与PTrade的交互方式如下图所示: 从数据中心到PTrade 我们可以通过CSV文件将待交易数据传递给PTrade,PTrade提供对指定目录的扫描功能,读取目录下所有CSV文件。 从PTrade到数据中心 PTrade会定时向指定目录输出成交文件、资金文件等CSV格式文件,在目前的实盘交易中,我们会在每天收盘更新数据中心数据时,读取成交文件Deal_YYYYMMDD.csv的内容,来获取当日成交数据,更新数据中心中相关数据内容。 通过以上两个步骤,就实现了数据中心与PTrade的数据交互。 小结 本文简单介绍了PTrade的基本内容,后续文章将介绍数据中心与PTrade进行数据交互的具体实现方式及PTrade交易代码。 博客内容只用于交流学习,不构成投资建议,盈亏自负! 个人博客:http://coderx.com.cn/(优先更新) 项目最新代码:https://gitee.com/sl/quant_from_scratch 欢迎大家转发、留言。有微信群用于学习交流,感兴趣的读者请扫码加微信! 如果认为博客对您有帮助,可以扫码进行捐赠,感谢! 微信二维码微信捐赠二维码

安卓开发案例-手机商城

1. 项目结构 2. 资源和配置 2.1 图片和布局文件 2.1.1 图片资源 2.1.2 布局文件 2.2 模块gradle配置 Room依赖 dependencies { implementation 'androidx.room:room-runtime:2.2.1' annotationProcessor 'androidx.room:room-runtime:2.2.1' } 2.3 清单文件配置(AndroidManifest.xml) 2.3.1 配置文件读写权限 <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> </manifest> 2.3.2 Application配置自己的.MyApplication <application android:name=".MyApplication" android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MyApplication" tools:targetApi="31"> </application> 2.3.3启动Activity配置 <activity android:name=".activities.ShoppingChannelActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.lib_name" android:value="" /> </activity> 2.3.3其它Activity配置 <activity android:name=".activities.ShoppingDetailActivity" android:exported="

微信小程序基于Uniapp+ssm+vue校园失物招领小程序 |计算机毕业设计|Java毕业设计|课程设计|Python毕设|小程序|毕业设计推荐|

微信小程序基于Uniapp+ssm+vue校园失物招领小程序 该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功 技术路线: 软件开发环境及开发工具: 开发语言:Java 后台框架:ssm 安卓框架:Uniapp JDK版本:JDK1.8 服务器:tomcat9.0 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏览器:谷歌浏览器 主要功能: 功能介绍: 管理员功能模块和用户功能模块是该系统的两大主要功能模块,其功能需求具体如下: 管理员的功能需求: 管理员在后台可以全面管理系统,管理员的功能主要包括用户管理、失物招领管理、寻物启事管理、失物认领、公告信息和论坛管理等。 用户的功能需求:失物招领,查看公告,论坛讨论等操作。 开题报告 1. 研究背景 校园失物招领是大学校园内的一项重要服务,旨在帮助失主找回遗失物品。然而,传统的失物招领方式通常依赖于校内布告栏或社交媒体,信息传播不及时、不便捷。本研究旨在设计和实现一个基于微信小程序的校园失物招领系统,以提供高效、便捷的失物招领服务。 2. 研究目的 本项目的目标是创建一个校园失物招领小程序,使学生和校园工作人员能够方便地发布和查询失物招领信息,提高校园失物招领服务的可用性和可访问性。 3. 研究方法 本研究的方法包括以下几个步骤: 需求分析:调查校园内失物招领的需求,了解用户的使用习惯和痛点。技术选型:选择适合的技术栈,包括Uniapp(前端)、SSM框架(后端)、Vue.js(前端)、数据库等。系统设计:设计小程序的整体架构和功能模块,包括失物发布、招领查询、用户管理等。系统实现:开发小程序前端和后端,实现各项功能。测试与优化:测试系统的稳定性和性能,不断优化用户体验。 4. 研究内容 本研究的主要内容包括以下几个方面: 用户需求分析:了解校园失物招领的需求和痛点。系统架构设计:设计系统的整体架构,包括前端和后端。功能模块设计:设计各个功能模块,如失物发布、招领查询、用户管理等。技术实现:使用Uniapp开发前端,使用SSM框架搭建后端,设计数据库。系统测试与优化:测试系统的功能和性能,不断优化提高用户体验。 5. 预期成果 本研究预期将设计和实现一个基于微信小程序的校园失物招领系统,包括以下方面的成果: 完整的系统架构和功能模块设计。可用的微信小程序前端界面。后端服务器和数据库的搭建和实现。支持校园失物招领的在线系统。 6. 计划进度 本项目的计划进度如下: 需求分析和技术选型:第1-2个月系统设计:第3-4个月系统实现:第5-8个月系统测试与优化:第9-10个月论文撰写:第11-12个月 7. 参考文献 列出相关领域的参考文献,包括微信小程序开发、数据库设计、用户体验等方面的文献。 论文书写 论文的书写应包括以下内容: 引言:介绍研究背景、目的和研究方法。 文献综述:回顾相关领域的研究和技术,讨论已有的失物招领系统,并指出本研究的创新之处。 需求分析:详细分析校园失物招领的需求,包括用户的使用习惯、痛点和期望。 系统设计:描述系统的整体架构和各个功能模块的设计,包括前端和后端。 系统实现:介绍系统的具体实现过程,包括技术选型、前端开发、后端搭建和数据库设计。 系统测试与优化:讨论系统的测试方法和结果,以及针对性的优化措施。 结论与展望:总结研究成果,讨论系统的局限性,并提出未来研究的方向。 参考文献:列出论文中引用的所有文献。 论文答辩 论文答辩时,要清晰地介绍研究的背景、目的、方法和成果。答辩应包括以下内容: 研究介绍:简要介绍研究的背景和目的,引起听众的兴趣。 文献综述:回顾相关领域的研究和技术,强调本研究的创新点。 需求分析:详细解释校园失物招领的需求和痛点,为系统设计提供基础。 系统设计:展示系统的整体架构和功能模块,说明为什么选择了Uniapp、SSM框架和Vue.js 这些技术。 系统实现:展示系统的具体实现过程,包括前端和后端的开发过程。 系统测试与优化:讨论系统的测试方法和结果,以及优化过程。 结论:总结研 毕业答辩流程: 具体的毕业答辩流程可能会根据学校和学院的规定有所不同,一般包括以下环节:

AOP实现接口加密

文章目录 使用示例POM文件自定义注解切面方法 使用示例 @Secret//加入此注解,获取到的params是解密后的参数 @PostMapping("upload") public JSONObject upload(@RequestBody JSONObject params){ JSONObject upload = upload(params);//业务代码 return upload; } POM文件 <!-- AOP切面依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 自定义注解 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @classname: Secret * @description: 自定义注解,用来标识请求类 或者方法是否使用AOP加密解密 */ @Target({ElementType.METHOD}) // 可以作用在类上和方法上 @Retention(RetentionPolicy.RUNTIME) // 运行时起作用 public @interface Secret { } 切面方法 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.

android 开发,页面跳转示例

1. 布局文件 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello HHH"></TextView> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="跳转"></Button> </LinearLayout> activity_main2.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/text_test"></TextView> </LinearLayout> 2. java文件 MainActivity .java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = findViewById(R.id.tv); tv.setText("你好 世界"); Button button = findViewById(R.id.button); button.setOnClickListener(new View.

linux Mysql 8.0.16 安装搭建

文章目录 Mysql 搭建一、安装包下载二、创建用户组用户和修改权限三、配置my.cnf Mysql 搭建 一、安装包下载 mysql 下载地址:https://downloads.mysql.com/archives/community/ 这里有所有的mysql的版本,下载自己需要的版本,我们这里下载 8.0,16版本的,注意选的跟我一样。 上传到linux 输入命令:tar -xvf mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz -C /opt/module/ 输入命令: mv mysql-8.0.16-linux-glibc2.12-x86_64/ mysql 改名为 mysql 二、创建用户组用户和修改权限 输入命令: groupadd mysql 创建用户组 mysql 输入命令:useradd -r -g mysql mysql 创建用户mysql 到 用户组 mysql 里面 在 mysql 目录下面创建 data 目录,并且修改它的用户和用户组 输入命令:mkdir data 创建 data 目录 输入命令:chown mysql:mysql -R /opt/module/mysql/data/ 修改用户用户组 三、配置my.cnf 输入命令:vim my.cnf 配置这个文件 如果没有直接文件,这个可以直接粘贴进去用 [mysqld] bind-address=0.0.0.0 port=3306 user=mysql basedir=/opt/module/mysql datadir=/opt/module/mysql/data socket=/tmp/mysql.sock log-error=/opt/module/mysql/data/mysql.err pid-file=/opt/module/mysql/data/mysql.pid #character config character_set_server=utf8mb4 symbolic-links=0 explicit_defaults_for_timestamp=true 进入mysql的bin目录

对excel文件进行加/解密码

一、方法1代码如下 代码如下(示例): import os, sys import win32com.client import time import hashlib def pwd_xlsx(old_filename,new_filename,pwd_str,pw_str='123456'):# # pw_str为打开密码, 若无访问密码, 则设为 ''。如果要编辑的文件是需要密码的话,则修改上行代码 xcl = win32com.client.Dispatch("Excel.Application") wb = xcl.Workbooks.Open(old_filename, True, True, None, pw_str) xcl.DisplayAlerts = False # 保存时可设置访问密码,或者不设置密码。 wb.SaveAs(new_filename, None, pwd_str, '') xcl.Quit() if __name__ == '__main__': old_filename = r'C:\Users\22846\Desktop\Test.xlsx'#含密码的excel的路径, new_filename = r'C:\Users\22846\Desktop\Test1.xlsx'#打算将解密后的excel保存路径+重命名, pwd_str = ''#新密码自定义。此刻不设置密码, pwd_xlsx(old_filename,new_filename,pwd_str) 二、方法2代码如下 代码如下(示例): import xlwings as xw app = xw.App(visible=True, add_book=False) workbook = app.books.open(r'C:\Users\22846\Desktop\Test.xlsx') # 加密文件路径 workbook.api.Password = '123' # 对整个文件加密 workbook.

一文读懂集合竞价,建议收藏,读完少交学费

集合竞价每个时间段交易规则及作用都不一样,了解集合竞价的规则,有利于琢磨主力的意图。 大部分同学都不是很关心集合竞价,也不知道如何利用集合竞价买卖股票。如上图所示,有同学在9点15看着股票涨停,立马冲进去,结果9点18左右股价直线下跌,分分钟因为不清楚集合竞价而被套交学费。 那什么是集合竞价?为什么要有集合竞价?集合竞价有什么特点和规律? 什么是集合竞价与连续竞价 集合竞价是指对一段时间内接收的买卖申报,一次性集中撮合的竞价方式。集合竞价成交价格的确定原则为: 在有效价格范围内选取成交量最大的价位。等于集合竞价产生的买入或卖出申报,根据买入申报量和卖出申报量的多少,按少的一方申报量成交 高于集合竞价产生的买入申报全部成交;低于集合竞价产生的卖出申报全部成交 集合竞价的所有交易以同一价格成交,集合竞价未成交的部分,自动进入连续竞价 举例说明:开盘前买卖双方都在挂单,如挂10元买卖的人有100手,挂9.9元买卖的人有1000手,那么,开盘价就是9.9元。此时,高于9.9元买入委托全部成交,低于9.9元卖出委托全部成交 连续竞价指的是对申报的每一笔买卖委托,按照以下两种情况产生成交价:最高买进申报与最低卖出申报相同,则该价格即为成交价格; 买入申报高于卖出申报时,申报在先的价格即为成交价格。举例说明:卖方挂9.9元先卖出,然后买方挂10元买进,成交价格为9.9元; 买方先挂10元买进,然后卖方挂9.9元卖出,成交价格为10元 为什么要有集合竞价呢?都用连续竞价不行吗? 结论是当然不行 早盘集合竞价的目的是为了保证公平。晚上和周末很多新闻事件会对股价造成影响,早盘通过集合竞价的方式按最大成交量的原则来确定股票的价位能得到一个相对公允的开盘价,在这段时间里申报的所有价格都是平等的,不需要按照时间优先和价格优先的原则交易,可以尽量减少信息不对称带来的不公平 尾盘集合竞价的目的是防止操纵股价,也是为了保证公平。股票的收盘价是每天最后一笔的交易价格。很多交易、结算都是以收盘价为准,所以这个价格远比盘中的价格重要的多。如果这个价格能被轻易的操纵,那就可以轻松获利,而有了尾盘集合竞价,如果有人想要抬高收盘价,那必须要吃掉三分钟的卖单;如果有人想打压股价,也要吃掉三分钟的买单,操纵股价的成本会极大提升 集合竞价的特点 除了法定节假日之外,A股的交易时间是周一到周五上午的9:15-11:30,以及下午的13:00-15:00。除了A股外,港股、期货等都有集合竞价功能 A股集合竞价的特点如下: 根据交易规则,A股交易时间可以划分为三个时间段:早盘集合竞价阶段、连续竞价阶段,以及收盘集合竞价阶段 早盘集合竞价时间:9:15~9:25 9:15~9:20 这5分钟既可以挂单也可以撤单 9:20~9:25 这5分钟只能挂单,不能撤单。集合竞价未成交的部分,自动进入连续竞价 9:25~9:30 这五分钟其实不叫集合竞价时间。在这期间可挂单可撤单,但单子不会报到交易系统,只会存在券商系统里,9:30分后才会提交到交易所 收盘集合竞价时间:14:57~15:00。这三分钟可以挂单,不可以撤单。等到15: 00的时候撮合的最大成交数量对应的那个股票交易价格会作为收盘价格进行成交,没成交的会自动撤单 集合竞价的注意事项 知道了集合竞价产生的背景和特点,我们来看下集合竞价的注意事项: 当天收盘后就可以提前对股票次日理想价位进行挂单 由于9点20分前可以撤单,在9:15~9:20这个时间段看到的匹配成交量可能是虚假的,很多主力在这个时间段试盘测试抛压或者大单买进股票制造强势假象诱导投资者买入,然后在9:19:59之前撤单,因此在这个时间段要多关注最后几秒钟主力撤单情况 过了9点20分,由于不能撤单了,才能真正显示竞价过程中资金的意图,了解这个时间段的竞价才有意义,这5分钟一定要看准后再下单 如果在集合竞价时段卖出了一只股票,那么资金在9:25就可利用,可在9:26买进另一只股票,看好了的话这样可以提升资金利用率 无效的买卖指令主机不接受,价格要确认在最大涨跌范围内 小结 & 交流 完整文章查看,点击一文读懂集合竞价,读完少交学费,建议收藏 关注公众号:诸葛说talk,获取更多相关内容 写文章不易,觉得本文对你有帮助的话,帮忙点赞转发赞赏,让笔者有坚持写好文章的动力

基于SpringBoot的服装生产管理系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 登录界面的实现 系统主界面的实现 用户管理模块的实现 人事安排管理模块的实现 工资管理模块的实现 考勤管理模块的实现 样板管理模块的实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 本协力服装厂服装生产管理系统设计目标是实现协力服装厂服装生产的信息化管理,提高管理效率,使得协力服装厂服装生产管理作规范化、科学化、高效化。 本文重点阐述了协力服装厂服装生产管理系统的开发过程,以实际运用为开发背景,基于Springboot框架,运用了Java编程语言和MYSQL数据库进行开发,充分保证系统的安全性和稳定性。本系统界面良好,操作简单方便,通过系统概述、系统分析、系统设计、数据库设计、系统测试这几个部分,详细的说明了系统的开发过程,最后并对整个开发过程进行了总结,实现了服装生产相关信息管理的重要功能。 本协力服装厂服装生产管理系统运行效果稳定,操作方便、快捷,界面友好,是一个功能全面、实用性好、安全性高,并具有良好的可扩展性、可维护性的服装生产管理平台。 一、技术栈 末尾获取源码 SpringBoot+Vue+JS+ jQuery+Ajax... 二、系统功能介绍 登录界面的实现 用户要想进入本系统必须进行登录操作,进入对应角色登录界面,在登录界面输入系统账号、登录密码,选择登录类型,点击登录按钮进行登录系统。 系统主界面的实现 用户在系统前台可查看系统信息,包括首页、人事安排以及样板等。 用户管理模块的实现 管理员登录后可查询、添加、修改和删除用户信息。 人事安排管理模块的实现 管理员可增删改查人事安排信息。 工资管理模块的实现 管理员可增删改查工资信息,用户登录后可查看个人工资信息。 考勤管理模块的实现 用户登录后可添加考勤信息,管理员可查看用户添加的考勤,并可对其进行审核操作。 样板管理模块的实现 管理员可增删改查样板信息。 三、核心代码 1、登录模块 package com.controller; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.

注意力机制概览

目录 一、背景二、前置知识2.1 通道注意力2.2 空间注意力2.3 self-attention 三、各种改进版本3.1 跨特征3.1.1 BiSeNet [1]3.1.2 SKNet [2] 3.2 分组3.2.1 SGNet [3]3.2.2 SANet [4] 3.3 Self Attention3.3.1 non local attention [5]3.3.2 GCNet [6]3.3.3 dual attention [7] 3.4 空间+通道3.4.1 BAM [8]3.4.2 scSE [9] 参考文献 一、背景 注意力机制可有效提高模型对特征的提取能力,进而提高模型精度。本文首先对经典的三种注意力学习方法进行介绍,后结合自己一点点浅薄认知,对注意力机制后续的改进方向进行归纳,希望对大家能有帮助。 二、前置知识 2.1 通道注意力 对特征图进行全局平均池化,后经过两层全连接层,最后使用Sigmoid输出0-1之间的权重 2.2 空间注意力 ​ 将特征图进行压缩,得到空间方向上的权重图 2.3 self-attention 这里借助了Non-local Neural Networks中的一张图。self-attention本质上是一种空间注意机制,如上图所示,需要求解一个[THW, THW]的矩阵,该矩阵中的每一行,表示原特征图中的一点与其余点的关系 三、各种改进版本 将改进的注意力机制主要分为四类 跨特征:构建不同的特征表达,后进行融合分组:对特征图按通道分组后,再使用注意力机制self-attention:本质上,self-attention就是一系列矩阵运算,对运算过程中的某些步骤进行优化空间+通道:很自然的想法,同时使用两种注意力机制 3.1 跨特征 3.1.1 BiSeNet [1] 对不同层次的特征使用通道注意力机制进行融合。这应该属于应用创新,没有构建新的注意力机制,而是将老的注意力机制应用到特征融合方向 3.1.2 SKNet [2] 使用不同感受野卷积核构建多分支特征,将这些特征 add 后计算不同分支的同道注意力系数,后沿着通道方向进行加权求和 3.2 分组 3.

微信小程序,bindtap 的语法格式

bindtap 的语法格式 在小程序中,可以通过 bindtap 为组件绑定 tap 触摸事件。 语法格式如下: <button type="primary" bindtap="btnTapHandler">按钮</button> 在上述代码中,通过 button 组件的 bindtap 属性将事件处理函数 btnTapHandler 绑定到了按钮的 tap 事件上。 在页面的.js文件中定义 btnTapHandler 函数来处理按钮的 tap 事件: Page({ btnTapHandler(e) { // 按钮的 tap 事件处理函数 console.log(e) // 打印事件对象 e } }) 在上述代码中,通过 Page 函数定义了一个小程序页面。其中 btnTapHandler 函数为按钮的 tap 事件处理函数。当用户点击按钮后,事件对象 e 将会作为参数传递到 btnTapHandler 函数中。 事件对象 e 包含了当前事件触发的一些信息,例如触摸点的坐标、事件类型等。在上述代码中,我们通过 console.log 打印事件对象 e,以便在开发调试中查看事件信息。 值得注意的是,在小程序中,不同的组件支持的事件可能不同。可以在官方文档中查看组件的事件支持情况。 ##运行效果

基于一致性的半监督学习

目录 一、背景二、基本分类三、一致性约束3.1 基本架构3.1.1 mean teacher3.1.2 多个子模型3.1.3 多个解码器3.1.4 多尺度 3.2 技巧3.2.1 不确定性3.2.2 损失函数 一、背景 ​ 医学图像的标注成本十分高昂,其标注数据规模往往较小。通过半监督学习的方法,利用大量的未标注数据,可有效提高模型的学习能力。 图1 半监督学习基本原理 二、基本分类 ​ 如图1所示,仅有正方形的数据点,无法学习真实的数据分布,通过引入大量的未标注的圆形点,可得知数据的真实情况,这便是半监督学习的基本原理。 ​ 对于有标注的输入样本,因为有标签作为监督信号,所以很自然可以定义损失函数。对于未标注样本,需要自行构建监督信号。基本可分为两大类,一类是熵最小化约束,使模型趋向于得出高置信度的预测结果,另一类则是一致性约束,对输入或模型添加各种干扰,但模型依然具有稳定的输出。一致性约束是本文的重点,简单来说,就是通过各种奇技淫巧,使得模型对一个输入,具有不同的输出,然后让两个输出趋向一致,这就能构建出监督信号 三、一致性约束 3.1 基本架构 3.1.1 mean teacher 图2 mean teacher[1] ​ Mean Teacher模型是经典的半监督方法,学生模型通过EMA方法更新参数,然后约束教师模型和学生模型之间的一致性 3.1.2 多个子模型 图3 多个子模型[2] ​ 直接构建两个独立的子模型,一个是卷积架构,另一个是transformer架构 3.1.3 多个解码器 图4 多个解码器[3] ​ 多个解码器,如图4所示 3.1.4 多尺度 图5 多尺度[4] ​ 使得解码器的不同层次输出保持一致性 3.2 技巧 ​ 基本架构应该就是上述的模型,后面就是使用各种技巧去提高模型的性能 3.2.1 不确定性 图6 不确定性[5] ​ 两输出中肯定存在某些区域更重要,通过不确定性对其加权 3.2.2 损失函数 图7 损失函数[6] ​ 类似知识蒸馏的方法,对输出取softmax操作时,添加温度参数T,使得具有更多信息,再去保持一致性。 推荐关注github仓库SSL4MIS