记一次To B开发普通的性能优化历程......报表优化

时序图工具选型指南:从绘图到设计的效率革命 时序图是UML中用于描述对象间按时间顺序交互行为的动态模型图,它通过生命线、消息和激活条等元素,清晰展现系统组件在时间维度上的调用关系和逻辑流程。其核心原理在于将复杂的交互逻辑可视化,从而提升系统设计的可理解性与沟通效率。在软件工程实践中,时序图不仅是技术设计评审和问题排查的重要工具,更是保证团队认知一致性的关键文档。随着敏捷开发和DevOps的普及,对设计图的维护性、版本化及与代码的同步性提出了更高要求。因此,选择一款能与现代开发工作流深度融合的时序图工具至关重要。本文聚焦于Mermaid和PlantUM 阅读详情

前言:

To B开发的道路上,永远不缺报表的需求~

需求背景:

这次是接到一个财务报表的需求,其实就是一个在线版Excel+财务数据定制化,在这个报表里,不仅要满足Excel表格的所有功能,还要支持给每个单元格配置额外的取数规则,因为在线版Excel,市面上早已经有了成熟的解决方案,所以....花点钱能解决的就不算问题,于是这次的重点就来到了这个定制化的取数上...

后端需求

这次的重点就是定制化的取数规则,比如某一个单元格,它的取数逻辑是where 维度1=A and 维度2=B and 维度3=C and... 如是下去,目前可以支持20个维度同时选择条件,当然如果,某个维度没有选择条件,则取该维度内所有“我”有权限的维值,比如维度4我没选,则 维度4 in (所有有权限的值)。

如果上面这个看起来还好,那再复杂一点点,就是现在一个单元格,不只是对应一套取数规则,而是对应多套上述这样的取数规则,每套取数规则都可以单独取出一个数据,然后两套取数规则取出的数据之间可以支持加减乘除的方式,计算出最终单元格的取数(目前只支持加减乘除)。

ok,需求确定了,接下来就是我这次的开发历程...

第一版:统一取数再回填

简单来说,就是将所有单元格的取数规则聚合到一起,取出一批结果集,然后再按单元格的取数规则回填到每个单元格。

举例:

单元格A1-取数规则:

select sum(贷款余额) as m0
where 维度1=A and 维度2=B and 维度3=C

单元格A2-取数规则:

select sum(贷款余额) as m0
where 维度1=A' and 维度2=B' and 维度3=C'

则聚合后的查询sql:

select sum(贷款余额) as m0, 维度1,维度2,维度3
where 维度1 in (A,A') and 维度2 in (B,B') and 维度3 in (C,C')
group by 维度1,维度2,维度3

查出来一批结果集,然后再遍历每个单元格,根据单元格的取数规则,从结果集中匹配出对应的结果。

优化:

这里做了一点优化,就是每次聚合一列单元格的取数规则,去开启一个线程执行查询语句,多列会开启多线程并发的执行查询。

问题:

问题一:数据发散。

还是以上述聚合后的sql为例:

select sum(贷款余额) as m0, 维度1,维度2,维度3
where 维度1 in (A,A') and 维度2 in (B,B') and 维度3 in (C,C')
group by 维度1,维度2,维度3

这个sql查出来的结果集中其实会包含大量交叉的不需要的结果,比如会查出:

维度1维度2维度3
ABC
AB'C
AB'C'
ABC'

这个结果集中,只有第一条是我们需要的,而其他三条数据都是额外返回的。

问题二:查询结果有误!!

如果说上面这个问题还能接受,那查询结果不对,就是毁灭性的打击了。

是这样的,在维度的基础表中,一个维值A,会存在父子关系,它可能有一个父亲维值A', 也可能有一个子维值a, 当然好在一点,这个维值A,只可能作为父亲维值,而有子维值,或者只可能作为子维值,而有父亲维值;

另外,作为父亲维值时,它有多个子维值,而作为子维值时,它也可能有多个父亲维值。

所以加入了维度的父子的网状关系,我们在做单元格取数时,再来看当一个单元格 where 维度1=A时,如果A是一个子维值,则继续取财务数据中维度1=A的那些数据,但是当A是一个父维值时,就要在财务数据中找所有A的子维值的数据,(财务数据中只会记录子维值的明细数据)

举例: 假设A是一个父亲维值,它有a,a'两个子维值,则该单元格的查询sql变为:

select sum(贷款余额) as m0
where 维度1 in (a,a') and 维度2=B' and 维度3=C'

聚合后的sql为:

select sum(贷款余额) as m0, 维度1,维度2,维度3
where 维度1 in (a,a',A') and 维度2 in (B,B') and 维度3 in (C,C')
group by 维度1,维度2,维度3

因此我们查出的结果集就变为了:

维度1维度2维度3
aBC
aB'C
a'B'C'
a'BC'

但问题是我们单元格配置的是A,这样在不知道A和a,a'的关系的情况下,我们根据A就拿不到a,a'的那两个结果!!

当然我们可以join一下维度基础关系表,找出每个维度维值的父亲维值,但是这样如果有20个维度,无疑就得join20次,而且关键是最后的结果,我们group by 的时候还得再增加20次父亲维度。

第二版:放弃聚合,一个取数规则一查

针对上述问题,于是决定化繁为简,就爽快点儿,一个取数规则一查,一个报表,咱们搞个多线程,每个取数规则去并发取数。

这样虽然不会有回填数据的问题,每个单元格都一定能取到正确的数据,但是...

当我配置了一个10x10的报表时,100个数据库连接请求打到数据库,数据库就hold不住了!

PS:我们这次还是通过第三方的数据平台,托管我们的sql,通过接口调用的方式去执行查询,所以,不光财务那边的数据库受不了,被调用的第三方数据平台也压力巨大。

因此,我们不得不pass掉这种方式,还是回归到第一版统一取数再回填的思路上,继续研究~

第三版:改造统一取数的sql

上面我们说过,统一取数有数据发散和当维度条件是父亲维值时数据不正确这两个问题,但是综合考虑后,数据发散的问题,暂时不那么致命,所以目前主要是看有什么办法可以解决数据不正确的问题;

首先,我们目前的现状是,传进来的一批维度维值,有可能是一个明细(子)维值,也有可能是一个汇总(父亲)维值,而当它是汇总维值的时候,我们需要根据它的明细维值去财务表里找到数据,然后再根据汇总维值group by。

所以,汇总维值的匹配条件和group by的字段不是同一个值,而明细字段的匹配条件和group by的字段是同一个值,那...

有没有可能,我去造这么一个通吃的字段...

于是我改出了这样一个中间表:

select code, code as p_code
from 有权限的维度
where code in (A, b)
union 
select code, p_code 
from 有权限的维度
join 维度网状关系表
where p_code in (A, b)

(传进来的大写的A是一个汇总维值,小写的b是一个明细维值)

其实上面的思路就是在汇总维值和明细维值一起传进来的时候,我在不知道他们谁是汇总谁是明细的情况下,做了两种假设:

union前的内容:假设传进来的是明细维值,因此我们查出来的结果为:

codep_code
AA
bb

union后的内容:假设传进来的是汇总维值,p_code in (A,b)中,就只有A能查到结果,所以查出来是:

codep_code
aA
a'A

然后,我们再去查财务数据表的时候:

join 上面这个中间结果 on 中间结果.code = 财务数据.维度1

于是我们得到的结果集就变成了这样:

codep_code维度1余额数据
aAa10
a'Aa'20
AAnullnull
bbb30

然后我们group by 中间结果.p_code,因此我们明细数据a,a'的数据都被汇总到了A的下面,而明细数据b被分到了b的下面,这样我们最终回填时,就能根据传进来的A,b分别去匹配到对应的结果。

至此,我们完美解决了汇总维度、明细维度统一取数,且正确回填的问题!

第四版:存储过程建临时表

上面虽然已经能正确取数了,但是回到我们的性能问题,由于上面的查询过程中,我们不光增加了很多维度维值中间结果,而且由于权限控制,我们本身的维度数据,财务数据都需要严格做权限过滤,所以也诞生了很多的财务数据中间结果,尤其是当查询的数据期间拉长的时候,财务数据量变激增,直接导致了数据库内存崩掉,查询报错。(这次使用的是Yellowbrick数据库,没有索引,连接数有限等...)

因为之前没有用过这次的这个数据库,所以专门请教了一下之前有经验的同事,给出的建议是做存储过程,在存储过程中,将这些中间结果集创建为临时表。

比如其中一个临时表:

drop table if exists ads_ptc_auth_claim_tmp;
execute 'create temp table ads_ptc_auth_claim_tmp as '||
        'select distinct a.segment_type, a.code as segment_code,a.ledger_id,b.management_caliber_codes '||
        'from ifin_ods.ods_mdm_mdm_flex_value a, '||
        'ifin_dwd.dwd_auth_claim_t b '||
        'where a.segment_type= b.segment_type '||
        'and b.um_no = upper('''|| um ||''') '||
        'and b.url like '''|| url ||'%'' '||
        'and a.ledger_id = b.ledger_code::int '||
        'and (case when b.segment_code = ''ALL'' then ''ALL'' else a.code end) = (case when b.segment_code = ''ALL'' then ''ALL'' else b.segment_code end) '||
        'and b.ledger_code in ('|| ledgers_id ||')';

因为业务逻辑比较复杂,都是通过拼接sql的方式去调execute命令执行sql。

然后复习一下存储过程中几个知识点:

1. 如果存储过程返回结果集,则先要创建结果集表(主要是结构):

returns setof ifin_ads_temp.ads_ptc_accounting_balance(结果集表)

2. 返回结果集这样写:

FOR rec IN EXECUTE(ls_sql)
   loop
      raise info '%',rec;
   return next rec;
   end loop;

注意,返回的结果和结果集中的字段顺序和类型要一一对应,而跟字段名字没有半毛钱关系,这是百思不得其解半天的收获~

3. 存储过程中打印日志

raise info '%',rec;

第五版:content download耗时优化

在上述改造完后,我们在页面上点下查询,同样的数据量下,查询速度由原来的50秒,缩短到5秒,这个时候我们已经成功了,但是...

我发现有些查询,后台实际的接口耗时只有2秒多,而接口中除了witing的2秒,剩下的全部花在content download上,那这个content loaddown究竟是个什么东西呢?

百度一下,由于接口返回的数据量很大,于是content download也就是前端下载这批数据的耗时便需要很长时间,于是我专门把返回的数据复制出来放到了一个TXT文档里,果然,大小超过了1M。

缩减结果数据

于是再百度有什么优化建议,多数建议都是对症下药,缩减这个返回结果,比如创建一个VO对象,对象中去掉那些为null的不需要的字段,那我就创建一个新的VO,去掉那些.....

最终接口调用耗时:2.56s,完成~

重构

另外,因为这次的报表是从公司一个成熟的报表工具做二次开发而来,所以在兼容新旧报表的基础上,我自己对原来的报表做了重构。

首先是旧代码的方法提取和分离,也是运用《代码整洁之道》的思想,将代码中可变部分和不可变部分分离成不同的接口。

原先的代码几乎没有做公共方法的提取,比如一个Excel单元格遍历的代码,在查看报表,保存报表,编辑报表里都完全复制了几乎一模一样的代码,所以我先对这部分代码做了统一的封装;

然后考虑到新旧报表的变化点,就是处理每个单元格的取数上,因此该部分通过策略模式,使用一个策略上下文实例进行调用,不同的情境下,通过策略上下文,调用不同的服务。

结尾:

  • To B的性能优化和TO C最大的不同,就是用户访问量级不同,TO B用户量小,更多的优化功底在一个单线程的查询上,所以传统的sql优化,或者单线程改多线程成为了比较有效的方式,但是实际操作过程中,还有很多的细节往往是决定调优的关键!

  • 而且带入到具体调优的过程中,我们往往还可以根据业务特性进行针对性的调优,比如我虽然写完了博客,但是我刚刚拿到了业务的一份具体的报表,发现他们一张报表中,往往很多的维度维值都是一样的,虽然我们当然要支持每个单元格完全不同的取数规则,但是,是否可以针对大多数相同的情况,而再做一些针对性的优化呢?

OpenAI最强编程助手Codex:下载安装、使用指南(含使用方式、提示技巧、趋势) OpenAI最近上线了最强编程Agent——Codex,一起来看看吧! 阅读详情

相关推荐

卡方检验的隐藏逻辑:为什么正态分布的平方和如此重要?

本文深入探讨了卡方检验的核心逻辑,揭示了正态分布平方和在统计检验中的重要性。通过分析卡方分布与伽马分布的关系,以及实际应用案例,帮助读者理解卡方检验的原理、局限及高级应用场景,为数据分析提供有力工具。

3a9bq4r8t2y的博客 209

java服务器内存设置_报表性能优化方案之多种报表服务器内存修改方法

服务器内存修改各应用服务器的内存配置方法不尽相同,如下列出了常用服务器的JVM参数(-Xms,-Xmx)配置方法。JVM参数定义:-Xms:初始化内存大小-Xmx:可以使用的最大内存示例工具以下示例工具:报表开发工具FineReportTomcat服务器内存修改1.问题描述java应用程序运行过程中会使用web应用服务器的内存,如执行报表获取的数据,运算的中间数据等都需要暂存在服务器内存...

weixin_28937075的博客 427

【VisualStdio】手把手教你做一个上位机(1)控件设计布局

网上有很多形形色色的制作上位机教程,有些写的挺好的,但是过于单调。

m0_73409202的博客 5442

Java利用工具类提升写报表效率

对于报表数据大部分情况下使用写sql的方式为大屏/报表提供数据来源,但是对于某些复杂情况下仅仅使用sql无法实现,或者实现起来困难的时候,会采取通过代码实现复杂的逻辑最终将结果返回,但是当我们在java代码中需要对数据进行连接时,原生支持的就并不那么友好

qq_37436172的博客 1046

保姆级教程:用GROMACS 2022.4的拉伸模拟(SMD)加速蛋白-蛋白组装过程

本文详细介绍了如何使用GROMACS 2022.4的拉伸分子动力学模拟(SMD)技术加速大蛋白组装过程。通过CHARMM36力场和SMD技术,将传统需要数月的蛋白结合过程缩短至数天,大幅提升模拟效率。文章包含参数设计、索引组创建、周期性边界处理等实战技巧,并提供了完整的GPU加速工作流和常见问题解决方案。

weixin_30338481的博客 447

熵权法+TOPSIS完整教学:用Python评估大学科研实力(含雷达图绘制技巧)

本文提供了一套完整的熵权法与TOPSIS综合评价方法在Python中的实现教程,以高校科研实力评估为例,详细讲解了从数据预处理、客观权重计算、综合排序到结果可视化的全流程。重点介绍了如何利用Python进行数据清洗与转换,通过熵权法自动确定指标权重,并结合TOPSIS模型计算各院校与理想解的相对接近度进行排名。教程还包含了使用Matplotlib绘制专业雷达图的技巧,帮助读者直观呈现多维数据的对比分析结果,适用于各类多指标决策与绩效评估场景。

weixin_28520495的博客 420

java报表内存很大怎么处理_java报表开发FineReport教程:[28]内存机制

Java内存回收机制Java的内存垃圾回收(GC)机制是从程序的主要运行对象开始检查引用链,当遍历一遍后发现没有被引用的孤立对象就作为垃圾回收。GC为了能够正确释放对象,必须监控每一个对象的运行状态。包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。在Java中,这些无用的对象都由GC负责回收,同时java提供了函数可以访问GC, 如运行GC的函数System.gc(),但是根据Java语...

weixin_34570241的博客 518

[Dify实战] 招投标标书智能生成:模板套用 + 风险校验

摘要:本文提出基于Dify构建AI标书生成工作流,解决传统标书撰写中内容重复(80%复用率)、人工修改效率低、风险检查易出错等痛点。方案包含三大核心模块:1)智能生成(基于模板自动填充项目信息);2)风险校验(AI自动检查废标风险点);3)多角色协作。通过拆分标书结构、设置详细Prompt、建立风险检查清单,实现从"人工撰写"到"参数化自动生成+AI审核"的转型,最终输出标准格式文档并支持企业系统集成。典型应用场景下,系统能自动生成技术方案并识别关键风险(如支付安全合

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 829

关于java报表的一些经验。

一、项目场景: 需要做一个报表,多表联合查询,并且数据量都在几十万到百万以上。 二、问题描述 2.1 例如,做一个报表,游戏报表,假如一个游戏有关卡表gate,关卡内含有任务表task,这时候需要按天统计,一个人在哪一天通关了什么关卡,各个关卡任务的完成情况。 这时候,还会有要统计人的通关情况还需要,gate_user 表,task_user表 2.2 这时候如果不考虑按天切片,我们可以得出这样的sql select *from gate_user user left join task task o

qq_34526237的博客 1972

把入库交货单的 GOS 附件自动带进审批 Work Item:用 SOFM 对象打通 SAP Workflow 附件链路

本文介绍了一种在SAP ECC系统中将入库交货单的GOS附件自动附加到Workflow审批项中的解决方案。通过使用BOR对象引用列表和SOFM业务对象,审批人可直接在Work Item中查看附件,无需返回原单据界面。文章详细阐述了从BUS2015业务对象获取附件连接、转换LOIO_ID为SOFM对象引用,并将附件列表绑定到User Decision步骤的具体实现方法。该方案适用于经典SAP Business Workflow+BOR架构,核心ABAP代码可直接复用,有效解决了审批流程中的附件可见性问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

RK356X linux系统移植RTL8723BU模块遇到的坑

RK356X linux系统移植RTL8723BU模块遇到的坑

目前从事linux驱动开发,多交流多学习吧 955

我与FineReport的五年之旅:从报表小白到认证工程师的蜕变

这个阶段就像打开潘多拉魔盒,那时候明天都沉浸在帆软社区里面,看各位大佬的问答,让我印象最深的是我遇到的问题一发布在问答里,过不了几分钟就有大佬出现,孜孜不倦、一步一步帮助我解决问题,从进销存系统到财务分析看板,拆解每个公式和参数的应用逻辑。五年间,我从只会做报表(熟称“表哥”)的萌新,成长为能独立设计BI系统的认证工程师。现在的我,更享受用FineReport搭建数据桥梁的过程——当冰冷的数字经由精心设计的交互逻辑,变成业务部门眼中会说话的决策指南时,这份创造的喜悦,或许就是坚持五年的最好答案。

qq_32056301的博客 425

Open3D——平面点云凸多边形轮廓提取【2025最新版】

平面点云凸多边形轮廓提起,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 6754

Unity数据可视化实战:主流图表插件选型、集成与性能优化指南

数据可视化是现代软件开发中的一项基础且关键的技术,它通过图形化手段将抽象数据转化为直观的图表,帮助开发者与用户快速理解数据背后的模式、趋势与关联。其核心原理在于利用视觉编码系统,将数据维度映射到图形属性(如位置、长度、颜色),从而降低认知负荷。在游戏开发、商业智能、性能监控等应用场景中,高效的数据可视化能极大提升决策效率和用户体验。对于Unity开发者而言,直接使用原生UI组件绘制复杂图表不仅开发效率低下,且难以保证性能和可维护性。因此,集成专业的图表插件成为提升生产力的必然选择。本文聚焦于Unity平台,

weixin_34082854的博客 327

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

3个实战场景破解DataEase自定义图表开发难题

还在为DataEase内置图表无法满足你的个性化需求而烦恼吗?你是否遇到过这样的困境:业务部门需要特殊样式的雷达图、市场团队要求定制化的时间轴展示、或者产品经理想要与业务系统深度集成的交互逻辑?别担心,今天我将带你通过3个实战场景,彻底掌握DataEase自定义图表开发的核心技能。 ## 场景一:破解业务可视化难题 想象一下,你需要为库存管理系统创建一个实时监控大屏,但标准图表库中找不到合适的

gitblog_00635的博客 441

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Pandas多维聚合实战:银行级业务指标一次计算全交付

多维聚合是数据分析中将原始数据按多个业务维度(如区域、产品、时间)同步汇总的关键技术,其核心原理在于单次分组扫描实现多指标、多函数、多层级的向量化计算,显著规避重复I/O与内存冗余。该技术在金融风控、实时BI、客户行为分析等强时效、多角色协同场景中具备不可替代的工程价值——既能保障指标口径统一与审计可追溯,又可支撑分钟级报表刷新与自动化告警。本文聚焦银行真实生产环境,详解agg字典映射、unstack结构化、rolling时间上下文对齐、自定义函数业务语义嵌入等关键技术,覆盖groupby性能瓶颈治理、Mu

weixin_34401479的博客 411

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

开发者如何将重复性技术工作产品化,构建个人技术品牌与被动收入

在软件开发领域,自动化与效率提升是永恒的主题。其核心原理在于通过脚本、工具和系统化方法,将重复、耗时的操作转化为可复用、可扩展的解决方案。这种实践的技术价值在于,它不仅能解放开发者自身的时间,更能将个人经验沉淀为可传播、可迭代的资产。从编写部署脚本、撰写技术博客到维护开源项目,其应用场景贯穿于开发、运维、知识分享的全流程。这正是技术人实现从“时间换金钱”到“资产创价值”思维跃迁的关键。本文以 Spring Boot 部署、文档编写等具体场景为例,结合产品化思维与社区运营,为开发者提供了一条通过解决日常‘痛点

weixin_34326179的博客 424

Pandas多维聚合实战:银行风控场景下的高效指标计算

多维聚合是数据分析中将原始数据按多个业务维度(如客户、产品、时间)同步计算多种统计指标的核心技术,其本质是通过单次分组扫描实现多口径、多粒度、多函数的向量化输出。它依托pandas底层的哈希分组与Cython优化,在避免重复I/O和内存爆炸的前提下,显著提升ETL效率与指标一致性。该技术广泛应用于金融风控、电商运营、SaaS用户分析等强时效、多角色协同场景,尤其适合需同时交付均值、极差、滚动均值、自定义加权平均等异构指标的生产环境。本文聚焦银行级实战,详解agg字典语法、维度治理、MultiIndex扁平化

weixin_30607659的博客 343

1.4 从0到1:AIGC产品应用全景深度解析

通过对AIGC产品应用全景的深度解析,我们可以看到这项技术已经在多个维度上产生了深远影响。无论是按照内容类型、用户群体还是商业模式分类,AIGC都有着广泛而深入的应用场景。启发产品创意:从成功案例中汲取灵感规避重复建设:避免在红海市场中盲目竞争把握市场机会:发现未被充分满足的用户需求构建竞争优势:结合自身资源打造差异化产品在接下来的章节中,我们将从职业发展角度深入探讨AIGC产品经理的角色定位和能力要求,帮助大家更好地规划自己的职业发展路径。

yonggeit的博客 2939

软考-系统分析师-备考笔记

根据学习视频和一些资料整理的软考系统分析师考试笔记,2025年下半年通关

提子同学是我 1029

Mobile-Agent:3分钟掌握跨平台GUI自动化智能助手核心技术

**Mobile-Agent**是阿里通义实验室推出的强大GUI智能代理家族,它正在重新定义人机交互的未来。这个开源项目让AI能够像人类一样操作手机、电脑和浏览器,实现真正的跨平台自动化任务执行。无论你是开发者、研究人员还是普通用户,都能通过Mobile-Agent体验到下一代智能助手的强大能力。 ## 🚀 为什么你需要了解Mobile-Agent? 想象一下,只需简单描述你的需求,AI就能

gitblog_01099的博客 1092

实战:上亿数据如何秒查

最近在忙着优化集团公司的一个报表。优化完成后,报表查询速度有从半小时以上(甚至查不出)到秒查的质变。从修改SQL查询语句逻辑到决定创建存储过程实现,花了我3天多的时间,在此总结一下,希望对朋友们有帮助。 数据背景 首先项目是西门子中国在我司实施部署的MES项目,由于项目是在产线上运作(3 years+),数据累积很大。在项目的数据库中,大概上亿条数据的表有5个以上,千万级数据的表10...

FY19951211的博客 1562

报表性能优化

【摘要】 报表性能对用户的影响十分恶劣,所有用户查报表时都希望立等可取,超过 5 秒钟用户就会很不满意,更别提要求毫秒级响应的情况了。引起报表性能的原因有很多(数据量大、计算复杂、报表格式混乱),绝大部分是因为计算引起的,如果能将展现的数据能快速准备好,呈现的速度是飞快的!因此,解决报表性能问题的关键是报表数据准备!                 ...

Raqsoft 2591
上一篇: JDK1.5后增加了泛型,那么为什么要有泛型呢?我们该如何自定义泛型结构呢?
下一篇: 如何设置跨域隔离启用 SharedArrayBuffer
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值