关于算法:MATH0033-Numerical

MATH0033 Numerical Methods, 2020-2021, David HewettComputational homework 3Differential equationsExercises 1 and 2(a)-(e) (marked *) to be handed in and assessedDeadline: 2200 GMT Sunday 10th January.Please submit your solutions using the link on the course Moodle page.You should submit a single pdf file, created using the Matlab publishcommand, formatted as per the template provided on the Moodle page.EXERCISE 1* Consider the initial value problem,the exact solution of which is y(t) = tanh t = (e2t − 1)/(e2t + 1).(a) Compute numerical solutions to the initial value problem using the forward Euler methodwith equally spaced points tn = n20N, n = 0, . . . , N, for N = 19, 21, 40, 80 and 160.Produce a plot comparing the numerical solutions with the exact solution.For each choice of N compute the error maxn=0,...,N |un − y(tn)| and store these errors inan array efe. Also, compute and store the error |uN − y(20)| at the end of the interval.(b) Same as a) but using Heun’s method, to compute errors eheun.(c) Produce a loglog plot of efe and eheun against the relevant N values and use your resultsto read off the approximate convergence orders for the two methods. How do thesecompare to the theory from lectures? (Hint: follow the approach we used in computationalhomework 2)(d) The exact solution y(t) has a horizontal asymptote y(t) → 1 as t → ∞. Does every approximationobtained using the methods above reproduce the same asymptotic behaviour?How well is the value of y(20) approximated?Guided by the theory from lectures, but considering only the maximum value of |fy| onthe solution trajectory (rather than over all (t, y) ∈ R+ ×R), we might expect the criticalvalue of h below which the methods are stable to be h = 1. Is this what you observe inyour numerical results?How does the lack of stability for N = 19 (h = 20/19 > 1) manifest itself for the twodifferent methods (forward Euler and Heun)?1EXERCISE 2 In this exercise we bring together some of the techniques we have studied inthe course to solve an initial boundary value problem (IBVP) involving a parabolic partialdifferential equation, the heat equation.The problem is: given T > 0 find u : [0, 1] × [0, T] 7→ R such that∂u∂t (x, t) −∂2u∂x2(x, t) = 1 in [0, 1] × [0, T], (1)with u(0, t) = u(1, t) = 0 for all t ∈ [0, T] and u(x, 0) = sin(x) + 12x(1 − x). This problem isa simple model for the evolution of the temperature distribution u in a metal bar undergoinguniform heating, starting from an initial temperature distribution u(x, 0), where the bar isheld at constant (zero) temperature at its endpoints. For reference, the exact solution to thisproblem is given byu(x) = e−2tsin(x) + 12x(1 − x).To solve the IBVP numerically we will use the so-called method of lines. This involvesdiscretizing the spatial differential operator ∂2u/∂x2in the same way for all times t, so thatthe IBVP becomes a finite-dimensional system of ordinary differential equations in t, whichcan then be solved using a time-stepping scheme such as forward Euler, backward Euleror Crank-Nicolson. For the spatial discretization we shall use a standard finite differenceapproximation. Given N > 0, define equally spaced nodes 0 = x0 < x1 < . . . < xN = 1 onthe interval [0, 1] by xn = nh, n = 0, . . . , N, where h = 1/N. For a function u(x, t) we denotethe approximation of u(xn, t) by un(t), and we replace the second derivative ∂2u/∂x2(x, t) bythe finite difference formula (cf. theoretical exercise sheet 1)D2un(t) := un+1(t) − 2un(t) + un−1(t)h2.This approximation turns the IBVP into an IVP involving a system of ordinary differentialequations satisfied by the functions un(t), n = 1, . . . , N − 1. Explicitly, we obtain the systemdudt (t) = f(t, u(t)) = −Au + b, t ∈ [0, T], (2)where u = (u1, . . . , uN−1)T, and, for a given N > 0, the matrix A and vector b can beobtained in Matlab using the commands ...

March 14, 2022 · 8 min · jiezi

关于算法:CS241可视化分析

CS241 Final ProjectAnalysis and Visualization of Online Ride-Hailing Order DataProject for Principles and Practice of Problem Solving1 IntroductionRecently, the popularity of online ride-hailing systems, such as Didi and Uber, brings significant conveninenceto daily transportation. However, they are all facing notorious challenges, such as demand-supplygap. Suppose you are a data analyst, and are required to analyze and visulize order-related data to helpthe company solve challenges.2 Dataset DescriptionThe dataset includes 15 days order data in Chengdu city, partially from KDD Cup 2020. Here are someuseful fields:Table 1. Samples of Chengdu Order dataset.fields type description exampleorder id String ID of order eb9dd4095d9850e6287cefd813775a6cdepature time Float Ride Start Time 1477964797end time Float Ride End Time 1477966507orig lng Float Pick-up Longitude 104.092097319258orig lat Float Pick-up Latitude 30.7063482074305dest lng Float Drop-off Longitude 104.08673269432dest lat Float Drop-off Latitude 30.653252740962fee Float Fee of order 3.54In order to meet the requirements of refinement, we divide the main urban areas of Chengdu into 10 ×10grids, as shown in the figure below. The latitude and longitude of each lattice has been given. The programalso needs to be able to analyze and visualize the order information in the small grids.Fig. 1. Grid illustrated in Chengdu city.3 TasksTasks include mandatory part and elective part. All tasks should be coded in c++ and Qt.3.1 Mandatory PartDesign a graphic user interface, which can1) load the dataset. Allow users to select the fields and time span of users’ interest. A progress baris required to show the loading progress.2) display the spatio-temporal demand patterns. For example, the number of orders in Chengduover time, the number of orders in each fine-grained grids over time. Display forms include but notlimited to the line chart, histogram, pie chart, etc. Users should be able to tune the parameters,such as the starting time, ending time, time step and grid id, graphically. Interpolation is requiredto smooth the line when only a few data points are selected.3) display other valuable information. For example, the distribution of users’ travel time, order fees,etc. Moreover, total revenue of the company in a certain period of time is also displayable.Hint: Codes need to be implemented via multi-thread to prevent your program from being stuck whenyou are computing while displaying.3.2 Elective TasksImplement additional analysis by yourself. Use your knowledge and freely exert your creativity, and wewon’t limit views from which data is analyzed and displayed. Please note that one can implementup to two functions in elective tasks. Functions that are more than two will not be countedin the total score. Here are some recommendations:1) Map-related analysis.• Show the spatial distribution of order origins on the map, such as the thermal diagram in aperiod of time;• Show how people transfer, i.e., the connections from the origins to the destinations;• Route planning: input starting and ending positions, and display the recommended route on themap.Hint: We recommend openstreetmap library.2) Prediction-related analysis.• Given the origin and the destination, how long will it take for a passenger to arrive?• Given a starting position, where may passengers go?3) Query-related analysis.• Retrieve orders: return a set of similar orders based on the input order information.4 Submission RequirementsThe project will be graded on the basis of your project report, video demo and the source codes.You need to zip and upload these files to the Canvas. It is due by 11:59pm on December 27th, 2020.No late submission will be accepted.4.1 Report Requirements ...

March 12, 2022 · 4 min · jiezi

关于算法:6CCS3VER

6CCS3VER 2020-21Project – 30% of your markDeadline 18/12/2020• Please make sure you read the instructions fully before you start implementing theproject.• The project is done on the Xchek tool, available as a part of the KCL VM installationor as a standalone software http://www.cs.toronto.edu/~ar... , and it works onLinux and Mac machines.• The final product of the project is the report accompanied by appropriate source codefiles for the models and the sets of properties. The source code files should be writtenin GCLang and compile in Xchek. Executing the properties should have the resultdescribed in your report.• In the project, you will implement a system that simulates a counter (modulo 8 andthen modulo 16) interacting with the environment as a binary model for Xchek and aset of properties. The stages of the project are as follows: ...

March 11, 2022 · 3 min · jiezi

关于算法:FIT9131分析

FIT9131 November Semester 2020 Assignment 1Escape from IvaliceIntroductionThis document specifies the programming component of Assignment 1. This component is due by10pm Friday of Week 7 (18th December, 2020). Heavy penalties will apply for late submission.This is an individual assessment task and must be your own work. You must attribute the source ofany part of your code which you have not written yourself. However, you must ensure to be able tounderstand, explain, and/or modify any part of your program. Please note the section on plagiarism inthis document.The assignment must be done using the BlueJ environment.The Java source code for this assignment must be implemented according to the Java CodingStandards for this unit.Any points needing clarification may be discussed with your tutor in the lab classes.Completion of this assignment contributes towards the following FIT9131 learning outcomes: ...

March 11, 2022 · 8 min · jiezi

关于算法:科创人智行者CEO张德兆这个时代就是最大的背景最硬的资源

张德兆,智行者董事长&CEO 清华大学博士、博士后、教授级高工清华大学翻新守业企业导师多项智能汽车国家标准、智能网联汽车倒退路线图次要起草人曾领导多项ADAS算法及零碎开发并实现量产配套在清华大学积攒超过百万公里路测里程的数据教训 —文 | babayage编辑 | 笑 笑坐在街角空想的少年只管童年时家境贫寒,张德兆却很思念那个有大把工夫能够节约的年代。 同学们放学休假后走街串巷、奔跑打闹,他偏喜爱坐在街角发愣,能一个人从天黑坐到日落,时不时会与脑海中天马行空的念头相视而笑。另一大喜好就是看书。买书对张家来说是笔不小的开销,幸好班上有位同学家里开了一间书店,从念书到高考就没感觉学习难的张德兆动起了心理,“我辅导你做作业,你家的书借我看看”。这一“翻新商业模式”加持之下,张德兆结识了金庸、古龙,在他们构建的空想江湖中逆天改命、替天行道。他最喜爱的两个人物是郭靖和李寻欢,前者教会他何谓家国,“那时候不了解郭靖为何死守不退,隐居桃花岛何不美哉?长大后才了解什么叫‘侠之大者’”;后者教会他,人生中有些事不能放下,而为了这件事,能够放下其余所有。至于童年幻想,“广东人家比拟求实,要么升官、要么发财”。那个年代的梅州娃娃心中,香港就是宇宙的核心,人这一生存破天去也就是李嘉诚们的模样。张德兆的他乡大埔县离李嘉诚的祖籍潮安只有几十公里途程,港商回馈乡里修桥铺路、造医院盖学校,十里八乡都要敲锣打鼓、鞭炮震天。在一片锣鼓喧天中,张德兆萌发了第一个幻想:“过后我想,我要成为这样一个人,一个可能帮忙到乡里乡亲的有钱人。”怀揣着这一幻想,高考时张德兆填报了清华经管,在老师“你不能只填一个业余”的斥责声中,顺手补填了汽车业余。恶趣味的命运之手扳了道岔,张德兆被清华汽车业余录取,他倒是看得很开,“汽车业余也不厌恶,读了再说”。未曾想,从本科到博士,张德兆在清华汽车业余一待就是9年。 落后又如何?追! 2002年,张德兆入住清华园。他眼前铺陈的风光满篇荒凉,是中国汽车制作工业与国外先进企业相比落后起码30年的微小差距,是一眼看不到止境的失望。尤其对于清华大学汽车业余的顶级学子来说,这种失望具体得刺心扎眼:某车厂招工,硕士生,工资6000元/月,提供双人宿舍,本科生3000元/月,提供四人宿舍,只有博士生才享有单人宿舍的特权;本业余毕业生往往毕业便转行,互联网和金融方向是首选,一位颇有成就的学长拿到了跨行业Offer,头都不回转身就走,只为对方提供了20万年薪;另一位博士生学长毕业后进了车厂,负责标定工作,“本科生就能做,这齐全是资源节约”……行业落后,导致人才凋敝。哀鸿遍野之下,张德兆却成为了常见的异类,随着钻研能力一直晋升,寰球考查、调研的眼界越宽阔,同侪大都在无可辩驳的微小差距下产生无力感,他的胸膛中反而点燃了一支火把:“差距的确大,可追赶空间也大,能不能通过一代又一代人的致力,把这个差距放大一些?”“有些事,总要有人做。”清华的学校领导和汽车系领导十分重视汽车方向的学术建设,“中国是汽车大国,但不是汽车强国,清华学子能不能做些什么?另外,学校领导常说,清华的学生,要上大舞台,要去祖国最须要的中央。这两句话对我影响很大。”带着被充沛激发的雄心壮志和报效祖国的满腔热血,张德兆立下抱负,誓要通过本身致力,为晋升中国汽车工业的技术水平贡献力量。2011年,博士毕业后的张德兆决定守业。几位气味相投的同学,带着导师的激励和一腔孤勇,以“简直什么都不懂”的赤膊状态杀进了残暴的商界战场。 第一次守业,一个坑都不少踩 事实证明,没有人能违反守业定律:不会的必将吃亏,不懂的定要踩坑——即使你是清华博士。 第一次守业的教训过于惨烈,以至于张德兆在所有采访中都只会一笔带过。语言片段中拼凑得悉,首次守业的构思,是为车厂提供碰撞预警、车道偏离、360度环视及主动泊车等零碎产品。“人只有经验苦楚能力成长,第一次守业期间我每天都很苦楚,所以成长得比拟快。”张德兆笑着说道,“融资、拓客、销售、治理、洽购……每个词都意识,但都不晓得如何去做”。晓得要有财务,可连出纳和会计都分不清;融资认为是道简略的数学题;领会到了什么叫酒桌上能力谈下来生意,素日滴酒不沾的张德兆,第一次领会到宿醉后的头疼欲裂……2014年,张德兆又变回了那位在老家街边发着呆、成天不发一言的少年,每天上午忙完琐事,下午就启动自闭模式、苦思将来之路,“外围话题是:做车厂的供应商不仅累,还要面对每年提价的压力。新模式在哪,它长什么样,下一步到底该怎么做?”他寻找到的最终答案是:独立摸索主动驾驶技术商业化之路。 二次守业:四大准则锚定策略方向智行者创建于2015年,彼时无人驾驶、主动驾驶尚未成为资本宠儿,“咱们的确没什么背景,但这个时代就是咱们最大的背景。”张德兆回顾道。技术型创业者在企业启动阶段,大都会抉择“以我的项目碰触场景、以服务内容作为产品积淀的养分池”这一模式,但智行者脱胎于我的项目制的前身,深感这一模式在汽车行业内不具备可持续性,于是被动斩断脐带,在最后的一年工夫内,开始了字面意义上的闭门造车。闭门不是闭眼,基于张德兆对主动驾驶这一畛域的粗浅洞见,二次守业的智行者团队早早便确立了明确的策略定位以及策略准则,张德兆将其演绎为四点:首先,技术可达,技术可达的规范是去掉安全员,“只有还须要安全员都不叫真正大的商业化落地”。第二,市场规模足够大,在张德兆看来,每一个场景的复杂程度、整体投入及肯定工夫内达到的渗透率等都是相当的,因而,市场体量越大,带来的商业回报也就越高(笔者注:“尺度不变性”的胜利利用,并不常见,重点分享)。第三,社会基础设施要欠缺,比方法律法规、保险、民众接受程度等。最初,无人驾驶技术要能真正帮忙到这个行业,在汽车行业深耕多年,张德兆深知其中山高水深,“每个细分畛域都有十分深的know-how,咱们的劣势在于主动驾驶技术自身,而不在于各个行业的专识,因而,智行者更心愿用无人驾驶技术对传统行业赋能,而非颠覆”。守业企业,开创团队达成策略共识的过程中不免有不同意见,比方,为了兼顾商业化和数据积攒,张德兆决定“降维倒退”,将场景利用定位到低速关闭空间,而跃跃欲试、信念爆棚的技术团队在策略取向上显著激进,心愿一步到位、做凋谢公路上的无人驾驶。“我了解大家的情绪,打个比方就是清华博士去当幼教,大家很难承受。但决策者肯定不能迷茫。”经验过挫折洗礼的张德兆展现出了当仁不让的领导者担当,“我承当最大的责任,为决策后果负责,防止过多工夫节约在争执上”。条条大路通罗马,但耗费的日程有短长。精确的定位、动摇的取舍、节制的技术危险取向,帮忙智行者从默默无名的行业新丁,疾速成长为行业内公认的头部玩家。2016年,一家车厂找了某上市公司做车,智行者以备胎、陪跑的身份参加其中。展现现场,上市公司的车两小时一趴窝,智行者的车在10天内零故障、零失误。一战成名。 从软硬联合到数据为王 现在回望智行者倒退之路,张德兆展现出弱小的策略判断力居功至伟。评估策略判断力高下,一看驶入无人区、盲视线时的方向抉择,二看如何在纷纷杂乱的乐音中辨认外围变量,精确迭代。起步之初两年工夫,智行者次要以软件技术为主,但在倒退过程中张德兆逐步意识到了几道难以逾越的关卡:第一,客户车厂的集成能力广泛有余;第二,To B浪潮尚处初期,国内客户对软件的付费意识尚未齐全激活,“很多人都感觉你是软件就该收费”。为了实现端到端的性能交付,并且投合客户“硬件才值钱”的心智认知,2017年,智行者正式决定启动硬件产品策略。“真的做上来之后发现,软件、硬件之间存在长期相互优化、相互耦合的过程。有时候软件搞不定、只能晋升硬件,有时候硬件搞不定、只能去优化算法,软硬件一体是条正确的路”。如是数年,随着人工智能技术利用越来越成熟,智行者意识到数据的重要性,策略再次降级,“咱们本人开发了一个主动驾驶数据闭环零碎,从而造成由算法、算力、数据形成的AI时代主动驾驶大脑铁人三项。智行者的数据局部,在全国全行业内笼罩的场景最多,既蕴含凋谢的结构化路线场景,又蕴含半封闭非结构化的场景。只管算法、算力十分重要,但咱们认为,将来的外围竞争力不在算法,在主动驾驶畛域,大家的算法和技术架构都会趋同,决出输赢的肯定是数据”。将数据并入策略外围因素,此举对智行者产品方向和场景抉择产生了十分直观的影响。主动驾驶行业获取数据无非两种模式,一种是依附本人养测试车队来获取,但张德兆认为这种模式老本高、速度慢,“每台车老本就大概一百万,再加上每年的经营老本,而且边际效应衰减十分快,数量上也很难扩大”。第二种形式靠产品理论应用,即最开始时给客户凋谢一个低版本软件,客户在理论过程中通过一直返回数据、进行算法的迭代,通过OTA(Over-the-Air Technology,地面下载技术)的形式给客户晋升性能,从而取得更多相应的利用场景,数据和算法实现正向的螺旋。智行者抉择了第二种,决策的外围准则之一是盈利,“咱们是商业化组织,肯定要思考盈利。多场景的商业化落地意味着更低的老本、更快的速度获取更加丰盛场景的数据,这也就意味着像咱们这样的主动驾驶公司将来的生存”。基于这一判断,智行者的场景抉择视线宽阔了许多。 广积粮,持久战,农村突围城市谈起主动驾驶大多人会想到乘用车、出行服务,但在智行者看来,主动驾驶技术恰好能够拓宽“驾驶”的商业边界,除了出行行业外,环卫清洁、物流配送、消防、边陲平安、国防作战……都是基数广大兼具深度的高价值场景。张德兆形象地将出行场景形容为“城市”,其余场景则是智行者的根据地、粮仓,熟读《毛选》的他布局了主动驾驶行业“农村突围城市”的倒退路线。最后圈定的两个根据地是环卫、物流,场景遍布全国、行业规模微小,但物流行业拓展时遭逢了一些“算账不太适合”的问题,于是及时调转方向,并最终在特种车畛域开疆拓土、稳住了场面。环卫+特种车两大根据地,既能一直产生数据,又能带来正向的利润奉献。张德兆非常关注造血能力,源自他对资本市场和主动驾驶行业的充沛理解,“资本退出的周期个别是5-8年,但主动驾驶行业是场马拉松,注定要跑很长时间,如果不能自我造血,当资本决定退出的时候会产生很多麻烦事,甚至带偏了倒退方向,这是我不心愿看到的。”在张德兆的保持下, 2018年之前智行者始终处于微盈利状态,之后几年因疾速倒退而呈现账面亏损,但其造血能力始终放弃在行业内第一梯队。 企业治理:奋斗≠劳动,奋斗必须有成绩家喻户晓,科技创新型企业往往意味着治理、治理难度偏高。作为一家处于疾速发展期、人员规模冲破400人的高新技术企业当家人,张德兆对于企业治理有着本人独到的了解。首先,不让奋斗者吃亏。对于基层员工多谈理论利益,少谈发挥格调,不让奋斗者吃亏,“但奋斗不等于劳动,发明出有价值的成绩才是真正的奋斗,管理层要和员工就成绩产出达成共识,奖惩高深莫测”。其次,多打仗,人人有挑战、人人上战场,“不打仗憋在家里就会出问题”。第三,对于外围团队,张德兆崇奉冯仑的“排座次、分金银、论荣辱”。排座次,一个要害岗位只能有一个人担当,大家各司其职;分金银,在利益的调配上,张德兆从不计较个人所得,尽可能优先满足袍泽弟兄;论荣辱,在张德兆看来是最容易被忽视的一点,“外围团队都是人中龙凤,对人生的要求除了利益,还有荣誉”,因而他十分注意外围团队成员集体荣誉、集体成就的积攒,并将智行者团队取得的荣誉轮流调配给守业搭档。 心愿将来有余力帮忙更多少年2021年,智行者交出了亮眼的商业化成绩单,支出是上一年的3倍之多。具体在业务端,继拿下T3出行100台Robotaxi订单,又敲定100+台xPatrol无人巡逻车订单。同时,智行者也与广汽研究院签订了策略单干协定,与北汽也有我的项目停顿。同时,在北京冬奥会上,智行者被选中为服务商。3款搭载智行者无人驾驶大脑的无人车——Robotaxi、蜗小白清扫车、大型清扫车都进入了冬奥园,成为了2022年冬奥保障团队中的重要参加力量,向世界展示中国“科技冬奥”的魅力。捷报频传,智行者也被业内称为“跨越式成长模式的代表”,可张德兆并没有因而波动策略定力,“马拉松的判断没有变,目前只跑了5公里的论断也没有变”。走出近乎半生,张德兆的心田却还保留着不变的底色:仍旧喜爱读书,仍旧心愿实现童年时的幻想,在锣鼓喧天中为本人捐建的学校、图书馆剪彩。当然,还有成为胜利商人的幻想,“有天和我爱人聊天,我说感觉本人还有机会成为商业巨子,因为我有口音嘛,她问我,为什么你想当商业记者(笑)?”

March 11, 2022 · 1 min · jiezi

关于算法:二分查找的边界设定

边界值left和right的初始值例如在有序数组中查找指定值的下标时,可能的后果范畴为[0, len-1],因而初始化时应该应用: int left = 0, right = len - 1;但在查找插入地位问题(在有序数组中,找到插入指定值target的下标)中,边界的下标取值范畴是[0, len],即len也在取值范畴中,因而初始化时该当设置: int left = 0, right = len;计算mid值为了防止溢出,计算mid通常应用: int mid = left + (right - left) / 2;放大边界通常须要应用一个if...else...语句来扭转边界,最不便清晰的办法,是将arr[mid] < target、arr[mid] == target和arr[mid] > target三种状况别离写出。 例如,在查找插入地位问题中,咱们须要找到第一个小于等于target值的地位,这时能够思考几个条件: arr[mid] < target: 这时左边界left应该在mid的右侧,因而应该取left = mid + 1arr[mid] > target: 这时右边界right应该在mid的左侧,因而应该取right = mid - 1arr[mid] == target: 这时mid左侧仍可能存在与target相等的元素,因而应使right = midif (arr[mid] < target) { left = mid + 1;} else if (arr[mid] == target){ right = mid;} else { right = mid - 1;}循环的条件通常将循环条件设为left < right,这样当循环退出时,能够保障left == right。 ...

March 11, 2022 · 1 min · jiezi

关于算法:ESTR1002-2020

ESTR1002 2020 – 21 Term 1,Project ExtensionSince we cannot have face‐to‐face final exam in this semester, we have arranged project extension as discussed in the first lecture of this course. The project extension will contribute to 10% of total course grade and you need to choose and complete 3 out of 6 extension items below by modifying your code of the basic part of the project:  Step‐by‐Step Visualization Currently,you are only required to display the game board after each swap operation. In this extension,you are required to display the game board in the intermediate steps, including the game board after eliminating all numbers, after moving down the numbers and after generating the new numbers, etc. You may use “0”to represent those empty cells on the game board. Human player vs. AI player Instead of having only one player to play the game, you are required to implement a competitive game that the human player and the AI player can take turns to perform the swap operations. The scores of one player is the total number of scores obtained by each player in the swap step of his/her turn.Your program should record the score of each player, and display their scores on top of the game board after each swap. Random Generation of the “Stone Block” In the original “Candy Crush” game, there is a special type of cell called“StoneBlock”,which cannot be swapped and eliminated.In this extension, you can include this type of block in your program and the block should satisfy the following requirements: ‐ First,before a game start,your program should be able to generate random number of such stones at random locations.Second,your program can detect that the swap operations that try to move a “Stone Block”,and report an invalid step to the user. ‐ Also,having 3“Stone”blocks in a row or column will not eliminate any blocks. This type of block should be displayed as“@”on the game board. Random Generation of the“Choco Block” Similar to the“Stone Block”,there is another type of Candy in the original Candy Crush Game called the “Choco Block”,which also cannot be wapped and eliminated.Furthermore,a“Choco Block”will lock its 4 neighbor numbers(i.e., top,down,left,right),and does not allow them to be swapped and eliminated. In your implementation,you should treat each of the“Choco Block”and its four neighbors as a“Stone Block”.However, instead of keeping all the“Stone Block” throughout the game, your program needs to randomly remove one existing “Choco Block”every 5 steps and also randomly grow (change a number to a “Choco Block”) a“Choco Block”after the removal.This type of block should be printed as“C”in the game board. Random Generation of an“Ice Block”An “Ice Block”contains the same properties that the“Stone Block”has,but an“Ice Block”can“melt”(change to a number) if the numbers of its neighbors(i.e.top,down, left, right) are eliminated.This type of block should be printed as“!”on the game board. Generation of Bomb In the last extension, your program should be able to generate a special block, called “Bomb”, when the user gets more than 30 points in 1 step.A“Bomb”can be swapped with any other neighbor numbers,and after swapping,all the special blocks on the game board will be eliminated.A“Bomb”should be printed as“B”on the game board. If you choose this item,you must also choose at least one of items 3‐5 to ensure that you can test the features. Grading: Instead of integrating your extended functions into your basic program(see project specification),you need to prepare the project extension as a separate version of the program. You have to submit the project extension to the blackboard by Dec 30 and besides, and need to do a demonstration of your program on the project extension demo day (Dec.30). On the demo day,The TA will evaluate your extension features one by one, by assessing the correctness of each extended feature, and asking your questions on your code. Note that to show the correct implementation of your feature, you MUST design a scenario (i.e., a planned list of swap operations) by yourself, and demo how your features work to the TA on the project demo day. 

March 11, 2022 · 3 min · jiezi

关于算法:SAPDFSAF升级版合理的损失值加权以及金字塔特征选择-ECCV-2020

针对anchor-point检测算法的优化问题,论文提出了SAPD办法,对不同地位的anchor point应用不同的损失权重,并且对不同的特色金字塔层进行加权独特训练,去除了大部分人为制订的规定,更加遵循网络自身的权值进行训练 起源:晓飞的算法工程笔记 公众号论文: Soft Anchor-Point Object Detection 论文地址:https://arxiv.org/abs/1911.12448论文代码:https://github.com/xuannianz/SAPD not officialIntroduction Anchor-free检测办法分为anchor-point类别和key-point类别两种,绝对于key-point类别,anchor-point类别有以下有点:1) 更简略的网络结构 2) 更快的训练和推理速度 3) 更好地利用特色金字塔 4) 更灵便的特色金字塔抉择,但anchor-point类别的准确率个别比key-point类别要低,所以论文着力于钻研妨碍anchor-point类别准确率的因素,提出了SAPD(Soft Anchor-Point Detecto),次要有以下两个亮点: Soft-weighted anchor points。anchor-point算法在训练时个别将满足几何关系的点设置为正样本点,其损失值权重均为1,这造成定位较不精确的点偶然分类置信度更高。实际上,不同地位的点的回归难度是不一样的,越凑近指标边缘的点的损失值权重应该越低,让网络集中于优质anchor point的学习。Soft-selectedpyramid levels。anchor-point算法每轮训练会抉择特色金字塔的其中一层特色进行训练,其它层均疏忽,这在肯定水平上造成了节约。因为其余层尽管响应不如被抉择的层强,但其特色散布应该与被抉择层是相似的,所以能够赋予多层不同权重同时训练。Detection Formulation with Anchor Points 论文首先介绍了大抵的anchor point指标检测办法的网络结构以及训练方法。 Network architecture 网络蕴含骨干网络以及特色金字塔,特色金字塔每层蕴含一个detection head,特色金字塔层标记为$P_l$,$l$为层数,层的特色图大小为输出$W\times H$的$1/s_l$倍,$s_l=2^l$为stride。个别,$l$的范畴为3到7,detection head蕴含分类子网和回归子网,子网均以5个$3\times 3$卷积层结尾,而后每个地位别离预测$K$个分类置信度以及4个偏移值,偏移值别离为以后地位到指标边界的间隔。 Supervision targets 对于指标$B=(c, x, y, w, h)$,核心区域为$B_v=(c, x, y, \epsilon w, \epsilon h)$,$\epsilon$为缩放因子。当指标$B$被赋予金字塔层$P_l$且anchor point $p_{lij}$位于$B_v$内时,则认为$p_{lij}$是正样本点,分类指标为$c$,回归指标为归一化的间隔$d=(d^l, d^t, d^r, d^b)$,别离为以后地位到指标四个边界的间隔: $z$为归一化因子。对于负样本点,分类指标为背景($c=0$),定位指标为null,不须要学习。 Loss functions 网络输入每个点$p_{lij}$的$K$维分类输入$\hat{c}_{lij}$以及4维地位回归输入$\hat{d}_{lij}$,别离应用focal loss和IoU loss进行学习: ...

March 9, 2022 · 1 min · jiezi

关于算法:FoveaBox细节差别另一种DenseBoxFPN的Anchorfree方案-IEEE-TIP-2020

作为与FCOS和FSAF同期的Anchor-free论文,FoveaBox在整体构造上也是基于DenseBox加FPN的策略,次要差异在于FoveaBox只应用指标核心区域进行预测且回归预测的是归一化后的偏移值,还有依据指标尺寸抉择FPN的多层进行训练,大家能够学习下 起源:晓飞的算法工程笔记 公众号论文: FoveaBox: Beyound Anchor-Based Object Detection 论文地址:https://arxiv.org/abs/1904.03797论文代码:https://github.com/taokong/FoveaBoxIntroduction 论文认为anchor的应用不肯定是最优的搜寻指标的形式,且受人眼视网膜地方凹(fovea)的启发:视觉区域的中部有最高的视觉敏锐度,所以提出了anchor-free指标检测办法FoveaBox。 FoveaBox联结预测每个无效地位为指标核心的可能性及其对应指标的尺寸,输入类别置信度以及用以转化指标区域的尺寸信息。如果大家看过很多Anchor-free的检测计划,可能感觉论文的实现计划很常见,确实,其实这篇文章也是Anchor-free井喷初期的作品,整体思路很纯正,也是很多大佬都想到的思路,在浏览时须要关注以下细节: 以指标的核心区域进行分类预测与回归预测将回归预测的是归一化后的偏移值训练时可指定FPN多层同时训练提出特色对齐模块,应用回归的输入来调整分类的输出特色FoveaBox Object Occurrence Possibility 给定GT指标框$(x_1, y_1, x_2, y_2)$,将其映射到特色金字塔层$P_l$: $s_l$为特色层绝对于输出的stride,正样本区域$R^{pos}$为大抵为映射框的放大版本: $\sigma$为人为设定缩放因子。在训练阶段,正样本区域内的特色点标记为对应的指标类别,其余的区域为负样本区域,特色金字塔每层的输入为$C\times H\times W$,$C$为类别总数。 Scale Assignment 网络的指标是预测指标的边界,间接预测是不稳固的,因为指标尺寸的跨度很大。为此,论文将指标尺寸归为多个区间,对应特色金字塔各层,各层负责特定尺寸范畴的预测。给予特色金字塔$P_3$到$P_7$根底尺寸$r_l=2^{l+2}$,则层$l$负责的指标尺寸范畴为: $\eta$为人工设置的参数,用于管制特色金字塔每层的回归尺寸范畴,不在该层尺寸范畴内的训练指标则疏忽。指标可能落到多个层的尺寸范畴内,这时应用多层进行训练,多层训练有以下益处: 邻接的特色金字塔层通常有相似的语义信息,可同时进行优化。大幅减少每层的训练样本数,使得训练过程更稳固。Box Prediction 在预测指标尺寸时,FoveaBox间接计算正样本区域$(x,y)$到指标边界的归一化的偏移值: 公式4先将特色金字塔层的像素映射回输出图片,再进行偏移值的计算,训练采纳L1损失函数。 Network Architecture 网络结构如图4所示,骨干网络采纳特色金字塔的模式,每层接一个预测Head,蕴含分类分支和回归分支。论文采纳较简略的Head构造,应用更简单的Head能够取得更好的性能。 Feature Alignment 论文提出了特色对齐的trick,次要是对预测Head进行革新,构造如图7所示, Experiment 与SOTA办法进行比照。 Conclusion 作为与FCOS和FSAF同期的Anchor-free论文,FoveaBox在整体构造上也是基于DenseBox加FPN的策略,次要差异在于FoveaBox只应用指标核心区域进行预测且回归预测的是归一化后的偏移值,还有依据指标尺寸抉择FPN的多层进行训练。因为FoveaBox的整体实现计划太纯正了,与其它Anchor-free办法很像,所以始终投稿到当初才中了,作者也是相当不容易。 如果本文对你有帮忙,麻烦点个赞或在看呗~ 更多内容请关注 微信公众号【晓飞的算法工程笔记】

March 7, 2022 · 1 min · jiezi

关于算法:算法tree二叉树的最大深度

题目地址 我的解法 /** * 2ms 21.07 * 41M 33.17 * 其实是广度优先搜寻 * 切入点是一层一层看,依据以后层构建下一层。 * */ public static int maxDepth(TreeNode root) { if (null == root) { return 0; } int deep = 1; List<TreeNode> curLevel = new ArrayList<>(); curLevel.add(root); List<TreeNode> nextLevel = null; while (hasNextLevel(curLevel)) { nextLevel = new ArrayList<>(); for (TreeNode cur : curLevel) { if (null != cur) { nextLevel.add(cur.left); nextLevel.add(cur.right); } } curLevel = nextLevel; deep ++; } return deep; }官网-广度优先搜寻 /** * 官网的广度优先搜寻 * 使用了Queue @see MyQueue * */ public static int maxDepth_l1(TreeNode root) { if (null == root) { return 0; } Queue<TreeNode> curLevel = new LinkedList<>(); curLevel.offer(root); int deep = 0; while (!curLevel.isEmpty()) { int size = curLevel.size();//TODO 固定poll次数 while (size > 0) { TreeNode curNode = curLevel.poll(); if (curNode == null) { continue; } if (curNode.left != null) { curLevel.offer(curNode.left); } if (curNode.right != null) { curLevel.offer(curNode.right); } size --; }// Queue<TreeNode> curLevelTemp = curLevel;// for (TreeNode cur : curLevelTemp) {java.util.ConcurrentModificationException// if (cur == null) {// continue;// }// if (cur.left != null) {// curLevel.offer(cur.left);// }// if (cur.right != null) {// curLevel.offer(cur.right);// }// curLevel.poll();// } deep ++; } return deep; }官网-深度优先搜寻 /** * 官网深度优先搜寻 * 使用递归 * 如果咱们晓得了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为 * * max(l,r) + 1 * * 而左子树和右子树的最大深度又能够以同样的形式进行计算。 * */ public static int maxDepth_l2(TreeNode root) { // 3 // / \ // 9 20 // / \ // 15 7 if (root == null) { return 0; } else { int maxLeft = maxDepth_l2(root.left);//1 int maxRight = maxDepth_l2(root.right); return Math.max(maxLeft, maxRight) + 1; } }拓展-DFS&BFS深度优先搜索算法DFS1、算法步骤:——拜访顶点v;——顺次从v的未被拜访的邻接点登程,对图进行深度优先遍历;直至图中和v有门路相通的顶点都被拜访;——若此时图中尚有顶点未被拜访,则从一个未被拜访的顶点登程,从新进行深度优先遍历,直到图中所有顶点均被拜访过为止2、DFS属于自觉搜寻。深度优先搜寻是图论中的经典算法,利用深度优先搜索算法能够产生指标图的相应拓扑排序表,利用拓扑排序表能够不便的解决很多相干的图论问题,如最大门路问题等等。个别用堆数据结构来辅助实现DFS算法。 ...

March 6, 2022 · 3 min · jiezi

关于算法:如何理解快速排序和归并排序

疾速排序理论就是二叉树的前序遍历,归并排序理论就是二叉树的后序遍历。 疾速排序的逻辑是,若要对 nums[lo..hi] 进行排序,咱们先找一个分界点 p,通过替换元素使得 nums[lo..p-1] 都小于等于 nums[p],且 nums[p+1..hi] 都大于 nums[p],而后递归地去 nums[lo..p-1] 和 nums[p+1..hi] 中寻找新的分界点,最初整个数组就被排序了。 疾速排序的代码框架如下: void sort(int[] nums, int lo, int hi) { /****** 前序遍历地位 ******/ // 通过替换元素构建分界点 p int p = partition(nums, lo, hi); /************************/ sort(nums, lo, p - 1); sort(nums, p + 1, hi);}先结构分界点,而后去左右子数组结构分界点,你看这不就是一个二叉树的前序遍历吗再说说归并排序的逻辑,若要对 nums[lo..hi] 进行排序,咱们先对 nums[lo..mid] 排序,再对 nums[mid+1..hi] 排序,最初把这两个有序的子数组合并,整个数组就排好序了。 归并排序的代码框架如下: void sort(int[] nums, int lo, int hi) { int mid = (lo + hi) / 2; // 排序 nums[lo..mid] sort(nums, lo, mid); // 排序 nums[mid+1..hi] sort(nums, mid + 1, hi); /****** 后序地位 ******/ // 合并 nums[lo..mid] 和 nums[mid+1..hi] merge(nums, lo, mid, hi); /*********************/}先对左右子数组排序,而后合并(相似合并有序链表的逻辑),你看这是不是二叉树的后序遍历框架?另外,这不就是传说中的分治算法嘛,不过如此呀说了这么多,旨在阐明,二叉树的算法思维的使用宽泛,甚至能够说,只有波及递归,都能够形象成二叉树的问题。 ...

March 6, 2022 · 1 min · jiezi

关于算法:Leetcode-236-二叉树最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共先人。 示例 1: 输出:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输入:3解释:节点 5 和节点 1 的最近公共先人是节点 3 。示例 2: 输出:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4输入:5解释:节点 5 和节点 4 的最近公共先人是节点 5 。因为依据定义最近公共先人节点能够为节点自身。示例 3: 输出:root = [1,2], p = 1, q = 2输入:1解题思路首先这道题的函数签名如下: TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q);root 节点确定了一棵二叉树,p 和 q 是这这棵二叉树上的两个节点,让你返回 p 节点和 q 节点的最近公共先人节点。 所有二叉树的套路都是一样的,能够先把遍历的框架写进去: TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { // 前序遍历 TreeNode left = lowestCommonAncestor(root.left, p, q); // 中序遍历 TreeNode right = lowestCommonAncestor(root.right, p, q); // 后序遍历}当初咱们思考如何增加一些细节,把框架革新成解法。遇到任何递归型的问题,无非就是灵魂三问: ...

March 6, 2022 · 2 min · jiezi

关于算法:逆波兰表达式计算包含括号的四则运算表达式

平时咱们进行数学计算应用的常见书写形式就是中断表达式,即每一个运算符号都位于计算数的两头,如下: $$(1+2)\div3$$ 而这对于计算机进行求取后果来说,并不是一个最优的计划,毕竟每次读取到一个运算符,都得判断一次优先级,并且须要确定两个计算数的指标地位。在四则运算的根底之上,还在增加一个括号的应用,这将更为简单,中断表达式将更加对计算机不敌对。那什么样的表达式构造会是计算机较为优化的呢? 答案就是逆波兰表达式,也叫做后缀表达式,它最大的益处就是无需再思考运算符的优先级,也无需思考计算数指标地位。当然,实现逆波兰表达式的转换,仍须要对运算发优先级进行判断,但给出一个逆波兰表达式,就能够间接读取计算,无需思考优先级。 逆波兰表达式特色: 不存在括号运算符来束缚,也无需思考运算符的优先级运算符的两个计算数位于运算符前两位严格遵循“从左到右”运算,越后的运算符越晚计算逆波兰表达式如下: $$1\quad2\quad3\quad\div\quad-$$ 而实现一个带有括号的应用的中断表达式转换为逆波兰表达式的思路,既能够以二叉树的后序遍从来实现,也能够应用栈的形式的实现,这里将采纳栈的形式实现。对于括号的解决,咱们能够从它的性质下手,括号的呈现肯定是成对存在的,有左括号,必然有右括号。只有在读取的过程中,遇到左括号就入栈,无论多少重左括号,直至遇到右括号,出栈直至左括号出栈,期间进行数字运算。 算法思路实现一个中断表达式转换成后缀表达式,再根据后缀表达式计算出最初的运算后果的基本思路如下: 将中断表达式转换为后缀表达式 定义两个栈:符号栈 s1、两头后果栈 s2注:s2 采纳 add() 办法入栈,保障程序输入为所需后果,且其无需弹栈,采纳 List 作为栈的存储构造,s1 都能够。 定义一个中断表达式字符串 expression2遍历中断表达式,将中断表达式转成对应的list一一遍历中断表达式,并判断字符类型数字: 入栈两头后果栈 s2 左括号: 入栈符号栈 s1 右括号: 顺次弹出 s1 栈顶元素,并压入 s2,直至遇到左括号为止,将左括号弹出 s1 栈,打消括号 加减乘除运算符: 获取以后遍历字符优先级,当小于或等于栈顶优先级,或为左括号时,s1 栈顶运算符弹出并压入 s2 中,最初将以后字符压入 s1 栈中 将两头后果栈程序输入为最终后果如下即为应用栈构造实现逆波兰表达式的基本思路图示 读取并计算后缀表达式后果 定义后果栈对逆波兰表达式一一遍历,判断字符若为数字,压入栈中若为运算符,顺次弹出栈中两个元素,进行运算,将后果入栈遍历完结,将后果出栈,即为最终答案代码如下import java.util.ArrayList;import java.util.List;import java.util.Scanner;import java.util.Stack;public class RPN { public static void main(String[] args) { // 实现一个中断表达式转换成后缀表达式 // 阐明 // 1. 1+((2+3)*4)-5 => 1 2 3 + 4 * + 5 - // 2.因为间接对str进行操作,不不便,因而先将“1+((2+3)*4)-5” =>转成中断表达式 // 即“1+((2+3)*4)-5” => ArrayList[1,+,(,(,2,+,3,),*,4,),-,5] // 3. 将失去的中断表达式对应的list转成后缀表达式对应的list // 即 ArrayList[1,+,(,(,2,+,3,),*,4,),-,5] => ArrayList[1, 2 ,3, +, 4, *, +, 5, -] Scanner in = new Scanner(System.in); String expression2 = in.next(); List<String> infixExpressionList = toInfixExpressionList(expression2); System.out.println("中断表达式对应List" + infixExpressionList); List<String> parseSuffixExpressionList = parseSuffixExpressionList(infixExpressionList); System.out.println("后缀表达式对应的list" + parseSuffixExpressionList); System.out.println(expression2 + "后果是" + calculate(parseSuffixExpressionList)); } // 办法: 将失去的中断表达式对应的list 转换成 后缀表达式对应的list public static List<String> parseSuffixExpressionList(List<String> ls) { // 定义两个栈 Stack<String> s1 = new Stack<String>(); // 符号栈 List<String> s2 = new ArrayList<String>(); // 存储两头后果的栈,因为该栈始终没有弹出过,所以应用List存储 // 遍历ls for (String item : ls) { //如果是一个数就入栈,入栈s2,\\d+ 匹配数字且至多呈现一次 if (item.matches("\\d+")) { s2.add(item); } else if (item.equals("(")) { // 如果是左括号就入栈,入栈s1 s1.push(item); } else if (item.equals(")")) { // 如果是右括号,则顺次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止 while (!s1.peek().equals("(")) { s2.add(s1.pop()); } s1.pop(); // 将 ( 弹出s1栈,打消括号,小括号 } else { // 当 item 的优先级,小于或者等于栈顶运算符的优先级的时候,就应该将s1栈顶的运算夫弹出并压入s2中 while (s1.size() != 0 && Operation.getValue(s1.peek()) >= Operation.getValue(item)) { s2.add(s1.pop()); } // 还须要将item压入栈 s1.push(item); } } // 将s1中残余的元素压入s2 while (s1.size() != 0) { s2.add(s1.pop()); } return s2; // 因为是寄存到List,因而按顺组输入就是对应的逆波兰表达式的List } // 办法:将中断表达式转成对应的list public static List<String> toInfixExpressionList(String s) { // 定义一个List,寄存中断表达式 对应的内容 List<String> ls = new ArrayList<>(); int i = 0; // 这个相当于一个指针,用于遍历中断表达式字符串s String str = ""; // 用于对多位数的拼接工作 char c; // 每遍历到一个字符就放到c do { // 如果c事一个非数字,咱们就须要退出到ls中去 if ((c = s.charAt(i)) < '0' || (c = s.charAt(i)) > '9') { ls.add("" + c); i++; // 须要后移 } else { // 如果是数字,须要思考多位数的问题 str = ""; // 先将 str 置成空串 while (i < s.length() && ((c = s.charAt(i)) >= '0' && (c = s.charAt(i)) <= '9')) { str += c; // 拼接 i++; } ls.add(str); } } while (i < s.length()); return ls; } // 将一个逆波兰表达式,顺次将数据和运算符 放入ArrayList public static List<String> getListString(String expression) { // 将 expression 宰割 String[] split = expression.split(" "); List<String> list = new ArrayList<String>(); for (String ele : split) { list.add(ele); } return list; } // 实现对逆波兰表达式的运算 /* 1. 从左至右扫描,将 3 和 4 压入堆栈 2. 遇到 + 运算符,因而弹出 4 和 3 (4为栈顶元素,3 为次顶元素),计算出 3 + 4 的值,得 7, 再将 7 入栈 3. 将 5 入栈 4. 接下来是 X 运算符,因而弹出 5 和 7,计算出 7 X 5 = 35, 将 35 入栈 5. 将 6 入栈 6. 最初是 - 运算符,计算出 35 - 6(减法运算或者除法运算的时候,后缀表达式是 次顶元素 减去或除以 堆顶元素) 的值,即 29 ,由此得出最终后果 */ public static int calculate(List<String> ls) { // 创立一个栈,只须要一个栈即可 Stack<String> stack = new Stack<>(); // 遍历 ls for (String item : ls) { // 这里应用一个正则表达式取出数 if (item.matches("\\d+")) { // 匹配的是多位数 stack.push(item); } else { // pop 出两个数并运算,在入栈 int num2 = Integer.parseInt(stack.pop()); int num1 = Integer.parseInt(stack.pop()); int res = 0; if (item.equals("+")) { res = num1 + num2; } else if (item.equals("-")) { res = num1 - num2; } else if (item.equals("*")) { res = num1 * num2; } else if (item.equals("/")) { res = num1 / num2; } else { throw new RuntimeException("符号有问题"); } // 把res入栈,入栈的时候要将res转换成字符,因为咱们的栈是字符串类型的 stack.push(res + ""); } } // 最初留在stack的数据是运算后果 return Integer.parseInt(stack.pop()); }}// 编写一个类Operation 能够返回一个运算符 对应的优先级class Operation { private static int ADD = 1; private static int SUB = 1; private static int MUL = 2; private static int DIV = 3; // 写一个办法,返回对应的 public static int getValue(String operation) { int result = 0; switch (operation) { case "+": result = ADD; break; case "-": result = SUB; break; case "*": result = MUL; break; case "/": result = DIV; break; } return result; }}

March 6, 2022 · 3 min · jiezi

关于算法:修订版Leetcode-300-最长递增子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不扭转其余元素的程序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1: 输出:nums = [10,9,2,5,3,7,101,18]输入:4解释:最长递增子序列是 [2,3,7,101],因而长度为 4 。示例 2: 输出:nums = [0,1,0,3,2,3]输入:4示例 3: 输出:nums = [7,7,7,7,7,7,7]输入:1解题思路惯例办法是应用动静布局,工夫复杂度 O(n^2)。 class Solution { public int lengthOfLIS(int[] nums) { // 定义 dp 数组 // dp[i] 示意以 nums[i] 这个数结尾的最长递增子序列长度 int[] dp = new int[nums.length]; // 初始值填充 1(子序列至多蕴含以后元素本人) Arrays.fill(dp, 1); for (int i = 0; i < nums.length; i++) { for (int j = 0; j < i; j++) { // 假如 dp[0...i-1] 都已知,需要求出 dp[i] // 只须要遍历 nums[0...i-1],找到结尾比 nums[i] 小的子序列 dp[j] // 而后把 nums[i] 接到最初,就能够造成一个新的递增子序列,长度为 dp[j] + 1 // 显然,可能造成很多种新的子序列,只须要抉择最长的,作为 dp[i] 的值即可 if (nums[i] > nums[j]) { dp[i] = Math.max(dp[i], dp[j] + 1); } } } // 遍历 dp 数组,找出最大值 int res = 0; for (int i = 0; i < dp.length; i++) { res = Math.max(res, dp[i]); } return res; }}这边采纳 Vue 中 DOM diff 的思路,即贪婪法,须要留神的是,最初 stack 的长度是对的,然而内容可能不是正确的。因为采纳了两层循环遍历,工夫复杂度为 O(n^2) 。 ...

March 6, 2022 · 2 min · jiezi

关于算法:修订版Leetcode-88-合并两个有序数组

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 初始化 nums1 和 nums2 的元素数量别离为 m 和 n 。你能够假如 nums1 的空间大小等于 m + n,这样它就有足够的空间保留来自 nums2 的元素。 示例1: 输出:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输入:[1,2,2,3,5,6]示例2: 输出:nums1 = [0], m = 0, nums2 = [1], n = 1输入:[1]示例3: 输出:nums1 = [5, 6, 7, 8, 0, 0, 0], m = 4, nums2 = [2, 3, 3], n = 3输入:[2, 3, 3, 5, 6, 7, 8]解题思路这道题显著是从 nums1 数组最初,依照倒序的形式进行合并。应用双指针法合并两个有序数组,比拟两个元素大小,将较大的元素从前面合入。当其中一个数组全副合并之后,只需把另一个数组残余元素合并过去即可。 ...

March 6, 2022 · 1 min · jiezi

关于算法:CPT109

CPT109 C Programming and Software Engineering 1 – ASSESSMENT 2Assessment Number 2Contribution to Overall Marks 50%Issue Date 02/11/2020Submission Deadline 14/12/2020 at 0600 (6am)Assessment OverviewThis assessment aims to test your ability to design a modular program which makes use offiles and structures. Application of the software development process (SDP) is also underassessment; the five main steps of the software development process are: Problem statement: formulate the problem.Analysis: determine the inputs, outputs, variables, etcDesign: define the list of steps (the algorithm) needed to solve the problem.Implementation: the C code has to be submitted as a separate file. Just indicate here thename of the file.Testing: explain how you have tested and verified your C program.EXERCISEAn entertainment company would like you to develop a version of the popular memory game“Find the Pairs”. In this game, a player is shown a grid of randomised pairs of symbols tomemorise in a short time. The player then selects pairs of objects to uncover, which remainuncovered if they match. The aim is to turn over all pairs in the smallest number of attemptspossible. The program will allow the user to create an account so that their game history canbe recorded and viewed each time they login.Program RequirementsYour program should provide users with the ability to create an account. An accountshould be a structure type variable containing at least: a username, a password anddetails of their game playing history.All of the accounts should be stored in a data file and accessed by the program.Once a user is logged on to the game they should be able to:(i) Start a new game(ii) Review their game history(iii) Clear their game historyLogoutNormally, the use of global variables is not allowed. Any use of global variables mustbe fully justified in your report.The randomised pair grid must be a minimum size of 4 x 4 (i.e. 8 pairs).The grid should initially be displayed to the player for a short time.The player should be able to select pairs of objects to uncover. These remainuncovered if they match and are re-covered if they do not match after a short delay.The total number of guesses it takes to uncover all pairs should be recorded.The game should allow the player to exit to the main menu at any time.IdeasNote: the following are only to provide you with ideas of how to implement the requiredfunctionality. They do not represent the “best” or only ways to implement the functions.All player accounts are structure variables and will be stored in a file. The login process canbe achieved using a single structure variable, into which each account can be read from thefile one by one, each time checking the username until you find the correct players account.The gaming operations can then be performed using that single structure variable. When theplayer logs out only this one structure needs to be written back to the file for saving in thecorrect position.Alternatively, you can create an array of structures in the program and read the whole fileinto the array, then search the array for the correct users’ structure. The game can be playedusing the correct element in the array of structures. When the player finishes, the whole arraycan be written to the file.The randomised grid of symbols can be created using a 2D array.Try to create your own functions to simplify the programming task.Consider how your program should function when there is an invalid input.To make your program more interesting for the user think about the playability. Use yourown experience of playing games, for example you might allow different difficulty settingsrelated to the size of the grid which could be changeable, you may record the time it takes tocomplete the grid, some statistical data about their game history may be of interest.What should be submitted?1) A short report (up to a few pages of text plus C source codes) detailing for each question:a) SDP steps 1 to 3 in the report (Problem statement(10%) + Analysis(10%) +Algorithm Design(10%) + Report Quality(10%)) (40%)b) SDP step 4 (Implementation + Robustness): C source code including comments.(40%). Do not paste the code into your report just submit the .c source code file andwrite the file name in your report under the implementation section. This MUSTcompile and run in Visual Studio 2013.c) SDP step 5 (testing): explain your testing methodology including: what you wantedto test, how you have tested it and the outcome of your tests. (15%). Note: you donot need to include screenshots of all testing results. You can include some to showcorrect operation and or failures, avoid including pages and pages of screenshots forevery test you perform.Please refer to the file “CPT109 Marking Guidelines Assignment 2” for thedetailed marking scheme.2) The report in Microsoft Word or pdf format and C source code of your implementationshould be zipped into a single file, i.e. the zip file will contain 2 files, one document andone source code.The naming of Report (.docx or .pdf), Source Code (.c) and Compressed file (.zip or .rar)• StudentID_LastName_FirstName_AssignmentNumber.docx or .pdf• StudentID_ AssignmentNumber.c• StudentID_LastName_FirstName_AssignmentNumber.zip or .rarFor example• 123456789_Einstein_Albert_2.docx• 123456789_2.cZipped together into:• 123456789_Einstein_Albert_2.zipHow the work should be submitted?Should be submitted electronically through the Learning Mall so that the marker can run yourprograms during marking. Feedback and your grade will also be given through the LearningMall.Remember that you are responsible for ensuring that your C code will run in Visual Studioand to C90 standard and that if it does not without documentary explanation you mayget a 0 mark for your implementation.

March 6, 2022 · 5 min · jiezi

关于算法:EEE125-分析

EEE125 - C programming program writing assignment 20/21 1 (© University of Sheffield '98-'20) EEE125 Programming in ‘C’ Course: program writing assignmentAt the first lecture, you were introduced to the make-up of this course and explained that the course would beassessed by means of a Multiple Choice Question Blackboard test (worth 33.3% of the available marks) andthis C assignment task (also worth 33.3%). In semester 2, you will have a final test which covers bothMatlab and more advanced C programming writing exercises (this covers the remaining 33.4% of the marks).For this assessed assignment you are asked to write a program in ‘C’ to carry out the particular taskdetailed here.1 Administrative detailsYour program must be handed in via Blackboard. The hand-in date for this exercise is 4.59pm on Tuesday15th December. You can hand your work in anytime between the beginning of week 10 and the deadlinedate. You are very strongly urged to not leave your submission to the latest possible moment to avoidcomputer related submission errors.• Late submission will result in a deduction of 5% of the total mark awarded for each working day after thesubmission date, this is Faculty policy. (Working days – Monday to Friday - include working days withinstandard vacation times). The only exceptions to this will usually be where illness or other serious extenuatingcircumstances have meant missing the hand-in date (medical evidence will often be needed to sustain thisexception). In such circumstances you MUST submit an Extenuating Circumstances form (not a selfcertificationform), available from www.sheffield.ac.uk/ssid/forms/circs, (before completing such a formmake sure you read the explanatory notes here first: http://www.sheffield.ac.uk/ss...) handthe form in to the department Student Support Office (Suite 27, level 1, 3 Solly Street building) or emaildirectly to Matthew Hobbs.• If you believe you have good reason to ask for an extension to this hand-in date, you may discuss thecircumstances with Matthew Hobbs and, at his discretion, a later hand-in date may be negotiated. (But pleasedo the discussing well in advance of the original hand-in date expiring). Please note: being disorganised orlazy and so failing to meet the hand-in date by simply leaving tackling the exercise until it's too late is nota “good reason” and will not normally result in an extension of the hand-in date!__2 What your program should doElsewhere in your studies you may have heard of the “Least Squares” method often used to generate a “best fit” straightline through a set of data plotted on a graph (where a straight line relationship is expected to exist). The "Least Squares"method is very useful when working with data derived from experiments and indeed it may well be a technique of use toyou elsewhere in course work.The aim of this assessed exercise is: for you to write a program in 'C' that uses the least squares technique to allow a userto input a set of data value and to compute and output as results the gradient (m) and offset (c) of the “best fit” straightline through that entered set of data. You do not need to understand the underlying mathematics (though it would help)instead all you need to do is correctly implement the formulae given in this assignment sheet.2.1 The "Least Squares" formulae neededConsider you have a set of data comprising pairs of measurements of two related variables: ‘x’ & ‘y’. You believethe relationship between these variables can be expressed as a straight line, using the standard straight lineequation (where y is the dependent variable and x is the independent variable, m is the gradient of the line - thatis the rate of change of y with respect to x - and c is the intercept (or ‘offset’) of the line with the y axis – that isthe value of y when x is zero). Here is the standard straight line equation:y = m. x + c EEE125 - C programming program writing assignment 20/21 2 (© University of Sheffield '98-'20)Look at the example graph shown below. Pairs of x, y data have been plotted (the little ‘+’ marks) and a best fitstraight line drawn through them (the dotted line). The gradient of the “best fit” straight line is ‘m’ and theintercept (offset) of that line with the y axis from the origin of the graph is ‘c’.From theory we can obtain the equations needed todraw a best fit straight line through such a set of datausing “Least Squares” as our technique.Consider we have a set of data samples where values of‘y’ have been measured for a range of different valuesof ‘x’. Consider we have taken ‘N’ samples (i.e. pairsof x and y data of the form: [x1 y1] [x2 y2] [x3 y3] … [xNyN]). Then using this notation we can write thefollowing equations:The least squares equation for the gradient of the ‘best fit’ line ‘m’ is:The least squares equation for the offset of the ‘best fit’ line ‘c’ is:When interpreting these formulae you might like to be reminded that:Although these formulae may initially look daunting, note that they contain some common terms, appears in the formulas above. By identifying such common terms you can perhapssave effort by calculating them only once and use the results when those terms appear in later equations or writingone function to do this and use it each time it’s needed.EEE125 - C programming program writing assignment 20/21 3 (© University of Sheffield '98-'20)2.2 How the program should appear to the user – the Requirements.Reminder, the aim of this assessed exercise is for you to write a program that will allow the user to enter a setof data (in the form of x, y pairs) and then uses the least squares technique to calculate and display the gradient(m) and offset (c) of the “best fit” straight line through that set of data.a) The program should begin by briefly announcing its purpose to the user.b) Next it should ask the user how many pairs of data values (sets of x and y) they intend to input, onlypermitting the user to choose numbers of pairs in the range from 4 to 20 pairs (that is the user should bepermitted to enter no fewer than 4 pairs and no more than 20 pairs).c) Make sure your program displays clear instructions to the user at each stage so that the user knows exactlywhat the program wants them to do.d) The program should then ask the user to input the specified number of data value pairs, storing them in suitablevariable(s). Your program should be able to accept values for x and y entered as real numbers. Your programshould accept only positive numbers that are in the range between l000000.0 and 0.000005.e) Next the program should neatly display all the data pairs entered in a tidy way on the screen.f) The program should use the least squares formulae described section 2.1 above to process the set of dataentered and so calculate the values for ‘m’ and ‘c’ for the ‘best fit’ straight line through that set of data.g) The program should then neatly display the values of ‘m’ and ‘c’ that it has calculated.h) The program should then ask the user if they would like to repeat the program, interpret their reply, and, iftheir answer is yes then the program should repeat again all steps from step b) onwards.Please note:• When designing you program: be careful to ensure that it makes efficient use of variable space by choosingsuitable types for your variables that do not waste memory unnecessarily. Don’t just assume this programwill be compiled to run on a PC with the Dev-C compiler, make sure you use the smallest ‘C’ type variablesnecessary according to the minimum sizes given for the standard C types in the lectures. Also makeappropriate use of the various flow-control statements 'C' has to offer to build loops where they would behelpful.• You should divide your program up into separate functions. Programs that consist of everything inside thesingle function main only will earn far fewer marks than programs that are divided into more than onefunction.2.3 A sample data set to use for testingHere is some sample data upon which you might like to test your program:First a simple set (you could try plotting it as a graph and estimating m and c by hand):The results are: Gradient of best fit straight line m = 1.025 approx. with and a y intercept at c = 1.911 approx. EEE125 - C programming program writing assignment 20/21 4 (© University of Sheffield '98-'20)Now a more complex set:The results are: Gradient of best fit straight line m = 0.0634 and a y intercept c at -2.907.2.4 Some helpful hints• Your program must be written in ‘C’ and not ‘C++’. (‘C’ is taught in EEE125, not C++, so sticking totechniques you have been taught will mean you will be OK). Make sure you save your file with a ‘.c’filename extension NOT ‘.cpp’. When using Dev-C, make sure when saving your file that the “SaveFile” dialogue has the “Save as type” drop-down menu set for “C source files (*.c)”.• By the time this sheet is handed out you will have already covered, in lectures and lab sheets, all thematerial necessary to allow you to write a suitable program. However, future lectures and backgroundreading of your own may be of additional help.• Make your program code as easy to "read" (by a human) as possible. For example partition it (in other wordsbreak it up) by making your own functions. (Programs that consist of everything inside the single functionmain only will earn fewer marks than programs that are divided into more than one function). (See examplesolution to Lab 6 question 4 file TUT6Q4-4.c in the EEE125 MOLE course, in the ‘Lab Classes’ section, inthe ‘Lab Class Downloads’ folder and finally in the ‘Lab Sheet 6 – Downloads’ showing use of functions).Use well-chosen identifiers for function names and variable names so that the purpose of a particularfunction or variable is hinted by its name. This example solution will be made available during week 8 ofthe semester.• Make sure the program is well commented (i.e. using / / marks) so that the purpose of each part is clear.These comments should be concise. Note: there is no need to use comments to explain how a particular ‘C’construct works, you can assume the reader understands the ‘C’ language itself (e.g. you don’t need to explainhow a ‘for’ loop works as such). However you should add comments to explain what your program aims toachieve with particular ‘C’ constructs where it isn't immediately obvious (e.g. explain what useful task aparticular ‘for’ loop is performing for you in your particular program). This is an important skill needed byprogrammers to ensure their program code is ‘readable’ and ‘understandable’ by others who may have causeto examine it or modify it later. You have been given clear guidance in the lectures about how to lay out aprogram and how to add comments – check your lecture slides to see what was said.• Don't forget: planning your program thoroughly on paper first is by far the most effective way of quicklywriting a good program. Don't rush to coding at the PC too soon. Start by breaking the task down intomanageable portions, then plan the sequence of events for each portion with flow-charts and pseudo code etc.Flow-charts in particular will help you identify the appropriate flow control statements ('while', 'do..while','for', 'if' etc.) to choose.• Test the output from your program by using various sets of data. You can generate your own test data quiteeasily. Use a calculator or a spreadsheet to help verify your results. Don't forget to check your program'sbehaviour with illegal data (i.e. data outside the range allowed for input), does it behave appropriately?EEE125 - C programming program writing assignment 20/21 5 (© University of Sheffield '98-'20)• Don't forget, “divide and conquer” is a wise approach. Break the task down into manageable portions andtackle them one at a time, don't try and code up the whole program in one go only to find it doesn't work. Thetask of finding a fault (or more likely many faults) in a large program is like "looking for a needle in a haystack" ...

March 6, 2022 · 17 min · jiezi

关于算法:Leetcode-704-二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜寻 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输出: nums = [-1,0,3,5,9,12], target = 9输入: 4解释: 9 呈现在 nums 中并且下标为 4示例 2: 输出: nums = [-1,0,3,5,9,12], target = 2输入: -1解释: 2 不存在 nums 中因而返回 -1解题思路二分查找根本框架如下: int binarySolution(int[] nums, int target) { int left = 0, right = ...; while (...) { int mid = left + (right - left) / 2; if (nums[mid] == target) { ... } else if (nums[mid] < target) { left = ...; } else if (nums[mid] > target) { right = ...; } } return ...;}剖析二分查找的一个技巧是:不要呈现 else,而是把所有状况用 else if 写分明,这样能够分明地展示所有细节。 ...

March 6, 2022 · 3 min · jiezi

关于算法:制作UP9616全协议快充-支持高通QC20-QC30-华为FCP

为了把想法变成事实,先到力智的网站上找到了芯片的规格书,一番钻研当前再联合事实须要,确立了整个快充的设计思路: 当初个别家庭都有好几部手机,为了解决泛滥手机的充电问题,所以设计成两路独立的快充以满足多手机充电的须要;所有设计都以谋求极致的低发热 高效率 高稳定性 宽输出电压为目标;欠缺的过流过压爱护基于以上几点设计了原理图 接下来开始选则物料 能过10A电流的输出插座,集体偏好5.5/2.5的插座,有更大的接触面积,能保障插头与插座良好接触 自复原保险丝,呈现过流时及时爱护后续线路免受损坏 红宝石电容,给后级提供更污浊的电能 明天的配角UP9616芯片,反对高通 华为 等泛滥快充协定 多年的电源设计教训通知我这颗电感是十分十分重要的,效率 发热 稳定性都指望着它。本能够抉择低成本的铁硅铝磁环,但思考到要获取良好性能,最终选用了高性能的一体成型电感1770,饱和电路达到恐怖的14A,内阻只有20.5毫欧,在整个零碎中老本占到最高 Freewing RC jet SMBJ13A过压爱护,霎时能量排汇可达600W,在线路呈现过压时能及时爱护整个零碎免遭灭顶之灾 2512大体积的合金电阻,具备高精度 高功率 高温票个性,是现实的电流查看器件 高频低阻长寿命滤波电容保障了极低的输入纹波 5A电流的高功率USB母座让电能畅通无阻的流进手机,使手机能在最短时间内实现能量补充 通过漫长的期待,打样的PCB板终于到手了,1.6的厚度,50*80的FR4玻纤板是整个快充线路的基石,线路板的长宽比例满足黄金分割,整个线路板闪耀着翠绿色的迷人光辉 物料清单UP9616全协定快充BOM 除PCB外其它元器件的洽购 arrows RC jet 尽管旁边就是全亚洲最大的电子城,但因为好多器件都不是罕用料,在电子城转了半天只找到DC插座跟USB母座,卖DC插座跟USB母座的老板都还好谈话,收费拿到一个DC座和4个USB座,电容翻箱倒柜找到几个,合金电阻找公司的供应商收费申请了点样品,其余器件就只能淘宝了,快递费花了好几十。 资料终于备齐,开始焊接 由矮到高由小到大的顺续一一焊好 本人用的就不洗板了,洗板水岂但污染环境还对线路板自身有侵蚀 通电 通电前再查看一遍焊接是否有误,把可调电源调到12V,电流限度到500mA,怀着局促不安的情绪颤颤巍巍的接通了电源,还好,一切正常 整个线路非常简单,无需调试,焊接无误都能失常工作。当初插上联想电源看看,输入5.237V,带线补性能 接上手机两个口充电都失常工作 PCBA Factory没有反对快冲的手机,也没有快充协定诱骗器,快充就没法测试了。这个快充协定是固化到芯片外面的,输入失常后是肯定能够快充的。抽时间淘个快充协定诱骗器后再来上图,这个快充就先带回家用着先。 整个制作到此结束,欢送打赏!!! 最初说说应用体验1.这颗芯片利用简略,很容易制作胜利;2.反对的快充协定全面,简直涵盖了所有支流协定;3.整个线路要想取得高效低热电感是重点,肯定要饱和电流足够大;4.线路板设计上肯定要遵循开关电源一些设计要求;5.有了大电感及好的线路板设计,整个零碎发热较低。 ‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’我是分割线‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘ 明天早晨带回家来用12V的适配器同时充一部三星的平板和一部魅族的手机,芯片和电感简直没啥温升,当初的设计指标根本达到。

March 5, 2022 · 1 min · jiezi

关于算法:ECS7002P-人工智能

Assignment 2ECS7002P - Artificial Intelligence in GamesNovember 9, 2020In this assignment, you will implement a variety of reinforcement learning algorithms to find policies for thefrozen lake environment. Please read this entire document before you start working on the assignment.1 EnvironmentThe frozen lake environment has two main variants: the small frozen lake (Fig. 1) and the big frozen lake (Fig.2). In both cases, each tile in a square grid corresponds to a state. There is also an additional absorbing state,which will be introduced soon. There are four types of tiles: start (grey), frozen lake (light blue), hole (darkblue), and goal (white). The agent has four actions, which correspond to moving one tile up, left, down, orright. However, with probability 0.1, the environment ignores the desired direction and the agent slips (movesone tile in a random direction). An action that would cause the agent to move outside the grid leaves the stateunchanged.Figure 1: Small frozen lakeFigure 2: Big frozen lakeThe agent receives reward 1 upon taking an action at the goal. In every other case, the agent receives zeroreward. Note that the agent does not receive a reward upon moving into the goal (nor a negative reward uponmoving into a hole). Upon taking an action at the goal or in a hole, the agent moves into the absorbing state.Every action taken at the absorbing state leads to the absorbing state, which also does not provide rewards.Assume a discount factor of = 0.9.1For the purposes of model-free reinforcement learning (or interactive testing), the agent is able to interactwith the frozen lake for a number of time steps that is equal to the number of tiles.Your first task is to implement the frozen lake environment. Using either Python or Java, try to mimic thePython interface presented in Listing 1.Listing 1: Frozen lake environment.The class EnvironmentModel represents a model of an environment. The constructor of this class receivesa number of states, a number of actions, and a seed that controls the pseudorandom number generator. Itssubclasses must implement two methods: p and r. The method p returns the probability of transitioning fromstate to next state given action. The method r returns the expected reward in having transitioned from state tonext state given action. The method draw receives a pair of state and action and returns a state drawn accordingto p together with the corresponding expected reward. Note that states and actions are represented by integersstarting at zero. We highly recommend that you follow the same convention, since this will facilitate immenselythe implementation of reinforcement learning algorithms. You can use a Python dictionary (or equivalent datastructure) to map (from and to) integers to a more convenient representation when necessary. Note that, ingeneral, agents may receive rewards drawn probabilistically by an environment, which is not supported in thissimplified implementation.The class Environment represents an interactive environment and inherits from EnvironmentModel. Theconstructor of this class receives a number of states, a number of actions, a maximum number of steps forinteraction, a probability distribution over initial states, and a seed that controls the pseudorandom numbergenerator. Its subclasses must implement two methods: p and r, which were already explained above. Thisclass has two new methods: reset and step. The method reset restarts the interaction between the agent andthe environment by setting the number of time steps to zero and drawing a state according to the probabilitydistribution over initial states. This state is stored by the class. The method step receives an action and returnsa next state drawn according to p, the corresponding expected reward, and a flag variable. The new state isstored by the class. This method also keeps track of how many steps have been taken. Once the number of stepsmatches or exceeds the pre-defined maximum number of steps, the flag variable indicates that the interactionshould end.The class FrozenLake represents the frozen lake environment. Your task is to implement the methods p andr for this class. The constructor of this class receives a matrix that represents a lake, a probability that theagent will slip at any given time step, a maximum number of steps for interaction, and a seed that controlsthe pseudorandom number generator. This class overrides the method step to indicate that the interactionshould also end when the absorbing state is reached. The method render is capable of rendering the state ofthe environment or a pair of policy and value function.The function play can be used to test your implementation of the environment before you try the next tasks.42 Tabular model-based reinforcement learningYour next task is to implement policy evaluation, policy improvement, policy iteration, and value iteration.You may follow the interface suggested in Listing 2.Listing 2: Tabular model-based algorithms.The function policy evaluation receives an environment model, a deterministic policy, a discount factor, atolerance parameter, and a maximum number of iterations. A deterministic policy may be represented by anarray that contains the action prescribed for each state.The function policy improvement receives an environment model, the value function for a policy to beimproved, and a discount factor.The function policy iteration receives an environment model, a discount factor, a tolerance parameter, amaximum number of iterations, and (optionally) the initial policy.The function value iteration receives an environment model, a discount factor, a tolerance parameter, amaximum number of iterations, and (optionally) the initial value function.3 Tabular model-free reinforcement learningYour next task is to implement Sarsa control and Q-learning control. You may follow the interface suggested inListing 3. We recommend that you use the small frozen lake to test your implementation, since these algorithmsmay need many episodes to find an optimal policy for the big frozen lake.Listing 3: Tabular model-free algorithms.The function sarsa receives an environment, a maximum number of episodes, an initial learning rate, adiscount factor, an initial exploration factor, and an (optional) seed that controls the pseudorandom numbergenerator. Note that the learning rate and exploration factor decrease linearly as the number of episodesincreases (for instance, eta[i] contains the learning rate for episode i).The function q learning receives an environment, a maximum number of episodes, an initial learning rate,a discount factor, an initial exploration factor, and an (optional) seed that controls the pseudorandom numbergenerator. Note that the learning rate and exploration factor decrease linearly as the number of episodesincreases (for instance, eta[i] contains the learning rate for episode i).Important: The -greedy policy based on Q should break ties randomly between actions that maximize Qfor a given state. This plays a large role in encouraging exploration.4 Non-tabular model-free reinforcement learningIn this task, you will treat the frozen lake environment as if it required linear action-value function approximation.Your task is to implement Sarsa control and Q-learning control using linear function approximation.In the process, you will learn that tabular model-free reinforcement learning is a special case of non-tabularmodel-free reinforcement learning. You may follow the interface suggested in Listing 4.Listing 4: Non-tabular model-free algorithms.The class LinearWrapper implements a wrapper that behaves similarly to an environment that is given toits constructor. However, the methods reset and step return a feature matrix when they would typically returna state s. Each row a of this feature matrix contains the feature vector (s, a) that represents the pair of actionand state (s, a). The method encode state is responsible for representing a state by such a feature matrix.More concretely, each possible pair of state and action is represented by a different vector where all elementsexcept one are zero. Therefore, the feature matrix has |S||A| columns. The method decode policy receives aparameter vector obtained by a non-tabular reinforcement learning algorithm and returns the correspondinggreedy policy together with its value function estimate.The function linear sarsa receives an environment (wrapped by LinearWrapper ), a maximum number ofepisodes, an initial learning rate, a discount factor, an initial exploration factor, and an (optional) seed thatcontrols the pseudorandom number generator. Note that the learning rate and exploration factor decay linearlyas the number of episodes grows (for instance, eta[i] contains the learning rate for episode i).The function linear q learning receives an environment (wrapped by LinearWrapper ), a maximum numberof episodes, an initial learning rate, a discount factor, an initial exploration factor, and an (optional) seed thatcontrols the pseudorandom number generator. Note that the learning rate and exploration factor decay linearlyas the number of episodes grows (for instance, eta[i] contains the learning rate for episode i).The Q-learning control algorithm for linear function approximation is presented in Algorithm 1. Note thatthis algorithm uses a slightly different convention for naming variables and omits some details for the sake ofsimplicity (such as learning rate/exploration factor decay).Algorithm 1 Q-learning control algorithm for linear function approximationInput: feature vector (s, a) for all state-action pairs (s, a), number of episodes N, learning rate , probabilityof choosing random action , Important: The -greedy policy based on Q should break ties randomly between actions that maximize Q(Algorithm 1, Line 9). This plays a large role in encouraging exploration.5 Main functionYour final implementation task is to write a program that uses all the algorithms that you have implemented forthis assignment. Your main function should behave analogously to the function presented in Listing 5. Usingthe small frozen lake as a benchmark, find and render an optimal policy using policy iteration, value iteration,Sarsa control, Q-learning control, linear Sarsa control, and linear Q-learning. For grading purposes, if yourmain function does not call one of these algorithms, we will assume that it is not implemented correctly.Listing 5: Main function.6 Submission instructionsThis assignment corresponds to 40% of the final grade for this module. You will work in groups of 3 students. Thedeadline for submitting this assignment is December 11th, 2020. Penalties for late submissions will be appliedin accordance with the School policy. The submission cut-off date is 7 days after the deadline. Submissionsshould be made through QM+. Submissions by e-mail will be ignored. Please always check whether the fileswere uploaded correctly to QM+. Cases of extenuating circumstances have to go through the proper procedurein accordance with the School policy. Only cases approved by the School in due time will be considered.You will find the group selection page in QM+. You must be part of a group in QM+ before submittingyour assignment. Plagiarism leads to irreversible non-negotiable failure in the module. If you are unsure aboutwhat constitutes plagiarism, please ask.This assignment requires a group submission and an individual submission, which are detailed in the nextsections.6.1 Group submissionThe group submission must be a single zip file. This file must contain a single folder named group[group id].This folder must contain a report and a folder named code.The code folder must contain a file named README.txt, which explains how to run your main function (seeSection 5). Based solely on the correctness and clarity of your code, you will receive the following number ofpoints for accomplishing each of the following tasks: ...

March 5, 2022 · 10 min · jiezi

关于算法:COMP-4107神经网络

COMP 4107: Neural Networks Winter 2021Page 1 of 2Assignment 4This assignment may be completed individually or in groups of 2 or 3.You are recommended to use your project groups. If you are in a group, one student willsubmit all necessary files and the other student(s) will submit a text file specifying members ofthe group and who is submitting. The report must have all students’ names and IDs.In this assignment, you will develop implementations for self-organizing maps and Hopfieldneural networks for the handwritten digit recognition problem.DescriptionYou may use any and all functionalities found in scikit-learn and tensorflow. You may find Kmeanson MNIST useful too.NoteIn any K-fold experimentation performed ensure that you document mean and standarddeviation of performance measures obtained (e.g., accuracy).Question 1[30 marks]Using the scikit-learn utilities to load the MNIST data, implement a Hopfield network that canclassify the image data for a subset of the handwritten digits. Subsample the data to onlyinclude images of '1' and '5'. Here, correct classification means that if we present an image of a'1' an image of a '1' will be recovered; however, it may not be the original image owing to thedegenerate property of this type of network. You are expected to document classificationaccuracy as a function of the number of images used to train the network. Remember, aHopfield network can only store approximately 0.15N patterns with the "one shot" learningdescribed in Lecture 13.Question 2[30 marks]Develop a feed forward RBF neural network in python that classifies the complete set of imagesfound in the MNIST dataset. You are to train your neural network using backpropagation. Youshould use gaussian functions as your radial basis functions. You must show that you have: ...

March 5, 2022 · 3 min · jiezi

关于算法:UCONN-FNCE-5352

UCONN FNCE 5352Consumer Credit ProjectOverviewBanks play a crucial role in market economies. They decide who can get finance and on what terms andcan make or break investment decisions. For markets and society to function, individuals and companiesneed access to credit.Credit scoring algorithms, which make a guess at the probability of default, are the method banks use todetermine whether or not a loan should be granted. This assignment requires students to improve onthe state of the art in credit scoring, by predicting the probability that somebody will experiencefinancial distress in the next two years.The goal of this assignment is to build a model that borrowers can use to help make the best financialdecisions.FilesFiles have been posted tohttps://github.com/mattmcd71/...• DataDictionary.xls – Excel Spreadsheet with description of the data in the test and train files• ConsumerCred-train.csv – Training data set. This file includes the dependent variableSeriousDlqin2yrs, as well as the independent variables described in the data dictionary.• ConsumerCred-test.csv – This is the dataset that you’ll need to predict outcomes for. It does notinclude the dependent variable (SeriousDlqin2yrs).• SampleSubmission.csv – This file is a sample of the file that students will need to submit.GuidelinesStudents can form teams to work on building the model. Each team must submit one or more filesubmissions with the probability predictions on the test dataset. Submissions must be emailed toTianjiao Zhang. Submissions will be assessed on the AUC (Area under the curve) of the submittedpredictions. ...

March 5, 2022 · 2 min · jiezi

关于算法:记录一下自己学习递归的过程未完

递归关注于把大问题合成为小问题,不要纠结于具体过程,齐全能够把递归函数看作一个魔法函数,而本人的惟一工作是简化原始问题,就假如递归办法曾经是实现的,要思考的是如何应用这个曾经存在的递归办法; 例题Leetcode206题 给你单链表的头节点 `head` ,请你反转链表,并返回反转后的链表。该题除了应用如下的迭代办法解决: 迭代办法/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverseList(ListNode head) { ListNode pre=null; ListNode cur=head; while(cur!=null){ ListNode next=cur.next; cur.next=pre; pre=cur; cur=next; } return pre; } }还能够应用递归的形式实现,代码更加简洁: ...

March 4, 2022 · 1 min · jiezi

关于算法:EECS1720M

EECS1720M – W2021Assignments (Total Weight = 20% of final grade) … in two partsOverall Goal: To design an interactive GUI application in Java AWT/Swing that supportsand dynamically responds to asynchronous inputs & interactions provided by a user.The type of application you decide to make is quite open-ended, however, it should supporta minimum amount of features/functionality. The application could be to:• create a simple game/scene from a game (e.g. create an original game, orextend/modify a classic 2D arcade style game);• create a compositional tool (e.g. an interface that supports thegeneration/manipulation of a simple artwork – i.e. a paint tool/ editing tool or toolthat uses simple inputs to seed algorithmic art)• create a simulator (a tool in which a state can be configured and then used tosimulate some physical scenario – e.g. an educational tool)• create a front end for manipulating some set of data records (e.g. a databasestyle system, a booking/ordering system, a browser of some collection ofobjects/images) - that allows for configuration and storage of a record or multiplerecords, that can be formulated into some visual representation/report.The assignment is broken up into two parts (Assignment 1 & 2). Assignment 1 can bethought of as a progress stage toward Assignment 2, which has the complete interactivesystem.Assignment 1 [10%] à Graphical User Interface/ Concept DesignGoals: To design an integrated set of GUI layouts that will support the completedinteractive application. The GUI should allow for the state of your application tobe configured/set. It should also support basic ActionEvent handling (so that theGUI controls can set/report aspects of the state (i.e. set/write fields to console).Assignment 2 [10%] à Final application (mouse/key support + dynamic content)Goals: To integrate & expand the interaction in your application to include freemouse & key interactions (along with interactions on GUI controls), that drive thepresentation of some form of dynamic visual component. For e.g., an animated orcontrollable moving element(s), or dynamically loaded/displayed set(s) of visualelements within a canvas in your application.Project (ideas) – these are just examplesIDEA #1• Extend “frogger” example from earlier in the class (to make asimple java AWT/Swing program).§ Does not have to be a fully functioning game (just meetdeliverables in previous slide)§ Should have UI elements (could use buttons to move frog frombottom to top of screen)• Could be button(s) in the interface§ Could have static objects that if the frog collides with an obstacle,frog loses a life and returns to start• Losing a life could change state of frog (change graphic/colour)• UI could keep a count of how many times reached the top• UI could keep a count of how many lives left, or time, or position of frogon screen, etc§ Could also create your own simple game (with a simple end goal)that involves moving a character about the stage.Project (ideas) – these are just examplesIDEA #2• Create a basic “paint” program§ Does not have to be a fully functioning (just meet deliverablesin previous slide)§ Should have UI elements (could use buttons to generateshapes on the screen)• Could use a UI element to select a colour for the shape• Shapes could be randomly placed, when hitting button, or could beplaced with a mouse click in the stage window• Buttons/UI control could be used to select type of shape§ Could have a button to delete (undo) last shape createdNeed more Inspiration?Classic Arcade Games[2D is probably better – think older Atari style games - simple]https://www.classicgamesarcad...Puzzle Game Ideas/Inspirationhttps://www.pinterest.ca/artd...Other game ideas:http://inventwithpython.com/b...ideas-for-game-clones-to-code/Other:https://www.dreamincode.net/f...** survey some ideas of phone applications/games à try to make a simplified version ofsome application you use (it does not have to be fully functional, can be a component of)Project (ideas) – these are just examplesIDEA #3• Create a program to create records and add them to a list of somesort§ Does not have to be a fully functioning (just meet deliverables in previousslide)§ Should have UI elements (forms to collect/set properties of an elementyou wish to store in the list)• E.g. creating a record of a person/thing• Have a button to submit (add) the record to the list• Have a control to show a list of elements currently stored• Have a button to output a formatted set of strings to the console (showing allthe elements currently stored)• Use date picker (the element could be a booking of some sort) – e.g. thinkabout booking an air ticket• Use some graphical elements to dress things up a bit§ Could have a button to delete (undo) last element created or to delete aspecific element• E.g. select from a drop down menu ...

March 4, 2022 · 4 min · jiezi

关于算法:Guided-Anchoring在线稀疏anchor生成方案嵌入即提2AP-CVPR-2019

Guided Anchoring通过在线生成anchor的形式解决惯例手工预设anchor存在的问题,以及可能依据生成的anchor自适应特色,在嵌入方面提供了两种施行办法,是一个很残缺的解决方案 起源:晓飞的算法工程笔记 公众号论文: Region Proposal by Guided Anchoring 论文地址:https://arxiv.org/abs/1901.03278论文代码:https://github.com/open-mmlab/mmdetectionIntroduction Anchor是许多指标检测算法中一个很重要的机制,但也会带来两个问题: 须要事后设计适合的anchor尺寸和长宽比,如果设计不好,对速度和准确率造成很大影响为了使anchor达到足够的召回率,须要在特色图上铺设大量的anchor,不仅引入大量负样本,还消耗计算量 为此,论文提出Guided Anchoring来依据图片特色在线生成anchor。首先判断指标可能呈现的地位,而后学习不同地位上的指标的形态,可依据图片特色在线学习稠密的候选anchor。然而,在线生成的anchor形态各异,固定的感触域可能不匹配其形态,所以Guided Anchoring依据anchor的形态进行自适应特征提取,而后再进行预测框精调与分类。 Guided Anchoring Guided Anchoring尝试在线学习不同形态的anchor及其地位,失去在特色图上不均匀分布的anchor汇合。指标可用四元组$(x,y,w,h)$示意,其地位和形态可认为是遵从图像$I$的一种散布: 公式1蕴含两局部:1) 给定图片,指标仅存在于某些区域 2) 形态与地位严密相干。 基于公式1,论文设计了图1的anchor生成器(Anchor generation),蕴含地位预测和形态预测两个分支。给定图片$I$,首先失去特色图$F_I$,地位预测分支依据$F_I$预测该像素为指标地位的概率,形态预测分支则预测像素地位相干的形态,基于两个分支抉择概率高于阈值以及每个地位最合适的anchor,失去最终的anchor汇合。因为汇合中的anchor形态可能差别很大,每个地位须要获取不同大小区域的特色,论文提出特色自适应模块(Feature adaption),依据anchor形态自适应提取特色。 上述的生成过程是基于单个特色的,网络的整体架构蕴含FPN,所以为每层都装备Guided anchoring模块,模块参数是层间共享的。 Anchor Location Prediction 地位预测分支预测特色图$F_I$的概率图$p(\cdot|F_I)$,每项$p(i,j|F_I)$为该地位是指标核心的概率,对应的输出图片中坐标$((i+\frac{1}{2})s, (j+\frac{1}{2})s)$,$s$为特色图的stride。 在实现时,通过子网$\mathcal{N}_L$进行概率图预测,首先应用$1\times 1$卷积提取骨干网络特色图$F_I$的objectness分数,再通过element-wise sigmoid函数转化概率。更简单的子网能够带来更高的准确率,论文采纳的是准确率和速度最实惠的构造,最初取高于阈值$\epsilon_L$的像素地位,可能保障在高召回的前提下过滤90%的无关区域。 Anchor Shape Prediction 形态预测分支的指标是预测每个地位对应指标的最佳形态$(w,h)$,但因为过大的数值范畴,如果间接预测其具体数字会非常不稳固,所以先进行转化: 形态预测分支输入$dw$和$dh$,依据公式2转换出形态$(w,h)$,$s$为特色图的stride,$\sigma=8$为人工设置的缩放因子。这个非线性转换可将[0, 1000]映射到[-1, 1],更容易学习。在实现时,通过子网$\mathcal{N}_S$进行形态预测,首先应用$1\times 1$卷积取得两维特色图,别离对应$dw$和$dh$,而后通过公式2进行转换。因为每个地位的anchor都是学习来的,与预设的固定anchor比照,这种学习的anchor召回率更高。 Anchor-Guided Feature Adaptation 惯例的预设anchor办法因为各地位的anchor是一样的,能够对每个地位进行一样的特征提取,而后再调整anchor和预测分类。但Guided Anchoring每个地位的anchor各不一样,现实状况下,较大的anchor须要较大的感触域特色,反之则须要较小的感触域特色,所以论文设计了基于anchor形态的特色自适应模块(anchor-guided feature adaptation component),依据每个地位的anchor形态转换特色: $f_i$为$i$地位的特色,$(w_i, h_i)$为对应的anchor形态,$\mathcal{N}_T$为$3\times 3$可变形卷积,变形卷积的偏移值由$1\times 1$卷积将地位预测分支输入转换取得,$f^{'}_i$为自适应特色,用于后续的anchor调整以及分类预测,具体见图1。 TrainingJoint objective 网络的整体损失函数由4局部形成,别离是分类损失、回归损失、anchor地位损失以及anchor形态损失: ...

March 4, 2022 · 1 min · jiezi

关于算法:6CCS3RSC7CCSMRTS

6CCS3RSC/7CCSMRTS Assignment: Linear Systems Control16th March 2021For this assignment, you will need the template code assignment.m. Download this from the module’sKEATS page and save it to your computer. When you are ready to submit your assignment, you will needto upload this file so bear this in mind while completing the assignment (further instructions on how tosubmit your assignment are given below). Open the file using Matlab, and complete the following exercises.-L-C circuit.A series resistor-inductor-capacitor circuit (see Figure 1) can be described as a linear system, in whichthecurrent across the components follows the equationdwhere I is the current, R the resistance, L the inductance, C the capacitance and dV /dt the rate of changeof the voltage at the power source. ...

March 4, 2022 · 3 min · jiezi

关于算法:MA117-科学统计

MA117 Programming for Scientists: Project 2 Deadline: 12pm, Friday 19th March 20211MA117 Project 2: Root FindingAdministrative Details• This project is the second of the three assignments required for the assessment in this course. It is tobe submitted by 12pm, Friday 19th March 2021. Details of the method of the submission via the Tabulasystem have been described in the lecture notes and are also available on the course web page.• This assignment will count for 35% of your total grade in the course.• The automated submission system requires that you closely follow instructions about the format ofcertain files; failure to do so will result in the severe loss of points in this assessment.• You may work on the assignment during the lab session, provided you have completed the other tasksthat have been set. You can use the work areas at all times when they are not booked for teaching, 7days per week. If you are working on the assignment on your home system you are advised to makeregular back-up copies (for example by transferring the files to the University systems). You shouldnote that no allowance will be made for domestic disasters involving your own computer system. Youshould make sure well ahead of the deadline that you are able to transfer all necessary files to theUniversity system and that it works there as well.• The Tabula system will be open for the submission of this assignment starting from 1st March 2021.You will not be able to test your code for correctness using Tabula but you can resubmit your workseveral times, until the deadline, if you find a mistake after your submission. A later submission alwaysreplaces the older one, but you have to re-submit all files.• Remember that all work you submit should be your own work. Do not be tempted to copy work; thisassignment is not meant to be a team exercise. There are both human and automated techniques todetect pieces of the code which have been copied from others. If you are stuck, then ask for assistancein the lab sessions. TAs will not complete the exercise for you, but they will help if you do notunderstand the problem, are confused by an error message, need advice on how to debug the code,require further explanation of a feature of Java or similar matters.• If you have more general or administrative problems e-mail me immediately. Always include the coursenumber (MA117) in the subject of your e-mail.1 Formulation of the ProblemFinding the roots of a function is a classical and extremely well-known problem which is important in manybranches of mathematics. In Analysis II, you have probably seen that it is often easy to prove results aboutthe existence of roots. For example, using the Intermediate Value Theorem, you should easily be able toprove that the function () = − cos has a root in the interval [0,1]. On the other hand, calculating anexact value for this root is impossible, since the equation is transcendental.MA117 Programming for Scientists: Project 2 Deadline: 12pm, Friday 19th March 20212Root finding is a classic computational mathematical problem, and as such there are many algorithms whichone may use to approximate the roots of a function. In this project, you will write a program which uses theSecant algorithm. Let ∶ ℂ → ℂ be continuously differentiable and pick two points 0, 1 ∈ ℂ. Consider thesequence of complex numbers {}=1∞ generated by the difference relation+1 = − () − −1() − (−1).Figure 1: An example of fractals for the function() = 3 − 1 in the square with bottom left-corner −1 − and width 2.Typically, if converges and lim→∞ =: ∗ , then (∗) = 0.Some methods of finding the roots (Newton-Raphson) require knowing the derivative of . Whilst there arenumerical tricks to accomplish this, this problem is somewhat beyond the scope of this course. Instead, youwill use the Secant method which does not require the derivative, however it does require two initial values.We will consider a polynomial ∈ ℂ[]; i.e.() = 0 + 1 + 22 + ··· + Where ∈ ℂ.1.1 Secant FractalsOne of the most fascinating aspects of this problem arises from a very simple question: given two startingpositions 0, 1 ∈ ℂ, which root does the sequence produced by Secant converge towards? It turns out thatthe answer to this question is very hard!− 1 1Re( z)− 11− 1 1Re( z)MA117 Programming for Scientists: Project 2 Deadline: 12pm, Friday 19th March 20213Figure 1 shows two examples of how we might visualise this for the polynomial () = 3 − 1. Recall thatthe roots of this polynomial are = 23 for = 1,2,3 (i.e. the third roots of unity). Each of the threecolours represents one of these roots. In the left-hand figure, we colour each point depending on which rootthe method converges to. The right-hand figure is the same, asides from the fact that we make the colourdarker as the number of iterations it takes to get to the root within a tolerance increases. The resultingimages are examples of fractals, which you have undoubtedly seen before.Don’t worry if all of this seems quite difficult – the main aim of the assignment is for you to successfullyimplement the Secant scheme. Most of the code to deal with drawing and writing the images will be givento you.1.2 SummaryYour task then involves several distinct elements. You will:• write a class to represent complex numbers;• write a class to represent a polynomial in ℂ[];• implement the Secant method to find the roots of the polynomial;• investigate some interesting fractals and draw some pictures!2 Programming instructions, classes in your code and hintsOn the course web page for the project, you will find the following files, which should serve as templates andshould help you to start with the project. As with the previous projects, the files have some predefinedmethods that are either complete or come with predefined names and parameters. You must keep all namesof public objects and methods as they are in the templates. Other methods have to be filled in and it is upto you to design them properly. The files define three basic classes for your project:• Complex.java: represents points ∈ ℂ;• Polynomial.java: represents polynomials in ℂ[];• Secant.java: given two initial Complex points 0, 1 close to the root calculate the correspondingroot of Polynomial by Secant, if possible;• SecantFractal.java: will generate a fractal similar to the one pictured above in a square.These classes are documented in more detail in the following sections. You should complete them in theorder of the following sections, making sure to carefully test each one with a main function.2.1 ComplexComplex is the simplest of the classes you will need to implement and will represent complex numbers. Infact, it bears a striking resemblance to the CmplxNum class you (hopefully) implemented in week 14.They are not identical however, so you should carefully copy and paste your code into this new class.MA117 Programming for Scientists: Project 2 Deadline: 12pm, Friday 19th March 202142.2 PolynomialThe Polynomial class is designed to represent a polynomial () = ∑ =0. As such, it containscoeff, an array of Complex coefficients which define it. It is assumed that coeff[0] corresponds to 0,coeff[1] to 1 and so forth. To complete this class, you will have to: ...

March 2, 2022 · 11 min · jiezi

关于算法:SaccadeNet使用角点特征进行twostage预测框精调-CVPR-2020

SaccadeNet基于中心点特色进行初步的指标定位,而后利用初步预测框的角点特色以及中心点特色进行预测框的精调,整体思维相似于two-stage指标检测算法,将第二阶段的预测框精调用的区域特色转化为点特色。SaccadeNet在精度和速度上都可圈可点,整体思维非常不错 起源:晓飞的算法工程笔记 公众号论文: SaccadeNet: A Fast and Accurate Object Detector 论文地址:https://arxiv.org/abs/2003.12125论文代码:https://github.com/voidrank/SaccadeNetIntroduction 在神经学中,人类在定位指标时并非固定地看着场景,而是四处寻找富含信息的区域来帮忙进行指标的定位。受此机制的启发,论文提出了SaccadeNet,可能高效地关注信息丰盛的指标关键点,从粗粒度到细粒度进行指标定位。 SaccadeNet的构造如图2所示,首先初步预测指标的核心地位以及角点地位,而后利用四个角点地位以及中心点地位的特色进行回归优化,SaccadeNet蕴含四个模块: Center Attentive Module(Center-Attn),预测指标的核心地位以及类别。Attention Transitive Module(Attn-Trans),初步预测每个核心地位对应的角点地位。Aggregation Attentive Module (Aggregation-Attn),利用核心地位以及角点地位的特色进行预测框的优化。Corner Attentive Module(Corner-Attn),用于加强骨干网络的指标边界特色。 SaccadeNet的整体思维非常不错,有点相似于two-stage的指标检测的计划,将第二阶段的预测框回归从区域特色转化成了点特色。 Center Attentive Module Center-Attn模块蕴含两个简略的卷积层,将骨干网络输入的特色图转化为中心点热图,热图可用于预测图片中所有指标的核心地位及其类别。该模块的GT跟CornerNet的设置一样,应用高斯核$e^{\frac{||X-X_k||^2}{2{\sigma}^2}}$将GT地位进行散射,$\sigma$为半径的1/3,半径由指标的大小决定,保障半径内的点可能产生IOU至多为0.3的预测框。另外,该模块的损失函数联合了focal loss: $p_{i,j}$为热图上地位$(i,j)$的分数,$y_{i,j}$为对应的GT值。 Attention Transitive Module Attn-Trans模块输入大小为$w_f\times h_f\times 2$,预测每个地位对应的预测框的宽和高,而后依据其中心点地位$(i,j)$计算其对应角点地位$(i-w_{i,j}/2, j-h_{i,j}/2)$,$(i-w_{i,j}/2, j+h_{i,j}/2)$,$(i+w_{i,j}/2, j-h_{i,j}/2)$,$(i+w_{i,j}/2, j+h_{i,j}/2)$,应用L1回归损失进行训练。基于Center-Attn模块和Attn-Trans模块,SaccadeNet可能初步预测指标的检测后果。此外,论文的源码提供在此模块额定预测中心点的偏移值,针对下采样造成的不对齐问题,该偏移值同样应用L1回归损失进行训练,这个是默认开启的。 Aggregation Attentive Module Aggregation-Attn是一个轻量级模块,用于对预测框进行精调,输入更精准的预测框。Aggregation-Attn模块从Attn-Trans模块和Center-Attn模块中获取指标的角点和中心点,并且从骨干网络输入的特色图中,应用双线性插值采样对应地位的特色,最初回归宽和高的修改值,整个模块应用L1损失进行训练。 Corner Attentive Module in Training 为了提取富含信息的角点特色,论文在训练时退出了额定的Corner-Attn分支,将骨干网络特色转化输入为四通道热图,别离对应指标的四个角点。同样地,该分支基于focal loss和高斯热图进行训练,该分支是类不可知的。此模块可迭代进行屡次精调,相似Cascade R-CNN那样,论文在试验局部也进行了比照。 Relation to existing methods 目前的基于关键点的指标检测办法可分为edge-keypoint-based detectors和center-keypoint-based detectors,SaccadeNet综合了两类办法的长处的存在。 Edge-keypoint-based detectors通常先检测角点或极点,而后通过组合办法对关键点组合进行指标的定位,但这类算法通常不能获取指标的全局信息:a) 角点特色自身就蕴含较少的指标信息,须要额定减少核心特色进行特色增强。 b) 角点通常位于背景像素上,绝对于其它关键点蕴含更少的信息。只管SaccadeNet也利用了角点进行指标预测,但SaccadeNet间接从核心关键点进行指标预测,这样可能获取指标的全局信息,并且防止了耗时的关键点组合。 ...

March 2, 2022 · 1 min · jiezi

关于算法:刷爆LeetCode题之简单篇连载中

两数之和形容:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你能够假如每种输出只会对应一个答案。然而,数组中同一个元素在答案里不能反复呈现起源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/two-sum著作权归领扣网络所有。题解:func twoSum(nums []int, target int) []int { nums_l := len(nums) for i, num := range nums { for j := i+1; j < nums_l; j++ { if num + nums[j] == target{ return []int{i, j} } } } return nil}剖析:工夫复杂度:O(N^2),其中 N 是数组中的元素数量。最坏状况下数组中任意两个数都要被匹配一次。空间复杂度:O(1)

March 1, 2022 · 1 min · jiezi

关于算法:CSE-525-算法解析

CSE 525 Programming Assignment 1Due March 20th 11:59:59The goal of this assignment is to implement three RL algorithms listed as follows.● Monte Carlo (with function approximation)● Fitted Q iteration● DQNYou will be using 1 MuJoCo environment (InvertedPendulumMuJoCoEnv-v0) and 1Atari environment (Pong-v0), and compare the RL algorithms. Feel free to use all of theextensions/tricks we discussed during the classes for reliable learning. As the behaviorpolicy of off-policy RL methods, use epsilon-greedy.What you need to submit:(1) A notebook file that contains your network's definition, training processes,evaluation results and necessary comments of your codes.(2) A report that contains core codes of the algorithms and networks design, analysisof your results and comparison between the algorithms.PrerequisitesIn this assignment, we recommend using Colab, OpenAI Gym, OpenAI Gym[Atari],PyBullet and PyBulletGym (Open AI Gym[Mujoco] implementation based on PyBullet).So, before getting started, please be prepared for the smooth running of the requireddependencies.The afore-mentioned packages are actually simulated environments that are able tointeract with our agents to offer instant observations, rewards, and other importantinformation. For this time, we picked 1 discrete environment in Atari called “Pong-v0”and 1 continuous environment in MuJoCo called “InvertedPendulumMuJoCoEnv-v0”.Note that the actions in “Pong” are discrete while the actions in “InvertedPendulum” arecontinuous. As you know, the three algorithms are not able to deal with continuousactions, which further requires you to discretize the action spaces in the“InvertedPendulum” environment first.For the Atari game “Pong” environment, we encourage you to preprocess the imageinput to make it easier for the network to learn.Rubrics1) Network design for two environments. (20 points in toal, 10 points each)2) Training process for three algorithms, there should be 6 training processes in totalfor 2 environments and three algorithms. (30 points in toal, 5 points each, youshould provide a decent amount of comments to explain your codes.)3) Evaluation results of your 6 training programs, this should include cumulativereward by training episodes plots, average return on ten times run of your finalpolicy and any other plots that you find helpful to explain your design’sperformance. (30 points in toal, 5 points each.)4) Analysis of performance of three algorithms for each environment, analyze yourplots and numbers under each algorithm and compare three algorithms under eachenvironment. (15 points in total)5) Comparison between the use of epsilon-greedy vs. random behavior policy. Forthis experiment, use “InvertedPendulum” as your environment and fitted Qiteration as your RL algorithm. Give plots of your cumulative reward by episodesand average return on test runs of your learned policy and analyze the performanceof different behavior policies. (5 points in total)To start with:We prepared a simple starter code for you to understand what you should code and whereto put your analysis. You don’t have to strictly follow the format, write your code in theway you are comfortable with.Before turning in: ...

March 1, 2022 · 3 min · jiezi

关于算法:广度优先搜索-深度优先搜索-动态规划-LeetCode题目传递信息

原文https://lwebapp.com/zh/post/l... 问题小朋友 A 在和 他的小伙伴们玩传信息游戏,游戏规则如下: 有 n 名玩家,所有玩家编号别离为 0 ~ n-1,其中小朋友 A 的编号为 0每个玩家都有固定的若干个可传信息的其余玩家(也可能没有)。传信息的关系是单向的(比方 A 能够向 B 传信息,但 B 不能向 A 传信息)。每轮信息必须须要传递给另一个人,且信息可反复通过同一个人给定总玩家数 n,以及按 [玩家编号,对应可传递玩家编号] 关系组成的二维数组 relation。返回信息从小 A (编号 0 ) 通过 k 轮传递到编号为 n-1 的小伙伴处的计划数;若不能到达,返回 0。 示例 1: 输出:n = 5, relation = [[0,2],[2,1],[3,4],[2,3],[1,4],[2,0],[0,4]], k = 3 输入:3 解释:信息从小 A 编号 0 处开始,经 3 轮传递,达到编号 4。共有 3 种计划,别离是 0->2->0->4, 0->2->1->4, 0->2->3->4。 示例 2: 输出:n = 3, relation = [[0,2],[2,1]], k = 2 ...

March 1, 2022 · 3 min · jiezi

关于算法:FSAF嵌入anchorfree分支来指导acnhorbased算法训练-CVPR2019

FSAF深刻地剖析FPN层在训练时的抉择问题,以超简略的anchor-free分支模式嵌入原网络,简直对速度没有影响,可更精确的抉择最优的FPN层,带来不错的精度晋升 起源:晓飞的算法工程笔记 公众号论文: Feature Selective Anchor-Free Module for Single-Shot Object Detection 论文地址:https://arxiv.org/abs/1903.00621论文代码:https://github.com/zccstig/mmdetection/tree/fsafIntroduction 指标检测的首要问题就是尺寸变动,许多算法应用FPN以及anchor box来解决此问题。在正样本判断下面,个别先依据指标的尺寸决定预测用的FPN层,越大的指标则应用更高的FPN层,而后依据指标与anchor box的IoU进一步判断,但这样的设计会带来两个限度:拍脑袋式的特征选择以及基于IoU的anchor采样。 如图2所示,60x60抉择两头的anchor,而50x50以及40x40的则抉择最小的anchor,anchor的抉择都是人们依据教训制订的规定,这在某些场景下可能不是最优的抉择。 为了解决上述的问题,论文提出了简略且高效的特征选择办法FSAF(feature selective anchor-free),可能在每轮训练中抉择最优的层进行优化。如图3所示,FSAF为FPN每层增加anchor-free分支,蕴含分类与回归,在训练时,依据anchor-free分支的预测后果抉择最合适的FPN层用于训练,最终的网络输入可同时综合FSAF的anchor-free分支后果以及原网络的预测后果。 Network Architecture FSAF的网络后果非常简单,如图4所示。在原有的网络结构上,FSAF为FPN每层引入两个额定的卷积层,别离用于预测anchor-free的分类以及回归后果。这样,在共用特色的状况下,anchor-free和anchor-based的办法可进行联结预测。 Ground-truth and Loss 对于指标$b=[x,y,w,h]$,在训练时可映射到任意的FPN层$P_l$,映射区域为$b^l_p=[x^l_p, y^l_p, w^l_p, h^l_p]$。一般而言,$b^l_p=b/2^l$。定义无效边界$b^l_e=[x^l_e, y^l_e, w^l_e, h^l_e]$和疏忽边界$b^l_i=[x^l_i, y^l_i, w^l_i, h^l_i]$,可用于定义特色图中的正样本区域、疏忽区域以及负样本区域。无效边界和疏忽边界均与映射后果成等比关系,比例别离为$\epsilon_e=0.2$和$\epsilon_i=0.5$,最终的分类损失为所有正负样本的损失值之和除以正样本点数。 Classification Output 分类后果蕴含$K$维,指标次要设定对应维度,样本定义分以下3种状况: 无效边界内的区域为正样本点。疏忽边界到无效边界的区域不参加训练。疏忽边界映射到相邻的特色金字塔层中,映射的边界内的区域不参加训练其余区域为负样本点。 分类的训练采纳focal loss,$\alpha=0.25$,$\gamma=2.0$,残缺的分类损失取所有正负区域的损失值之和除以无效区域点数。 Box Regression Output 回归后果输入为分类无关的4个偏移值维度,仅回归无效区域内的点。对于无效区域地位$(i,j)$,将映射指标示意为$d^l_{i,j}=[d^l_{t_{i,j}}, d^l_{l_{i,j}}, d^l_{b_{i,j}}, d^l_{r_{i,j}}]$,别离为以后地位到$b^l_p$的边界的间隔,对应的该地位上的4维向量为$d^l_{i,j}/S$,$S=4.0$为归一化常量。回归的训练采纳IoU损失,残缺的anchor-free分支的损失取所有无效区域的损失值的均值。 Online Feature Selection anchor-free的设计容许咱们应用任意的FPN层$P_l$进行训练,为了找到最优的FPN层,FSAF模块须要计算FPN每层对指标的预测成果。对于分类与回归,别离计算各层无效区域的focal loss损失以及IoU loss损失: 在失去各层的后果后,取损失值最小的层作为当轮训练的FPN层: Joint Inference and TrainingInference 因为FSAF对原网络的改变很少,在推理时,略微过滤下anchor-free和anchor-based分支的后果,而后合并进行NMS。 ...

March 1, 2022 · 1 min · jiezi

关于算法:CSCI-150-Assembly分析

CSCI 150 -- Lab 3Programming in Assembly LanguageDue:________________________Feel free to discuss and help each other out, but does not imply that you can give awayyour code or your answers! Make sure to read all instructions before attempting this lab.Refer to the MSVS 2017/2019 document on Canvas and obtain helps from yourinstructor as necessary. You cannot work with a lab partner for this assignment.You must use an appropriate provided template from Canvas or my website(zeus.mtsac.edu/~tvo) and output "Author: Your Name(s)" for all newprograms. If you are modifying an existing program, use "Modified by: YourName(s)".Exercise 1: Using the AddSub program from the book as a reference, write an assemblyprogram to perform the following operations using only 16-bit registers: AX = 20 - (15 +30). You must perform 15 + 30 first and then perform the subtraction operation. Useadditional registers as needed. Insert a call DumpRegs statement after each operationand confirm that AX is holding the correct result. Add a comment after each instructionto describe it. For example: mov bx, 1 ; assign 1 to bx so bx = 1 add bx, 2 ; add 2 to bx so bx = 3In addition, display the message "Author: Your Name." at the beginning of your programby defining a null-terminated string and then add a call WriteString instruction.Once your program is working correctly, modify it to add the following calculation: BX= a - (b + d), but do keep the code from previous step. Once again, you must performaddition operation first and then perform the subtraction operation. Define variables a, b,and d as 16-bits signed integers with values 20, 15, and 30 respectively. Use DumRegsto confirm that it calculates the result for BX correctly. ; instructions to calculate AX = 20 – (15 + 30), using constants ; instructions to calculate BX = a – (b + d), using variables ; AX and BX should have the same valueExercise 2: Write an assembly program in 32-bit Protected mode that implements thefollowing arithmetic expressions using as few instructions and registers as possiblewithout simplifying the expression manually (i.e., perform operations in correct orderaccording to normal precedence and use variables as applicable). Assume that r1 is a 32-bit signed value and r2 is a 16-bit unsigned value. You can confirm that variables r1 andr2 hold correct values by assign them to different registers and call DumpRegs. r1 = -(v2 – (v3 + v1)) + 1 r2 = v4 + 10hUse the following data definitions: v1 SDWORD 10h v2 SDWORD 30h v3 SDWORD 20 r1 SDWORD ? v4 WORD 0FFFFh r2 WORD ?In comments next to each instruction, write the current hexadecimal value of the affectedregister or variable (for example: mov eax, 12 ; eax = 0Ch). Insert a callDumpRegs statement at the end of the program and you should examine various registersto confirm that your program is working properly. In addition, display the message"Author: Your Name." at the beginning of your program by defining a null-terminatedstring and then add a call WriteString instruction.Lab question 1: How does MSVS know that you are working with an assembly programinstead another program such as C++?Lab question 2: What do you have to modify in your program to compute EBX = a - (b ...

February 28, 2022 · 3 min · jiezi

关于算法:leetcode算法13罗马数字转整数

哈喽!大家好,我是【学无止境小奇】,一位酷爱分享各种技术的博主! ⭐【学无止境小奇】的创作主旨:每一条命令都亲自执行过,每一行代码都理论运行过,每一种办法都实在实际过,每一篇文章都良心制作过。✊✊✊ ⭐【学无止境小奇】的博客中所有波及命令、代码的中央,除了提供图片供大家参考,另外会在图片下方提供一份纯文本格式的命令或者代码不便大家粘贴复制间接执行命令或者运行代码。 ⭐如果你对技术有着浓重的趣味,欢送关注【学无止境小奇】,欢送大家和我一起交换。 ❤️❤️❤️感激各位朋友接下来的浏览❤️❤️❤️ 文章目录一、leetcode算法1、罗马数字转整数1.1、题目1.2、思路1.3、答案一、leetcode算法1、罗马数字转整数1.1、题目罗马数字蕴含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常状况下,罗马数字中小的数字在大的数字的左边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的右边,所示意的数等于大数 5 减小数 1 失去的数值 4 。同样地,数字 9 示意为 IX。这个非凡的规定只实用于以下六种状况: I 能够放在 V (5) 和 X (10) 的右边,来示意 4 和 9。X 能够放在 L (50) 和 C (100) 的右边,来示意 40 和 90。C 能够放在 D (500) 和 M (1000) 的右边,来示意 400 和 900。给定一个罗马数字,将其转换成整数。 ...

February 28, 2022 · 1 min · jiezi

关于算法:CMP3750M

University of Lincoln Assessment FrameworkAssessment Briefing Template 2020-2021Module Code & Title: CMP3750M Cyber SecurityContribution to Final Module Mark: 40%Description of Assessment Task and Purpose:ScenarioYou are employed by as a Network Security Analyst by an airline. The airline has beencriticised for high flight prices on the back of a £4m profit in the last financial year. Thebusiness has recently been under attack from threat actors who have initiated DoS attacks.These attacks have brought the business to a halt with customers not able to access theiraccounts or book flights. The business has not invested in network security and there is onlyone firewall between the main servers and the Internet.Your line manager has asked you to undertake two tasks: ...

February 28, 2022 · 3 min · jiezi

关于算法:理解归并排序

归并排序就是对数组的左半边和右半边别离排序,而后再合并两个有序数组。 归并排序的过程能够在逻辑上形象成一棵二叉树,树上的每个节点的值能够认为是 nums[lo..hi],叶子节点的值就是数组中的单个元素而后,在每个节点的后序地位(左右子节点曾经被排好序)的时候执行 merge 函数,合并两个子节点上的子数组这个 merge 操作会在二叉树的每个节点上都执行一遍,执行程序是二叉树后序遍历的程序一句话总结,归并排序实际上就是先对数组一直进行二分,分到只有一个元素为止,此时 merge 办法开始发挥作用,将两个元素为一组,合并为长度为 2 的有序数组,再将两个长度为 2 的有序数组为一组,合并为长度为 4 的有序数组,以此类推class Merge { // 用于辅助合并有序数组(不能原地合并,须要借助额定空间) private static int[] temp; public static void sort(int[] nums) { // 防止递归中频繁调配和开释内存可能产生的性能问题 // 提前给辅助数组开拓内存空间 temp = new int[nums.length]; // 原地批改的形式对整个数组进行排序 sort(nums, 0, nums.length - 1); } // 定义:将子数组 nums[lo..hi] 进行排序 private static void sort(int[] nums, int lo, int hi) { if (lo == hi) { // 单个元素不必排序 return; } // 这样写是为了避免溢出,成果等同于 (hi + lo) / 2 // 留神:对于无奈整除的状况,Java 中 int 类型会主动向下取整 int mid = lo + (hi - lo) / 2; // 先对左半局部数组 nums[lo..mid] 排序 sort(nums, lo, mid); // 再对右半局部数组 nums[mid+1..hi] 排序 sort(nums, mid + 1, hi); // 将两局部有序数组合并成一个有序数组 merge(nums, lo, mid, hi); } // 将 nums[lo..mid] 和 nums[mid+1..hi] 这两个有序数组合并成一个有序数组 private static void merge(int[] nums, int lo, int mid, int hi) { // 先把 nums[lo..hi] 复制到辅助数组中 // 以便合并后的后果可能间接存入 nums for (int i = lo; i <= hi; i++) { temp[i] = nums[i]; } // 数组双指针技巧,合并两个有序数组 // i => 左半边数组起始下标 // j => 右半边数组起始下标 int i = lo, j = mid + 1; for (int p = lo; p <= hi; p++) { if (i == mid + 1) { // 左半边数组已全副被合并,只需把右半边数组合并过去即可 nums[p] = temp[j++]; } else if (j == hi + 1) { // 右半边数组已全副被合并,只需把左半边数组合并过去即可 nums[p] = temp[i++]; } else if (temp[i] > temp[j]) { // 将较小的元素合入,同时下标后退一位,此时是升序 // 只有将 > 改为 < 就能够把后果改为降序 nums[p] = temp[j++]; } else { nums[p] = temp[i++]; } } }}归并排序工夫复杂度为 O(nlogn)

February 26, 2022 · 2 min · jiezi

关于算法:提升文件上传性能的-4-种方式你会吗

业务需要产品经理:小明啊,咱们须要做一个附件上传的需要,内容可能是图片、pdf 或者视频。 小明:能够实现的,不过要限度下文件大小。最好别超过 30MB,太大了上传比较慢,服务器压力也大。 产品经理:沟通下来,视频是肯定要的。就限度 50MB 以下吧。 小明:能够。 测试同学:这文件上传也太慢了吧,我试了一个 50mb 的文件,花了一分钟。 小明:whats up,这么慢。 产品经理:不行,你这太慢了, 想方法优化下。 优化之路问题定位整体的文件上传调用链路如下图: 小明发现前端开始上传,到申请到后端就破费了近 30 秒,应该是浏览器解析文件导致的慢。 后端服务申请文件服务也比较慢。 解决方案小明:文件服务有异步接口吗? 文件服务:临时没有。 小明:这个上传的确很慢,有优化倡议吗? 文件服务:没有,看了下就是这么慢。 小明:…… 最初小明还是决定把后端的同步返回,调整为异步返回,升高用户的等待时间。 把后端的实现调整了一番适应业务,前端调用后获取异步返回标识,后端依据标识查问文件服务同步返回的后果。 毛病也很显著,异步上传失败,用户是不晓得的。 不过碍于工夫起因,也就是能权衡利弊,临时上线了。 最近小明有些工夫,于是就想着本人实现一个文件服务。 文件服务碍于文件服务的性能十分原始,小明就想着本人实现一个,从以下几个方面优化: (1)压缩 (2)异步 (3)秒传 (4)并发 (5)直连 压缩日常开发中,尽可能和产品沟通分明,让用户上传/下载压缩包文件。 因为网络传输是十分耗时的。 压缩文件还有一个益处就是节约存储空间,当然,个别咱们不必思考这个老本。 长处:实现简略,成果拔群。 毛病:须要联合业务,并且压服产品。如果产品心愿图片预览,视频播放,压缩就不太实用。 异步对于比拟耗时的操作,咱们会天然的想到异步执行,升高用户同步期待的工夫。 服务端接管到文件内容后,返回一个申请标识,异步执行解决逻辑。 那如何获取执行后果呢? 个别有 2 种常见计划: (1)提供后果查问接口 绝对简略,然而可能会有有效查问。 (2)提供异步后果回调性能 实现比拟麻烦,能够第一工夫获取执行后果。 秒传小伙伴们应该都用过云盘,云盘有时候上传文件,十分大的文件,却能够霎时上传实现。 这是如何实现的呢? 每一个文件内容,都对应惟一的文件哈希值。 咱们能够在上传之前,查问该哈希值是否存在,如果曾经存在,则间接减少一个援用即可,跳过了文件传输的环节。 当然,这个只在你的用户文件数据量很大,且有肯定反复率的时候劣势能力体现进去。 伪代码如下: public FileUploadResponse uploadByHash(final String fileName, final String fileBase64) { FileUploadResponse response = new FileUploadResponse(); //判断文件是否存在 String fileHash = Md5Util.md5(fileBase64); FileInfoExistsResponse fileInfoExistsResponse = fileInfoExists(fileHash); if (!RespCodeConst.SUCCESS.equals(fileInfoExistsResponse.getRespCode())) { response.setRespCode(fileInfoExistsResponse.getRespCode()); response.setRespMessage(fileInfoExistsResponse.getRespMessage()); return response; } Boolean exists = fileInfoExistsResponse.getExists(); FileUploadByHashRequest request = new FileUploadByHashRequest(); request.setFileName(fileName); request.setFileHash(fileHash); request.setAsyncFlag(asyncFlag); // 文件不存在再上传内容 if (!Boolean.TRUE.equals(exists)) { request.setFileBase64(fileBase64); } // 调用服务端 return fillAndCallServer(request, "api/file/uploadByHash", FileUploadResponse.class);}并发另一种形式就是对一个比拟大的文件进行切分。 ...

February 26, 2022 · 2 min · jiezi

关于算法:FPT又是借鉴Transformer这次多方向融合特征金字塔-ECCV-2020

论文提出用于特色金字塔的高效特色交互办法FPT,蕴含3种精心设计的特色加强操作,别离用于借鉴层内特色进行加强、借鉴高层特色进行加强以及借鉴低层特色进行加强,FPT的输入维度与输出统一,可能自在嵌入到各种蕴含特色金字塔的检测算法中,从试验后果来看,成果不错 起源:晓飞的算法工程笔记 公众号论文: Feature Pyramid Transformer 论文地址:https://arxiv.org/abs/2007.09451论文代码:https://github.com/ZHANGDONG-NJUST/FPTIntroduction 讲论文前先捋一下CNN网络结构相干的常识,论文的思维次要来自两个,一个是特色金字塔构造,一个是Non-local网络: 首先是特色金字塔,如图1a,CNN网络以层级构造的模式逐层提取更丰盛的特色,而后应用最初的特色层进行预测。但对于一些小物体而言,最初一层的特色图往往没有足够的像素点进行预测。为了更好地对不同大小的物体进行预测,人们提出图1b的金字塔特色,大物体应用高层的粗粒度特色,小物体应用底层的细粒度特色。对于一些pixel-level工作,比方语义宰割,须要综合不同层的上下文信息进行粗疏的预测,所以就须要图1c的预测构造。其次是Non-local network,该网络借鉴了NLP模型的Self-attention思维,如图1d所示,可能借鉴特色图上的其它特色点来对以后特色点进行加强。 基于下面两个思维,论文提出了FPT(Feature Pyramid Transformer),构造如图1e所示,外围在特色金字塔上进行相似Non-local的特色加强,而后再应用多层特色进行预测。FPT设计了3种特色加强操作,也是论文的次要奉献: ST(Self-Transformer):跟non-local操作一样在对以后层进行特色加强。GT(Grounding Transformer):这是top-down模式的non-local操作,将高层特色(尺寸小的)别离用于低层特色的加强。RT(Rendering Transformer):这是bottom-up模式的non-local操作,将低层特色(尺寸大的)别离用于高层特色的加强。Feature Pyramid Transformer FPT的特色转换流程如图2所示,输出为金字塔特色,首先对每层特色别离进行ST、GT、RT特色加强失去多个加强后的特色,而后对加强的特色按尺寸进行排序,将雷同大小的特色concate到一起,通过卷积将加强后的特色维度复原到输出时的雷同维度。 Non-Local Interaction Revisited 因为论文提出的特色加强操作与non-local操作有很大关系,这里须要先介绍下non-local的思维。惯例non-local操作的输出为单特色图$X$上的queries(Q), keys(K)和values(V),输入与$X$尺寸雷同的加强特色$\hat{X}$: $q_i=f_q(X_i)\in Q$,$k_j=f_k(X_j)\in K$,$v_j=f_v(X_j)\in V$,$f_q(\cdot)$、$f_k(\cdot)$和$f_v(\cdot)$为对应的线性变换,$X_i$和$X_j$为特色图$X$上的第$i^{th}$和$j^{th}$地位上的特色,$F_{sim}$为类似度函数,默认为点积,$F_{nom}$为归一化函数,默认为softmax,$F_{mul}$为权重集成函数,默认为矩阵相乘,$\hat{X}_i$为输入特色图$\hat{X}$的第$i^{th}$地位上的特色。 Self-Transformer ST为改进版non-local操作,如图1a所示,次要有两点不同: 将$q_i$和$k_j$分为$\mathcal{N}$局部,而后计算每局部的每组$q_{i,n}$和$k_{j,n}$类似度分数$s^n_{i,j}$类似度计算应用改良的MoS(Mixture of Softmaxes)函数$F_{mos}$:$\pi_n=Softmax(w^T_n \overline{k})$为特色集成时的权重,$w_n$为可学习的线性变换,$\overline{k}$为所有$k_j$的均值。 基于上述的改良,ST定义为: Grounding Transformer GT是top-down模式的non-local操作,如图2c所示,借用高层的粗粒度特色$X^c$来加强低层的细粒度特色$X^f$。在计算时,类似度计算由点积替换为更高效的欧氏间隔$F_{eud}$: $q_i=f_q(X^f_i)$,$k_j=f_k(X^c_j)$。GT跟ST一样将$q_i$和$k_j$分为$\mathcal{N}$局部,残缺的定义为: 在特色金字塔中,高下层特色别离蕴含图片的全局和部分信息,而对于语义宰割工作,不须要关注过多高层的全局信息,更多的是须要query地位左近的上下文信息,所以图3b的跨层卷积对语义宰割工作非常无效。因为GT操作是全局计算,所以论文提出了部分束缚(Locality-constrained)的GT操作LGT,如图3c所示,每个$q_i$只与高层部分区域的$k_j$和$v_j$进行计算。高层部分区域以$q_i$对应的地位为核心,边长(square size)为固定值。如果高层的部分区域越出了特色图,则应用0代替。 Rendering Transformer 与GT相同,RT是bottom-up模式的non-local操作,借用低层的细粒度特色来加强高层的粗粒度特色。RT也是部分束缚(Locality-constrained)的,以channel-wise进行计算的,定义高层特色为$Q$,低层特色为$K$和$V$,计算步骤蕴含如下: 对$K$和进行全局均匀池化失去权重$w$。使用权重$w$对$Q$进行加权失去$Q_{att}$。对$V$进行带stride的$3\times 3$卷积下采样失去$V_{dow}$。应用$3\times 3$卷积对$Q_{att}$进行调整,并与$V_{dow}$相加,再过一层$3\times 3$卷积后输入。 残缺RT的定义为: $F_{att}(\cdot)$为外积函数,$F_{scov}(\cdot)$为带stride的$3\times 3$卷积,$F_{conv}(\cdot)$为用于调整的$3\times 3$卷积,$F_{add}(\cdot)$为蕴含$3\times 3$卷积的特色相加函数。 Experiments 在COCO上与其它算法的比照试验。 在多个数据集上的进行语义宰割性能比照。 ...

February 25, 2022 · 1 min · jiezi

关于算法:拓扑排序

拓扑排序简略讲就是在可求拓扑序列的有向无回路图(有向无环图)中求取拓扑序列的排序算法。 相干概念拓扑序列艰深讲就是按流动的先后秩序进行排序的序列,并且每一个顶点只呈现一次,它能够表述出实现某一项流动所须要的前置流动都有哪一些!当然,一个图的拓扑排序不惟一。 例子: 修学课程都有其先修课程,利用拓扑序列就能疾速的取得所有的先修课程游戏工作都有前置工作,利用拓扑序列,就能分明所有的工作链条依赖包的加载程序也是利用拓扑序列来解决的求取拓扑序列的图:有向无环图有向:对于一个顶点到另一个顶点的方向是确定的,也就是连接线呈现箭头的图无环:也可称为无回路,从一个顶点登程,经验所有的门路,也不能回到该顶点 所有顶点都满足以上两种状况的图就叫做有向无环图,根本能够认为只有有向无环图能力求取拓扑序列 入度与出度在有向图中,一个顶点的入度为其所有指向该顶点的箭头个数,出度为其所指向其余顶点的箭头个数。 算法思路根本思维找到无入度的顶点,输入该顶点,并将其指向的顶点入度数减一反复第一步,直至所有顶点被输入,拓扑序列实现,如果输入的顶点数小于图中顶点的个数,无拓扑序列代码实现思路定义一个队列、输入数组以及 HashMap 队列存储拓扑序列,并最初输入输入数组寄存最初队列输入的拓扑序列HashMap 存储结点及其入度值遍历所有结点,将所有结点(除入度为零的结点)的入度及其值寄存到 HashMap 中,将入度为 0 的结点搁置到队列之中 遍历结点可用深度优先遍历,也可广度优先遍历 当队列不为空时 输入队列一个结点到输入数组中,设为 a将结点 a 所有指向的顶点入度减一若呈现入度为 0 的结点,则存入队列之中队列为空,输入的顶点个数小于图顶点数,无拓扑序列,输入 null,否则,拓扑序列输入完结,并返回输入数组邻接矩阵的拓扑序列public static char[] foundTopology(GraphM g){ Queue<Integer> queue = new LinkedList<>(); HashMap<String,Integer> hashMap= new HashMap<>(); char[] res = new char[g.VertexNum]; //计算每个结点入度值 for (int i = 0;i < g.VertexNum;i++){ String key = String.valueOf(g.Vertex[i]); int value = 0; for (int j = 0;j < g.VertexNum;j++){ if (g.EdgeWeight[j][i]!=0){ value++; } } if (value==0){ queue.add(i); } hashMap.put(key,value); } int j = 0; while(!queue.isEmpty()){ int getKey = queue.remove(); res[j++] = g.Vertex[getKey]; for (int k = 0;k < g.VertexNum;k++){ String getPointKey = String.valueOf(g.Vertex[k]); int getPointValue = hashMap.get(getPointKey); if (g.EdgeWeight[getKey][k] != 0 && getPointValue != 0){ hashMap.put(getPointKey,getPointValue-1); if (getPointValue-1==0){ queue.add(k); } } } } if (j == g.VertexNum){ return res; } return null;}邻接表的拓扑序列当然,实现本代码的前提是可能定义一个有向图,并且遍历图 ...

February 24, 2022 · 5 min · jiezi

关于算法:CS-435535-分析讲解

CS 435/535 Assignment #5 – Spring 2021Project Overview: This project investigates polymorphism in C++. In C++, polymorphism allows the mainfunction to be written before an actual class is defined. In this project, you will download from Blackboard the filemain.cpp that contains the main function and the two files (Shape.h and Shape.cpp) that define a baseclass named Shape. The Shape base class has a name represented by a private instance variable called name, butit does not have any other details on the shape. However, the base class has four (4) pure virtual functions: getArea(it is supposed to compute the surface area of the shape), getVolume (to compute the volume of the shape), test(to test whether the shape satisfies a list of conditions), and getInfo (to form a string that describes the shape).You are asked to write four (4) derived classes: Sphere, Cylinder, Cone, and Cuboid. For detailed informationon these four particular shapes, please refer to https://www.mathsisfun.com/ge...The website also shows how to compute the surface area and the volume of these four shapes. The relationshipbetween the base class and these four derived classes is shown below. These four derived classes have added theirown instance variables to describe the details of the corresponding shapes. For each derived class, you need to haveone header file (with the .h extension) and one implementation file (with the .cpp extension). However, you canuse any name for the file, any name for the class, and any names for instance variables. The main function does notneed to know the class names you will use. The only requirement is that each derived class must be derived from theShape base class, which will force you to implement the four virtual functions in the derived class. Polymorphismenables the main function to invoke a function of a derived class in the future by just calling the corresponding virtual function of the baseclass.To test the program, we assume that the shapes will be stored in a data file that will be passed to the program as acommand line argument. Each shape will occupy one line in the data file. Each line starts with the <name> that is astring, followed by the type (sphere, cylinder, cone or cuboid). The rest will be doubles to represent thedimensions of the shape.<name> sphere <radius><name> cylinder <radius> <height><name> cone <radius> <height><name> cuboid <length> <width> <height>You can download a sample data file named shapes.dat from Blackboard for an example. It contains thefollowing shapes.Cube#1 cuboid 1 1 1Cube#2 cuboid 2 2 2Cone#1 cone 1 1Cyl#1 cylinder 1 1Box#1 cuboid 2 4 6Box#2 cuboid 10.5 21 10.5UnitSphere sphere 1LargeSphere sphere 100Cone#2 cone 1 2Cyl#2 cylinder 1 2You need to write a function named readFrom that will return a pointer to a vector of shapes read from a data filewith its name given as a parameter to the function. The function has the following signature.std::vector<Shape> readFrom(std::string);The signature is stored in a file named reading.h that you can also download from Blackboard. You need to createa .cpp file to implement the function. You can assume a data file will always follow the correct format as describedabove. However, if the file can’t be opened for reading, you shall return a pointer to an empty vector.As mentioned earlier, you need to implement four virtual functions in each of four derived classes. Please refer to thewebsite mentioned above on how to compute the surface area and the volume. For the getInfo function, pleasesee the sample execution at the end on how to format the output string. The test function is to test whether theshape satisfies a list of conditions. The list of conditions is passed to the function as a parameter and it is a vector ofstrings. The number of strings in the vector will always be a multiple of 3. Three consecutive strings form a testcondition in the <name> <op> <value> form. The <name> string will be “type”, “area” or “volume”. The<op> string is one of the six relational operators (“==”, “!=”, “>=”, “<=”, “>”, and “<”). The <value>string is the reference value in the string format to be compared with. For the test function to return true, all thetest conditions have to be satisfied. For example, if the string vector contains 9 strings: “type” “>” “cyl” “area”“<=” “1000” “volume” “>” “100.5”, the function returns true if the shape type is greater than “cyl” and thesurface area is less than or equal to 1000 and the volume is greater than 100.5. If the vector is empty (containing notesting conditions), the function will always return true. Please see the getTestConditions function inmain.cpp to see how to build a list of test conditions.In this project, you need to create a makefile to compile the program. Please use the –Wall -std=c++11 optionswhen compiling your program with g++. The executable of this program shall be named as a.out regardless of theoperating system you are using (using the -o a.out option with g++). Your makefile shall support thecommands "make" to produce a.out, and "make clean" to remove a.out and any object files (with the .oextension).What You Need To Do• Create a directory named project5 on your machine. Download main.cpp, Shape.h, Shape.cppreading.h, and shapes.dat from Blackboard to the project5 directory. You can make changesto shapes.dat for more testing, but make no changes to the other downloaded files.• Add four (4) derived classes as required. Each class shall have its own header and implementation. You can addmore derived classes for additional shapes and the main function will work with them too without any changes.• Create a .cpp file to implement the readFrom function, based on its signature in reading.h.• Create a makefile that supports the commands "make" to produce a.out, and "make clean" toremove a.out and any object files. Your makefile will be used to compile your program to producea.out, and a.out will be used to test your program.• When you are ready to submit your project, compress your project5 directory into a single (compressed)zip file, project5.zip. No other compressed files will be accepted. It is not necessary to include thefiles downloaded from Blackboard.• Once you have a compressed zip file named project5.zip, submit that zip file to Blackboard.• Your submission will be graded on cs-parallel.ua.edu. Make sure to test it on that machine beforesubmission.• Make sure to follow the above instructions exactly. Otherwise we may not be able to grade your submission.Assignment #5 is due at 11:59pm on Friday, March 19. Late projects are not accepted.This document including its associated files is for your own personal use only.You may not post this document or a portion of this document to a sitesuch as chegg.com without prior written authorization.An assignment shall be completed individually, with no sharing of code or solutions.All submissions will go through MOSS (Measure Of Software Similarity) for similarity check.The University of Alabama’s Code of Academic Conduct will be rigorously enforced.An sample execution of the program$ ./a.out shapes.datEnter a command: printCuboid: Cube#1, Length=1.00, Width=1.00, Height=1.00 Surface Area: 6.00, Volume: 1.00Cuboid: Cube#2, Length=2.00, Width=2.00, Height=2.00 Surface Area: 24.00, Volume: 8.00Cone: Cone#1, Radius=1.00, Height=1.00 Surface Area: 7.58, Volume: 1.05Cyliner: Cyl#1, Radius=1.00, Height=1.00 Surface Area: 12.57, Volume: 3.14Cuboid: Box#1, Length=2.00, Width=4.00, Height=6.00 Surface Area: 88.00, Volume: 48.00Cuboid: Box#2, Length=10.50, Width=21.00, Height=10.50 Surface Area: 1102.50, Volume: 2315.25Sphere: UnitSphere, Radius=1.00 Surface Area: 12.57, Volume: 4.19Sphere: LargeSphere, Radius=100.00 Surface Area: 125663.71, Volume: 4188790.20Cone: Cone#2, Radius=1.00, Height=2.00 Surface Area: 10.17, Volume: 2.09Cyliner: Cyl#2, Radius=1.00, Height=2.00 Surface Area: 18.85, Volume: 6.28Enter a command: print2Enter test condition #1: type == cuboidEnter test condition #2: area >= 88Cuboid: Box#1, Length=2.00, Width=4.00, Height=6.00 Surface Area: 88.00, Volume: 48.00Cuboid: Box#2, Length=10.50, Width=21.00, Height=10.50 Surface Area: 1102.50, Volume: 2315.25Enter a command: count1Enter test condition #1: type > cylThere are 4 shapes.Enter a command: count1Enter test condition #1: type != cuboidThere are 6 shapes.Enter a command: showshow: invalid actionValid actions: print count min max total avgEnter help for helpEnter a command: quit ...

February 24, 2022 · 7 min · jiezi

关于算法:Anchorfree目标检测综述-Dense-Prediction篇

 晚期指标检测钻研以anchor-based为主,设定初始anchor,预测anchor的修改值,分为two-stage指标检测与one-stage指标检测,别离以Faster R-CNN和SSD作为代表。起初,有研究者感觉初始anchor的设定对准确率的影响很大,而且很难找到完满的预设anchor,于是开始一直得钻研anchor-free指标检测算法,意在去掉预设anchor的环节,让网络自行学习anchor的地位与形态,在速度和准确率下面都有很不错的体现。anchor-free指标检测算法分为两种,一种是DenseBox为代表的Dense Prediction类型,密集地预测的框的绝对地位,另一种则是以CornerNet为代表的Keypoint-bsaed Detection类型,以检测指标关键点为主。 本文次要列举几种Dense Prediction类型的网络,次要波及以下网络: YOLODenseBoxGuided AnchoringFSAFFCOSFoveaBoxSAPDATSSFCOSv2DDBNetYOLO YOLOv1是晚期的anchor-free算法,起初的系列则转型成anchor-based算法。YOLO同时对多个物体进行分类和定位,没有proposal的概念,是one-stage实时检测网络的里程碑,标准版在TitanX达到45 fps,疾速版达到150fps,但精度不迭过后的SOTA网络。 将输出分为$S\times S$的格子,如果GT的中心点在格子中,则格子负责该GT的预测: 每个格子预测$B$个bbox,每个bbox预测5个值: $x,y,w,h$和置信度,别离为中心点坐标和bbox的宽高,中心点坐标是格子边的相对值,宽高则是整图的相对值。置信度能够反馈格子是否蕴含物体以及蕴含物体的概率,定义为${\Pr}(Object)*IOU_{pred}^{truth}$,无物体则为0,有则为IOU每个格子预测$C$个类的条件概率$\Pr(Class_i|Object)$,留神这里按格子进行预测,没有按bbox进行预测DenseBox DenseBox是晚期的Anchor-free指标检测算法,过后R-CNN系列在小物体的检测上有显著的瓶颈,所以作者提出DenseBox,在小物体的检测也有不错的体现。在DenseBox提出的早些工夫,驰名的Faster R-CNN呈现了,其弱小的性能主导了指标检测算法往anchor-based的方向倒退。直到FPN的呈现,Anchor-free算法的性能才有了很大的晋升,更多的工作开始波及Anchor-free畛域。目前很多Anchor-free指标检测钻研都有DenseBox的影子,所以DenseBox的设计思路还是很超前的。 DenseBox的整体设计如图1所示,单个卷积网络同时输入多个预测框及其类别置信度,输入的特色图大小为$5\times \frac{m}{4}\times \frac{n}{4}$。假如像素$i$位于$(x_i, y_i)$,其冀望的5维向量为$\hat{t}_i=\{\hat{s}, \hat{dx^t}=x_i - x_t, \hat{dy^t}=y_i - y_t, \hat{dx^b}=x_i - x_b, \hat{dy^b}=y_i - y_b \}$,第一个为分类置信度,后四个为像素地位到指标边界的间隔,最初,将所有像素的输入转化为预测框,通过NMS解决后进行最初的输入。 Guided Anchoring Guided Anchoring通过在线生成anchor的形式解决惯例手工预设anchor存在的问题,可能依据生成的anchor自适应特色,在嵌入方面提供了两种施行办法,是一个很残缺的解决方案。 Guided Anchoring首先判断指标可能呈现的地位,而后学习不同地位上的指标的形态,可依据图片特色在线学习稠密的候选anchor。然而,在线生成的anchor形态各异,固定的感触域可能不匹配其形态,所以Guided Anchoring依据anchor的形态进行自适应特征提取,而后再进行预测框精调与分类。 FSAF 指标检测的首要问题就是尺寸变动,许多算法应用FPN以及anchor box来解决此问题。在正样本判断下面,个别先依据指标的尺寸决定预测用的FPN层,越大的指标则应用更高的FPN层,而后依据指标与anchor box的IoU进一步判断,但这样的设计会带来两个限度:拍脑袋式的特征选择以及基于IoU的anchor采样。 为了解决上述的问题,FSAF(feature selective anchor-free)在每轮迭代中抉择最优的层进行训练优化。如图3所示,FSAF为FPN每层增加anchor-free分支,蕴含分类与回归,在训练时,依据anchor-free分支的预测后果抉择最合适的FPN层用于训练,最终的网络输入可同时综合FSAF的anchor-free分支后果以及原网络的预测后果。 FCOS 论文提出anchor-free和proposal-free的one-stage的指标检测算法FCOS,不再须要anchor相干的的超参数,在目前风行的逐像素(per-pixel)预测办法上进行指标检测。从试验后果来看,FCOS可能与支流的检测算法相比拟,达到SOTA,为前面的大热的anchor-free办法提供了很好的参考。 指标检测因为anchor的存在,不能进行纯逐像素地疾速预测,于是FCOS摈弃anchor,提出逐像素全卷积指标检测网络网络,总结如下: 效仿后期的FCNs-based网络,如DenseBox,每个像素回归一个4D向量指代预测框绝对于以后像素地位的偏移,如图1左为了预测不同尺寸的指标,DenseBox会缩放或剪裁生成图像金字塔进行预测,而且当指标重叠时,会呈现像素不晓得负责预测哪个指标的问题,如图1右。在对问题进行钻研后,论文发现应用FPN能解决以上问题因为预测的后果会产生许多低质量的预测后果,论文采纳center-ness分支来预测以后像素与对应指标中心点的偏离状况,用来去除低质量预测后果以及进行NMSFoveaBox FoveaBox同时预测每个无效地位为指标核心的可能性及其对应指标的尺寸,输入类别置信度以及用以转化指标区域的尺寸信息。作为与FCOS和FSAF同期的Anchor-free论文,FoveaBox在整体构造上也是基于DenseBox加FPN的策略,次要差异在于FoveaBox只应用指标核心区域进行预测且回归预测的是归一化后的偏移值,还有依据指标尺寸抉择FPN的多层进行训练。因为FoveaBox的整体实现计划太纯正了,与其它Anchor-free办法很像,所以始终投稿到当初才中了,作者也是相当不容易。 SAPD Anchor-free检测办法分为anchor-point类别和key-point类别两种,anchor-point类别尽管更快更灵便,但准确率个别比key-point类别要低,所以论文着力于钻研妨碍anchor-point类别准确率的因素,提出了SAPD(Soft Anchor-Point Detecto)。 ...

February 24, 2022 · 1 min · jiezi

关于算法:COMP2721

COMP2721Coursework 3COMP2721 Algorithms and Data Structures II We are given six matrices A1, A2, A3, A4, A5 and A6 for which we wish to compute theproduct A = A1 · A2 · A3 · A4 · A5 · A6 where Aiis a di−1 × di matrix. Since matrixmultiplication is associative we can parenthesise the expression for A any way we wish andwe will end up with the same result. What is the minimum number of scalar multiplicationswe have to perform if d0 = 3, d1 = 4, d2 = 5, d3 = 6, d4 = 5, d5 = 3 and d6 = 2? How dowe parenthesise the expression for A to achieve this number?Present your partial results in a table. Give the diagonals as lists of 5, 4, 3, 2, 1 number(s)separated by a blank space.Give the product with parantheses such as ((A1A2)(A3A4))(A5A6).[0:30 h expected time] [6 marks]Consider the following directed graph with edge-weights.Execute the Floyd-Warshall algorithm on the above graph. Recall that the algorithm calculatesdistance di(u, v) between any pair of vertices u and v, where for every i ∈ {1, . . . , 6},di(u, v) is the length of a shortest (u, v)-path in the graph G[{u, v, 1, . . . , i}]. For instance,the following matrix shows the distance di(u, v) for i = 0.Fill the following table with all updates (of distances) that occur during the execution ofthe algorithm. Each row of the table corresponds to one distance update. The first columnshows the index i such that the new distance is a distance di(u, v). The secondand third column show the vertex u and v, respectively. Finally, the fourth and fifthcolumn should contain the old distance (di−1(u, v)) and the new distance (di(u, v)), respectively.Fill the table in the order in which the updates occur, i.e., increase i and foreach each assume that the algorithm updates the distances in the (lexicographical) order(1, 2),(1, 3),(1, 4),(1, 5),(1, 6),(2, 1),(2, 2), . . . ,(6, 6).[0:30 h expected time] [6 marks]The context-free grammar (V, T, P, S) with variables V = {S, A, B, C}, terminals T = {a, b}and the productionsS → AB | BC A → BA | aB → CC | b C → AB | agenerates non-empty strings in T∗. Execute the Cocke-Younger-Kasami algorithm forthis grammar on the input s = ababbab. Give a table of all sets V (i, k) computed and aparse tree for s. The table is encoded as in question 1, where {} is the empty set. The orderof variables is S < A < B < C. The parse trees are endoded as strings, obtained from s byinserting brackets, sorted in alphabetic order where a < b < (<). For example, [0:30 h expected time] [8 marks]Submission: Submit in Gradescope.Deadline: Monday, 22 March 2021, 10am.Credits: This piece of summative coursework is worth 10% of your grade.

February 24, 2022 · 3 min · jiezi

关于算法:Anchorfree目标检测综述-Keypointbased篇

 晚期指标检测钻研以anchor-based为主,设定初始anchor,预测anchor的修改值,分为two-stage指标检测与one-stage指标检测,别离以Faster R-CNN和SSD作为代表。起初,有研究者感觉初始anchor的设定对准确率的影响很大,而且很难找到完满的预设anchor,于是开始一直得钻研anchor-free指标检测算法,意在去掉预设anchor的环节,让网络自行学习anchor的地位与形态,在速度和准确率下面都有很不错的体现。anchor-free指标检测算法分为两种,一种是DenseBox为代表的Dense Prediction类型,密集地预测的框的绝对地位,另一种则是以CornerNet为代表的Keypoint-bsaed Detection类型,以检测指标关键点为主。 本文次要列举几种Keypoint-based Detection类型的网络,次要波及以下网络: CornerNetExtremeNetCenterNetCenterNet(Object as Point)CSPCornerNet-LiteRepPointsCentripetalNetSaccadeNetRepPointsV2CPNDetFSAFCornerNet CornerNet将指标检测定义为左上角点和右下角点的检测。网络结构如图1所示,通过卷积网络预测出左上角点和右下角点的热图,而后将两组热图组合输入预测框,彻底去除了anchor box的须要。论文通过试验也表明CornerNet与以后的支流算法有相当的性能,创始了指标检测的新范式。 CornerNet的构造如图4所示,应用hourglass网络作为骨干网络,通过独立的两个预测模块输入两组后果,别离对应左上角点和右下角点,每个预测模块通过corner池化输入用于最终预测的热图、embedding向量和偏移。 ExtremeNet ExtremeNet通过检测指标的四个极点进行指标定位,如图1所示。整体算法基于CornerNet的思维进行改良,应用五张热图别离预测指标的四个极点以及核心区域,将不同热图的极点进行组合,通过组合的几何核心在中心点热图上的值判断组合是否符合要求。另外,ExtremeNet检测的极点可能配合DEXTR网络进行指标宰割信息的预测。 CenterNet CornerNet将目前罕用的anchor-based指标检测转换为keypoint-based指标检测,应用角点对示意每个指标,CornerNet次要关注指标的边界信息,不足对指标外部信息的获取,很容易造成误检,如图1所示。为了解决这个问题,论文提出CenterNet,在角点对的根底上退出核心关键点组成三元组进行检测,既能捕获指标的边界信息也能兼顾指标的外部信息。另外,为了更好地提取特色,论文还提出了center pooling和cascade corner pooling,别离用于更好地提取核心关键点和角点。 CenterNet(Object as Point) CenterNet算法将检测指标视为关键点,先找到指标的中心点,而后回归其尺寸。首先将输出的图片转换成热图,热图中的顶峰点对应指标的核心,将顶峰点的特征向量用于预测指标的高和宽,如图2所示。在推理时,只须要简略的前向计算即可,不须要NMS等后处理操作。比照上一篇同名的CenterNet算法,这个算法更简洁且性能足够弱小,不须要NMS等后处理办法,可能拓展到其它检测工作中。 CSP CSP的网络结构大抵如图1所示,在骨干网络上别离预测指标中心点的地位及其对应的尺寸。这篇文章的整体思维与CenterNet(zhou. etc)基本一致,但不是剽窃,因为是同一个会议上的论文,CenterNet次要钻研惯例的指标检测,而这篇次要钻研人脸检测和行人检测。但CSP依然须要进行NMS的后处理,较CenterNet更逊色一些,但不障碍咱们进行简略地理解,包含学习论文的训练方法以及参数。 CornerNet-Lite CornerNet作为Keypoint-based指标检测算法中的经典办法,尽管有着不错的准确率,但其推理很慢,大概须要1.1s/张。尽管能够简略地放大输出图片的尺寸来减速推理,但这会极大地升高其准确率,性能比YOLOv3要差很多。为此,论文提出了两种轻量级的CornerNet变种:CornerNet-Saccade和CornerNet-Squeeze。 CornerNet-Saccade在可能呈现指标的地位的小区域内进行指标检测,首先通过放大的残缺图片预测attention特色图,取得初步的预测框地位以及尺寸,而后在高分辨率图片上截取以该地位为核心的图片区域进行指标检测。 在CornerNet中,大多数的计算工夫花在骨干网络Hourglass-104的推理。为此,CornerNet-Squeeze联合SqueezeNet和MobileNet来缩小Hourglass-104的复杂度,设计了一个新的轻量级hourglass网络。 RepPoints 经典的bounding box尽管有利于计算,但没有思考指标的形态和姿势,而且从矩形区域失去的特色可能会受背景内容或其它的指标的重大影响,低质量的特色会进一步影响指标检测的性能。为了解决bounding box存在的问题,论文提出了RepPoints这种新型指标示意办法,可能进行更细粒度的定位能力以及更好的分类成果。 RepPoints是一个点集,可能自适应地突围指标并且蕴含部分区域的语义特色。论文基于RepPoints设计了anchor-free指标检测算法RPDet,蕴含两个辨认阶段。因为可变形卷积可采样多个不规则散布的点进行卷积输入,所以可变形卷积非常适宜RepPoints场景,可能依据辨认后果的反馈进行采样点的疏导。 CentripetalNet CornerNet关上了指标检测的新形式,通过检测角点进行指标的定位,在角点的匹配上,减少了额定embedding向量,向量间隔较小的角点即为匹配。而论文认为,这种办法不仅难以训练,而且仅通过物体外表进行预测,不足指标的地位信息。 CentripetalNet的外围在于提出了新的角点匹配形式,额定学习一个向心偏移值,偏移后足够近的角点即为匹配。如图2所示,CentripetalNet蕴含四个模块,别离为: 角点预测模块(Corner Prediction Module):用于产生候选角点,这部分跟CornerNet一样。向心偏移模块(Centripetal Shift Module):预测角点的向心偏移,并依据偏移后果将相近的角点成组。十字星变形卷积(Cross-star Deformable Convolution):针对角点场景的变形卷积,可能高效地加强角点地位的特色。实例宰割分支(Instance Mask Head):相似MaskRCNN减少实例宰割分支,可能晋升指标检测的性能以及减少实例宰割能力。SaccadeNet SaccadeNet的构造如图2所示,首先初步预测指标的核心地位以及角点地位,而后利用四个角点地位以及中心点地位的特色进行回归优化。整体思维相似于two-stage指标检测算法,将第二阶段的预测框精调用的区域特色转化为点特色,在精度和速度上都可圈可点,整体思维非常不错。 RepPointsV2 RepPointsV2的整体思维相似与Mask R-CNN,退出更多的工作来监督指标检测算法的学习,具体的实现办法是在原网络上退出辅助分支(auxiliary side-branches)的模式,有监督地进行学习,辅助分支可能优化两头特色以及进行联结检测。 ...

February 23, 2022 · 1 min · jiezi

关于算法:EECS1720M

EECS1720M – W2021Assignments (Total Weight = 20% of final grade) … in two partsOverall Goal: To design an interactive GUI application in Java AWT/Swing that supportsand dynamically responds to asynchronous inputs & interactions provided by a user.The type of application you decide to make is quite open-ended, however, it should supporta minimum amount of features/functionality. The application could be to:• create a simple game/scene from a game (e.g. create an original game, orextend/modify a classic 2D arcade style game);• create a compositional tool (e.g. an interface that supports thegeneration/manipulation of a simple artwork – i.e. a paint tool/ editing tool or toolthat uses simple inputs to seed algorithmic art)• create a simulator (a tool in which a state can be configured and then used tosimulate some physical scenario – e.g. an educational tool)• create a front end for manipulating some set of data records (e.g. a databasestyle system, a booking/ordering system, a browser of some collection ofobjects/images) - that allows for configuration and storage of a record or multiplerecords, that can be formulated into some visual representation/report.The assignment is broken up into two parts (Assignment 1 & 2). Assignment 1 can bethought of as a progress stage toward Assignment 2, which has the complete interactivesystem.Assignment 1 [10%] à Graphical User Interface/ Concept DesignGoals: To design an integrated set of GUI layouts that will support the completedinteractive application. The GUI should allow for the state of your application tobe configured/set. It should also support basic ActionEvent handling (so that theGUI controls can set/report aspects of the state (i.e. set/write fields to console).Assignment 2 [10%] à Final application (mouse/key support + dynamic content)Goals: To integrate & expand the interaction in your application to include freemouse & key interactions (along with interactions on GUI controls), that drive thepresentation of some form of dynamic visual component. For e.g., an animated orcontrollable moving element(s), or dynamically loaded/displayed set(s) of visualelements within a canvas in your application.Project (ideas) – these are just examplesIDEA #1• Extend “frogger” example from earlier in the class (to make asimple java AWT/Swing program).§ Does not have to be a fully functioning game (just meetdeliverables in previous slide)§ Should have UI elements (could use buttons to move frog frombottom to top of screen)• Could be button(s) in the interface§ Could have static objects that if the frog collides with an obstacle,frog loses a life and returns to start• Losing a life could change state of frog (change graphic/colour)• UI could keep a count of how many times reached the top• UI could keep a count of how many lives left, or time, or position of frogon screen, etc§ Could also create your own simple game (with a simple end goal)that involves moving a character about the stage.Project (ideas) – these are just examplesIDEA #2• Create a basic “paint” program§ Does not have to be a fully functioning (just meet deliverablesin previous slide)§ Should have UI elements (could use buttons to generateshapes on the screen)• Could use a UI element to select a colour for the shape• Shapes could be randomly placed, when hitting button, or could beplaced with a mouse click in the stage window• Buttons/UI control could be used to select type of shape§ Could have a button to delete (undo) last shape createdNeed more Inspiration?Classic Arcade Games[2D is probably better – think older Atari style games - simple]https://www.classicgamesarcad...Puzzle Game Ideas/Inspirationhttps://www.pinterest.ca/artd...Other game ideas:http://inventwithpython.com/b...ideas-for-game-clones-to-code/Other:https://www.dreamincode.net/f...** survey some ideas of phone applications/games à try to make a simplified version ofsome application you use (it does not have to be fully functional, can be a component of)Project (ideas) – these are just examplesIDEA #3• Create a program to create records and add them to a list of somesort§ Does not have to be a fully functioning (just meet deliverables in previousslide)§ Should have UI elements (forms to collect/set properties of an elementyou wish to store in the list)• E.g. creating a record of a person/thing• Have a button to submit (add) the record to the list• Have a control to show a list of elements currently stored• Have a button to output a formatted set of strings to the console (showing allthe elements currently stored)• Use date picker (the element could be a booking of some sort) – e.g. thinkabout booking an air ticket• Use some graphical elements to dress things up a bit§ Could have a button to delete (undo) last element created or to delete aspecific element• E.g. select from a drop down menu ...

February 23, 2022 · 4 min · jiezi

关于算法:机器学习算法系列十八随机森林算法Random-Forest-Algorithm

浏览本文须要的背景知识点:决策树学习算法、一丢丢编程常识 一、引言 后面一节咱们学习了一种简略高效的算法——决策树学习算法(Decision Tree Learning Algorithm),上面来介绍一种基于决策树的集成学习1 算法——随机森林算法2(Random Forest Algorithm)。 二、模型介绍 有一个成语叫集思广益,指的是集中大众的智慧,宽泛排汇无益的意见。在机器学习算法中也有相似的思维,被称为集成学习(Ensemble learning)。 集成学习 集成学习通过训练学习出多个预计器,当须要预测时通过联合器将多个预计器的后果整合起来当作最初的后果输入。 图2-1 图2-1展现了集成学习的根本流程。 集成学习的劣势是晋升了单个预计器的通用性与鲁棒性,比单个预计器领有更好的预测性能。集成学习的另一个特点是能不便的进行并行化操作。 Bagging算法 Bagging算法是一种集成学习算法,其具体步骤为:假如有一个大小为 N 的训练数据集,每次从该数据集中有放回的取选出大小为 M 的子数据集,一共选 K 次,依据这 K 个子数据集,训练学习出 K 个模型。当要预测的时候,应用这 K 个模型进行预测,再通过取平均值或者少数分类的形式,失去最初的预测后果。 图2-2 图2-2展现了Bagging算法取子数据集的办法。 随机森林算法 将多个决策树联合在一起,每次数据集是随机有放回的选出,同时随机选出局部特色作为输出,所以该算法被称为随机森林算法。能够看到随机森林算法是以决策树为预计器的Bagging算法。 图2-3 图2-3展现了随机森林算法的具体流程,其中联合器在分类问题中,抉择少数分类后果作为最初的后果,在回归问题中,对多个回归后果取平均值作为最初的后果。 应用Bagging算法能升高过拟合的状况,从而带来了更好的性能。单个决策树对训练集的噪声十分敏感,但通过Bagging算法升高了训练出的多颗决策树之间关联性,无效缓解了上述问题。 三、算法步骤 假如训练集 T 的大小为 N ,特色数目为 M ,随机森林的大小为 K ,随机森林算法的具体步骤如下: 遍历随机森林的大小 K 次: 从训练集 T 中有放回抽样的形式,取样N 次造成一个新子训练集 D 随机抉择 m 个特色,其中 m < M 应用新的训练集 D 和 m 个特色,学习出一个残缺的决策树失去随机森林 下面算法中 m 的抉择:对于分类问题,能够在每次划分时应用根号M个特色,对于回归问题, 抉择三分之 M 但不少于 5 个特色。 ...

February 23, 2022 · 2 min · jiezi

关于算法:Transformer相关

架构图 留神点第一个点 为什么要用scaled attentionhttps://blog.csdn.net/qq_3743... Q,K的维度越高,QK的内积方差越大。QK的内积方差越大,softmax后,会呈现有的维度靠近1,其余靠近0,的景象,这种状况下,梯度是最低的,靠近0,学习效率低。第二个点 Multi-Head Attention

February 23, 2022 · 1 min · jiezi

关于算法:每周更新-ShowMeBug-正式上线腾讯会议音视频

ShowMeBug 音视频通话接入「腾讯会议」,更多抉择,让你的面试过程稳上加稳! 具体应用教程如下: 在线面试时,面试官发动音视频通话时能够抉择“腾讯会议”,应用前单方提前装置好腾讯会议哦~ 第一次应用时,页面会跳转到腾讯会议登录界面,进行利用受权。受权后腾讯会议就创立胜利了,点击“进入会议”就能够进入会议中。第二次应用开始,就不会有登录受权的步骤,间接联动跳转到会议中,十分便捷。 登录腾讯会议 点击“开明”获取利用受权 点击【退出会议】进入腾讯会议面试间 而后就能够在腾讯会议内应用ShowMeBug 面试间啦~ 应用过程中有一些舒适提醒: 若您不小心敞开了面试界面。能够在腾讯会议下方菜单中点击【利用】找到ShowMeBug 利用从新进入本场面试;面试过程中倡议放弃录制性能,不便前期在「面试列表」中查看面试回放;「完结会议」后,面试官可从新回到网页端治理面试后果并完结面试。如果您须要邀请多位面试官进入面试间,请应用ShowMeBug 的【邀请面试官】性能邀请。 面试官胜利发动腾讯会议后,候选人会间接收到退出会议的揭示,点击【立刻退出】即可进入会议。不必通过“会议号”或“腾讯会议链接”邀请退出。 此性能以后为灰度状态,如果你想体验,请增加下方微信预约开明哦~ 更多文章技术分享 | 如何让上千容器同时"存活"ShowMeBug 荣获稀土掘金「2021年度人气技术团队」【重磅】兼顾好用与高颜值,ShowMeBug UI2.0 重磅上线技术招聘人的2021,都在这一张图里

February 22, 2022 · 1 min · jiezi

关于算法:滑动窗口法寻找最长子序列

滑动窗口法就是在一直地调整子序列地起始地位与终止地位,从而得出咱们想要的后果。滑动窗口法的起始与终止节点的挪动的目标即为求解子序列的最优化解决,其根本的思路如下: 定义双指针,初始值统一,双指针之间的内容为所谓的窗口,包含双指针所指的元素。确定指针之间的最佳窗口内容的判断条件,即窗口内容扩充、放大的条件。优先挪动终止节点,扩充窗口直至恰好满足判断条件,再挪动起始节点一次放大窗口再次判断是否符合条件,合乎,此时为一次所求解的子序列,记录所需参数,继续移动起始节点,不合乎,起始节点不动,挪动终止节点至恰好符合条件反复第三、第四点,至终止节点达到数组最初一位。输入所需参数外面最为要害的就是节点的挪动,怎么挪动!什么时候挪动!都是须要依据题目理论状况进行考量。 如果,采取暴力做法采取双层 for 循环形式一直循环寻找符合条件的子序列,工夫复杂度为 O(n^2^) ,而如果采纳滑动窗口法将减低至 O(n) ,执行效率大大提高。 LeetCode 题目链接:长度最小的数组 题目形容给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 间断子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例:示例 1:输出:target = 7, nums = [2,3,1,2,4,3]输入:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。 示例 2:输出:target = 4, nums = [1,4,4]输入:1 示例 3:输出:target = 11, nums = [1,1,1,1,1,1,1,1]输入:0 提醒: 1 <= target <= 1091 <= nums.length <= 1051 <= nums[i] <= 105题目剖析题目简略剖析一下,就是获取合乎序列内数字之和不小于目标值的最小子序列的长度。思路根本如下: 初始化双指针为 0放大、扩充判断条件确定为 sum >= target利用 for 循环开始右移终止指针,直至合乎终止节点到数组最初一位应用 while 循环实现起始指针的一直右移操作,一旦符合条件记录此时长度并与已有记录值比拟,取最小值输入长度记录值class Solution { // 滑动窗口 public int minSubArrayLen(int s, int[] nums) { int left = 0; int sum = 0; int result = Integer.MAX_VALUE; for (int right = 0; right < nums.length; right++) { sum += nums[right]; while (sum >= s) { result = Math.min(result, right - left + 1); sum -= nums[left++]; } } return result == Integer.MAX_VALUE ? 0 : result; }}注: ...

February 21, 2022 · 1 min · jiezi

关于算法:快慢指针法

快慢指针法指的就是操作数组、链表及字符串等应用两个终点雷同但前提高数不同的指针。绝对于利用屡次循环解决问题,快慢指针法的工夫复杂度较低,执行效率高。对于快慢指针法依据题目可供调整的无非就为两点: 终点前提高数快慢指针法终点地位的抉择通常是采取一个 if else 语句进行判断,而在未达到正确终点地位时,两个指针的前提高数将保持一致。而实现快慢指针前提高数不统一挪动的办法通常是采取一个 for 循环进行挪动指针,留神越界问题。此处 for 循环迭代有两种计划: 既能够设置快慢指针的步数统一,再在 if 判断胜利后进行调整步数,也能够仅仅设置快指针的迭代,再 if 里设置慢指针的迭代,判断失败则慢指针不后退,从而实现两者步数调整在对于根本的快慢指针的框架有所认知之后,即前置双指针的值统一,再应用一个 for 循环在未达到正确终点地位前进行快慢指针的同时挪动且为雷同步数,在达到正确终点时,将快指针的前提高数调整为大于慢指针即可,咱们未来对于一道简略的 LeetCode 题目进行练习。 数组元素移除题目链接:27.移除元素 题目形容给你一个数组 nums 和一个值 val,你须要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要应用额定的数组空间,你必须仅应用 O(1) 额定空间并 原地 批改输出数组。 元素的程序能够扭转。你不须要思考数组中超出新长度前面的元素。 阐明:为什么返回数值是整数,但输入的答案是数组呢? 请留神,输出数组是以「援用」形式传递的,这意味着在函数里批改输出数组对于调用者是可见的。 你能够设想外部操作如下: // nums 是以“援用”形式传递的。也就是说,不对实参作任何拷贝int len = removeElement(nums, val);// 在函数里批改输出数组对于调用者是可见的。// 依据你的函数返回的长度, 它会打印出数组中 该长度范畴内 的所有元素。for (int i = 0; i < len; i++) { print(nums[i]);}示例 :示例一输出:nums = [3,2,2,3], val = 3 输入:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不须要思考数组中超出新长度前面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。示例 二:输出:nums = [0,1,2,2,3,0,4,2], val = 2 ...

February 21, 2022 · 1 min · jiezi

关于算法:排序算法的简单认识

在进行很多便捷算法之前总是要实现对象的有序化,而这就将应用到排序相干的算法,即便目前诸多高级语言未然实现对于排序算法的封装,用户只需导入对应库文件即可调用排序算法实现排序,无需手写排序算法,但具体的排序算法的抉择就必须对于排序算法有所意识。本文就将介绍两个简略的排序算法:抉择排序与冒泡排序。 抉择排序为什么称为抉择排序?该算法每次都是对于未排序的关键字进行比拟,抉择出最小或最大的关键字,再对其替换地位,实现一次排序,需进行屡次比拟。 抉择排序法是一种不稳固的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,寄存在序列的起始地位,而后,再从残余未排序元素中持续寻找最小(大)元素,而后放到已排序序列的开端。以此类推,直到全副待排序的数据元素排完。抉择排序是一种简略直观的排序算法,无论什么数据进去都是 O(n²) 的工夫复杂度。所以用到它的时候,数据规模越小越好。在复杂度剖析上,它最大的特点就是替换挪动数据的次数较少,无需占用较大的内存空间。 算法代码实现假如存在一个长度为 n 的数组,须要进行抉择排序,每次下标变量设为 i ,即 1<=i<=n 。算法实现的基本思路是将数组进行 n-1 次关键字的比拟,即对于数组下标对应值的比拟,记录下标存进 min 或 max ,最初将其关键字与第 i 个关键字进行替换,实现一次抉择。 抉择排序根本存在两层 for 循环嵌套,最外层循环是为了保障 n-1 次排序,第二层 for 循环是为了在每一次排序的过程中寻找最值的下标,并且防止死循环,内层循环将从 i+1 开始进行比拟。它们对于循环的判断条件区别如下: 外层循环:从零开始且小于数组长度减一,迭代语句为迭代标记加一内层循环:从 i+1 开始小于数组长度,迭代语句为迭代标记加一内层循环中的抉择语句是以后迭代标记对应的数组元素与记录以后残余局部最值下标的对应数组元素的比拟,按排序要求抉择大小关系,进入抉择语句,将最值下标赋给记录变量。 排序程序次要看你的下标记录值的状况,在每一次比拟中,下标记录较大值,为降序排序,下标记录较小值,为升序排序,上面将展现升序排序代码实现。 public class SelectionSort implements IArraySort { @Override public int[] sort(int[] sourceArray) throws Exception { int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); // 总共要通过 N-1 轮比拟 for (int i = 0; i < arr.length - 1; i++) { int min = i; // 每轮须要比拟的次数 N-i for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[min]) { // 记录目前能找到的最小值元素的下标 min = j; } } // 将找到的最小值和i地位所在的值进行替换 if (i != min) { int tmp = arr[i]; arr[i] = arr[min]; arr[min] = tmp; } } return arr; }}与抉择排序同属根底排序算法的还有冒泡排序,它也是基于比拟与替换实现对于对象的排序的算法,思路非常简略。开始介绍吧! ...

February 21, 2022 · 2 min · jiezi

关于算法:KMP-算法快速匹配字符字串

KMP 算法次要是在肯定长度的字符串中疾速匹配出所需的指标字符串,也称模式字串,最大特点就是考究一个快字。 个别是实用于字符串进行比对或者匹配的场景之下,根本概括为在字符串不匹配,需进行下一次匹配时,利用已知的已匹配的字符串(文本内容)防止从头开始匹配带来的节约。 如果是暴力解决的话,步骤如下: 定义头指针以及字符指针,别离指向定长字符串最左端、模式字符串最左端顺次对字符进行比拟,发现不匹配字符,回溯指针到指针开始匹配的下一位反复第二步,直至找到对应字符串,即模式字符串使用暴力解法,效率低下的次要起因即是指针回溯的地位不失当,反复匹配操作。 前置概念最长公共前后缀所谓前缀、后缀的区别,简略就是说以某结点区域为宰割,前一部分(不蕴含最初一个字符)就为前缀,后一(不蕴含匹配失败的局部以及第一个字符)局部为后缀。 在了解最长公共前后缀之前,得分明公共前后缀的概念。公共前后缀简略阐明,可认为是模式字符串的前某局部字符与后某字符两头局部为结点宰割的区域。 最长公共前后缀就是在公共前后缀的根底上,寻找最长的局部(即便可能等于其自身,也不取其为最长,无奈进行挪动,故选其自身少一位为最长),即便是没有结点宰割区域也可。 示例图的公共前后缀为 ABAB ,而非 ABABA 前缀表前缀表就是保留前缀局部的长度信息及其模式字符串的对应字符地位,以便产生不匹配状况之时,通过对前缀表的内容,可能给出从新开始匹配字符串的地位信息,简略说就是匹配失败,回退字符串,从新开始。 该表中长度代表公共前后缀长度,next 代表下一次匹配时,模式字符串开始的地位,为下标值。此处咱们能够晓得其公共前后缀长度与 next 的值统一。 当然,对于 next 数组的值也有多种认识,有时候会将模式字符串的下标从零开始,即整体向右移一位,在制作 next 数组时,合乎通常思维,第几位对应下标值为几。 实现 KMP 算法须要进行已匹配字符串的区域切割,保障不做反复的操作,而这就与前缀表的应用不可拆散。 算法思路简略 KMP 算法思路定义头指针以及字符指针,别离指向定长字符串最左端、模式字符串最左端开始对字符顺次匹配,直至匹配失败的字符地位进行对已匹配的模式字符串寻找最长公共前后缀字符串若不能找到,间接挪动字符指针到模式字符串最左端,从新开始匹配若能找到,将公共前后缀中的前缀局部后移到后缀局部,此时,字符指针就从本来指向后缀局部下一位指向前缀局部下一位模式字符串长度长于残余字符串的长度,匹配失败,否则从第二、三步持续开始匹配最初,找到字符或者匹配失败如下即为无最长前后缀的状况 利用 next 表优化先对模式字串进行每个字符的最长公共前缀长度进行计算并进行解决,再存进对应数组,即为 next 数组定义指针,开始匹配当遇到不匹配时,读取以后字符的 next 数组对应值,作为字符指针的起始地位,从新从第二步开始直至匹配胜利,或模式字符串长度长于残余字符长度,即匹配失败算法代码结构 next 数组初始化 定义两个指针。 此时,起始默认前后缀为模式字符串第一个字符,长度为 1 ,第一个指针 frist 指向前缀最初一个元素,即 length - 1 初始化为 0,可知前缀为 [0,first) ;第二个指针 last 指向后缀最初一个元素,初始化为 1 即为 length,可知后缀为 ( first,last]。frist 指针在完结之时指向的地位即为 next 数组的对应值初始化 next 数组长度为模式字符串的长度减一,再初始化 next[0] = 0;解决前后缀不同的状况 ...

February 21, 2022 · 2 min · jiezi

关于算法:论文分享-Yann-LeCun-联合发布工程师都在读的自监督学习论文

文章导读本期文章中,咱们为大家带来了 3 篇自监督学习的相干论文,其中两篇是由卷积网络之父 Yann LeCun 参加公布。对于大型机器视觉训练任务而言,自监督学习 (Self-supervised learning,简称 SSL) 与有监督办法的成果越来越难分伯仲。 其中,自监督学习是指利用辅助工作 (pretext),从大规模的无监督数据中,开掘本身的监督信息来进步学习表征的品质,通过这种结构监督信息对网络进行训练,从而学习对上游工作有价值的表征。 本文将围绕自监督学习,分享 3 篇论文,以期进步大家对自监督学习的意识和了解。 Barlow Twins:基于冗余缩小的 SSL题目: Barlow Twins: Self-Supervised Learning via Redundancy Reduction 作者: Jure Zbontar, Li Jing, Ishan Misra, Yann LeCun, Stephane Deny 对于自监督学习办法而言,一个十分受用的办法就是学习嵌入向量 (embedding), 因为它不受输出样本失真的影响。 然而这种办法也存在一个无奈防止的问题:trivial constant solution。目前大多数办法都试图通过在实现细节上下功夫,来躲避 trivial constant solution 的呈现。 本篇论文中,作者提出了一个指标函数,通过测量两个雷同网络的输入(应用失真样本)之间的互相关矩阵,使其尽可能地靠近单位矩阵 (identity matrix), 从而防止解体 (collapse) 的产生。 这使得样本(失真)的嵌入向量变得类似,同时也会使这些向量组件 (component) 之间的冗余起码。该办法被称为 Barlow Twins。Barlow Twins 原理示意图 Barlow Twins 无需 large batches,也不须要 network twins 之间具备不对称性(如 pradictor network、gradient stopping 等),这得益于十分高维的输入向量。 ...

February 21, 2022 · 2 min · jiezi

关于算法:RelationNet基于Transformer融合多种检测目标的表示方式-NeurIPS-2020

论文提出了基于注意力的BVR模块,可能交融预测框、中心点和角点三种指标示意形式,并且可能无缝地嵌入到各种指标检测算法中,带来不错的收益 起源:晓飞的算法工程笔记 公众号论文: RelationNet++: Bridging Visual Representations for Object Detection via Transformer Decoder 论文地址:https://arxiv.org/abs/2010.15831论文代码:https://github.com/microsoft/RelationNet2Introduction 指标检测算法有很多种指标示意办法,如图b所示,有基于矩形框的也有基于关键点的。不同的示意办法使得检测算法在不同的方面体现更优,比方矩形框能更好的对齐标注信息,中心点更利于小指标辨认,角点则可能更精密地定位。论文探讨是否将多种示意形式交融到单框架中,最终提出了基于注意力的解码模块BVR(bridging visual representations),该模块与Transformer的注意力机制相似,通过加权其它指标特色来加强以后指标特色,可能交融不同示意形式的异构特色。 以BVR嵌入anchor-based办法为例,如图a所示,示意形式acnhor作为$query$,其它示意形式中心点和角点作为$key$,计算$query$和$key$间关联性权重,基于权重整合$key$的特色来加强$query$的特色。针对指标检测的场景,论文对权重计算进行了减速,别离为key sampling和shared location embedding,用于缩小$key$的数量以及权重计算量。除了嵌入到anchor-based办法外,BVR也可嵌入到多种形式的指标检测算法中。 论文的奉献如下: 提出通用模块BVR,可交融不同指标示意形式的异构特色,以in-place的形式嵌入到各种检测框架,不毁坏本来的检测过程。提出BVR模块的减速办法,key sampling和shared location embedding。经测试,在ReinaNet、Faster R-CNN、FCOS和ATSS四个检测器上有显著的晋升。Bridging Visual Representations 应用不同示意形式的检测算法有不同的检测流程,如图2所示,BVR注意力模块以算法本来的示意形式为主特色,退出其它示意形式作为辅助特色。将主特色$query$和辅助特色$key$作为输出,注意力模块依据关联性加权辅助特色来加强主特色: $f^q_i$,$f^{'q}_i$,$g^q_i$为第$i$个$query$实例的输出特色,输入特色和几何向量,$f^k_j$,$g^k_j$为第$j$个$key$实例的输出特色和几何向量,$T_v(\cdot)$为线性变动,$S(\cdot)$为$i$和$j$实例间的关联性计算: $S^A(f^q_i, f^k_j)$为外观特色类似度,计算方法为scaled dot product。$S^G(g^q_i, g^k_j)$为几何地位相干的项,先将绝对的几何向量进行cosine/sine地位embedding,再通过两层MLP计算关联度。因为不同示意形式的几何向量(4-d预测框与2-d点)不同,需从4-d预测框提取对应的2-d点(核心或角点),这样两种不同示意形式的几何向量就对齐了。 在实现时,BVR模块采纳了相似multi-head attention的机制,head数量默认为8,即公式1的+号前面改为Concate多个关联特色的计算,每个关联特色的维度为输出特色的1/8。 BVR for RetinaNet 以RetinaNet为例,RetinaNet在特色图的每个地位设置9个anchor,共有$9\times H\times W$个预测框,BVR模块将$C\times 9\times H\times W$特色图作为输出($C$为特色图维度),生成雷同大小的加强特色。如图a所示,BVR应用中心点和角点作为辅助的$key$特色,关键点通过轻量级的Point Head网络预测,而后抉择大量的点输出到注意力模块中加强分类特色和回归特色。 Auxiliary (key) representation learning Point Head网络蕴含两层共享的$3\times 3$卷积,而后接两个独立的子网($3\times 3$卷积+sigmoid),预测特色图中每个地位为中心点(或角点)的概率及其相应的偏移值。如果网络蕴含FPN,则将所有GT的中心点和角点赋予各层进行训练,不需依据GT大小指定层,这样可能获取更多的正样本,放慢训练。 ...

February 21, 2022 · 1 min · jiezi

关于算法:leetcode算法1两数之和

哈喽!大家好,我是【学无止境小奇】,一位酷爱分享各种技术的博主! ⭐【学无止境小奇】的创作主旨:每一条命令都亲自执行过,每一行代码都理论运行过,每一种办法都实在实际过,每一篇文章都良心制作过。✊✊✊ ⭐【学无止境小奇】的博客中所有波及命令、代码的中央,除了提供图片供大家参考,另外会在图片下方提供一份纯文本格式的命令或者代码不便大家粘贴复制间接执行命令或者运行代码。 ⭐如果你对技术有着浓重的趣味,欢送关注【学无止境小奇】,欢送大家和我一起交换。 ❤️❤️❤️感激各位朋友接下来的浏览❤️❤️❤️ 文章目录一、leetcode算法1、两数之和1.1、题目1.2、思路1.3、答案一、leetcode算法1、两数之和1.1、题目给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你能够假如每种输出只会对应一个答案。然而,数组中同一个元素在答案里不能反复呈现。你能够按任意程序返回答案。 1.2、思路这里最简略的是能够用双层for循环来解决问题,然而双层for循环的工夫复杂度为n^2,所以这样解决工夫复杂度太高,这时咱们能够将数据放入一个map中来解决复杂度高的问题。. 1.3、答案 class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> hashmap = new HashMap<Integer,Integer>(); for(int i = 0; i < nums.length; i++){ if(hashmap.containsKey(nums[i])){ return new int[]{hashmap.get(nums[i]), i}; } hashmap.put(target - nums[i], i); } return null;}}

February 21, 2022 · 1 min · jiezi

关于算法:2124检查是否所有-A-都在-B-之前-算法leetode附思维导图-全部解法300题

零 题目:算法(leetode,附思维导图 + 全副解法)300题之(2124)查看是否所有 A 都在 B 之前一 题目形容 二 解法总览(思维导图) 三 全副解法1 计划11)代码: // 计划1 “排序、比照法”。// 思路:// 1)将 s 按字母升序排列,失去字符串 sSort 。// 2)返回后果 sSort === s 。var checkString = function(s) { // 1)将 s 按字母升序排列,失去字符串 sSort 。 const sSort = s.split('').sort((a, b) => a.localeCompare(b)).join(''); // 2)返回后果 sSort === s 。 return sSort === s;};2 计划21)代码: // 计划2 “双指针法”。// 思路:// 1)状态初始化,left = 0, right = l - 1, resBool = true 。// 2)当 left < right 时,下标 left、right 一直往两头靠。// 2.1)若 leftVal(即 s[left]) 等于 'a',则 下标left 往后走。// 2.2)若 rightVal(即 s[right]) 等于 'b',则 下标right 往前走。// 2.3)若 leftVal 不等于 'a' 且 rightVal 不等于 'b',则 resBool 置为 false,退出 while 循环。// 3)返回后果 resBool 。var checkString = function(s) { // 1)状态初始化,left = 0, right = l - 1, resBool = true 。 const l = s.length; let left = 0, right = l - 1, resBool = true; // 2)当 left < right 时,下标 left、right 一直往两头走。 while (left < right) { const leftVal = s[left], rightVal = s[right]; // 2.1)若 leftVal(即 s[left]) 等于 'a',则 下标left 往后走。 if (leftVal === 'a') { left++; } // 2.2)若 rightVal(即 s[right]) 等于 'b',则 下标right 往前走。 if (rightVal === 'b') { right--; } // 2.3)若 leftVal 不等于 'a' 且 rightVal 不等于 'b',则 resBool 置为 false,退出 while 循环。 if (leftVal !== 'a' && rightVal !== 'b') { resBool = false; break; } } // 3)返回后果 resBool 。 return resBool;}3 计划31)代码: ...

February 20, 2022 · 2 min · jiezi

关于算法:2125银行中的激光束数量-算法leetode附思维导图-全部解法300题

零 题目:算法(leetode,附思维导图 + 全副解法)300题之(2125)银行中的激光束数量一 题目形容 二 解法总览(思维导图) 三 全副解法1 计划11)代码: // 计划1 “间接计数 - 模拟法”。// 思路:// 1)状态初始化:map寄存每一层寄存 安全设备 的状况。// 2)外围1:遍历 bank 的每一层。// 2.1)遍历以后层的每一列。// 2.1.1)若 i层的j列 为 安全设备,则 通过map、对 相应的值进行 +1 操作。// 3)外围2:2层遍历。// 3.1)若 以后i、j 层均存在安全设备 且 介于(i, j)层 均无安全设备,// 则 resCount += (map.get(i) * map.get(j)) 。// 4)返回后果 resCount 。var numberOfBeams = function(bank) { // isValid办法:介于 top、bottom 均没有安全设备,阐明是 “非法的”。 const isValid = (top, bottom, map) => { let resBool = true; for (let i = top + 1; i < bottom; i++) { if (map.get(i)) { resBool = false; break; } } return resBool; }; // 1)状态初始化:map寄存每一层寄存 安全设备 的状况。 const l = bank.length; let map = new Map(), resCount = 0; // 2)外围1:遍历 bank 的每一层。 for (let i = 0; i < l; i++) { const tempStr = bank[i], tempStrLength = tempStr.length; // 2.1)遍历以后层的每一列。 for (let j = 0; j < tempStrLength; j++) { // 2.1.1)若 i层的j列 为 安全设备,则 通过map、对 相应的值进行 +1 操作。 if (tempStr[j] === '1') { if (map.has(i)) { map.set(i, map.get(i) + 1); } else { map.set(i, 1); } } } } // 3)外围2:2层遍历。 for (let i = 0; i < l; i++) { for (let j = i + 1; j < l; j++) { // 3.1)若 以后i、j 层均存在安全设备 且 介于(i, j)层 均无安全设备, // 则 resCount += (map.get(i) * map.get(j)) 。 if (map.get(i) && map.get(j) && isValid(i, j, map)) { resCount += (map.get(i) * map.get(j)); } } } // 4)返回后果 resCount 。 return resCount;};2 计划21)代码: ...

February 19, 2022 · 3 min · jiezi

关于算法:百年奥运的瞬即美学凌空之美分秒凝结-阿里云视频云AI编辑部云智剪

奥运赛事每天都在演出冰雪奇观,而捕获产生霎时,凝固最精彩、最动人的体育人文画面,让“冰之舞”、“雪之舞”、“速度之美”、“凌空之美”如盛宴般绽开,让“金牌时刻”与“国将风采”变成永恒回荡时空。而实现这所有的,源自阿里云视频云AI编辑部提供的云上智能生产能力——AI云智剪。 如果说,2022冬奥开幕式是一场中国对世界讲述的故事,开展的是中国式的浪漫,那冬奥会的霎时之美,更像是记录历史的青川木牍,开展的是人物和故事的不凡之巅。 北京冬奥已靠近序幕,各项赛事全面而展,冰雪奇观每日演出。此次冬奥赛事,中国代表团首次实现7个大项15个分项“全我的项目参赛”,其中35项是首次站上冬奥舞台,如此之多的赛事内容也为奥运的视频生产提供了丰盛素材。 为了在冬奥赛事短视频内容时兼顾实效、精彩、人文、美学,央视体育新媒体和总台技术团队联结阿里云视频云、阿里巴巴达摩院,引入AI编辑部的智能生产工具“AI云智剪”,能够实时实现多赛事的智能内容了解,在极短时间内智能化主动生成大量精彩视频素材,笼罩赛场动作、赛事内容、各类镜头等多个形容维度,生成美学主题的集锦素材。 自由式滑雪男子大跳台,单板滑雪女子大跳台、花样滑冰中,中国选手苏翊鸣、谷爱凌、金博洋、隋文静/韩聪等均表现出色,无论是金牌,还是对自我的冲破,其传递的冬奥精力在这个冬日里如烈火般鼓舞人心。 AI云智剪在较量实现的第一工夫就对视频内容进行了多维度解析,实现了精彩素材生成,同时基于跨视频集锦生产能力,第一工夫为观众生产主题集锦视频,截至目前曾经自动化解决200+场较量,生产素材片段达3万段以上,生成的大量主题式视频在央视体育新媒体上即时出现,迅速流传。 在体育赛事内容流传上,AI云智剪能够高效、疾速、全面地为冬奥赛事播报提供弱小的生产力,疾速抢占公布先机,也为寰球赛事观众带来及时而优质的赛事体感,同时也为媒体行业深度开发体育媒体版权内容价值,发明了更多可能性。 针对奥运赛事内容,AI云智剪设定了丰盛的美学主题智能模板,如针对冰球、花滑、速滑、短道速滑等,设置主题“冰之舞”,针对单板滑雪和自在滑雪,打造主题“雪之舞”,同时,从速度型赛事的非凡视角,如花滑的旋转、冰球的进球等,出现“速度之美”,而对于跳跃性动作丰盛的滑雪赛事,塑造“凌空之美”,堪称通过智能化视频云技术,全面捕获赛事瞬即间的美学光影。 科技冬奥的新内容生产力AI与机器学习在体育媒体视频生产畛域的利用是产业的大势所趋,随着数字化媒体的高速演进以及受众媒体内容生产习惯的继续更迭,碎片化的短视频内容曾经成为各内容生产畛域的支流,体育媒体内容畛域也不例外。 此次冬奥会更是以科技冬奥为宗旨,AI在其中的作用至关重要,基于AI编辑部,其云上智能生产能力“AI云智剪”在赛事内容生产中施展了微小价值,已俨然成为科技冬奥新内容的生产力。 以较量自身为外围,AI云智剪通过对赛事内容的精彩信息进行定义、提取,从较量视频、解说词音频、人物场记等各个维度进行辨认与剖析,并利用多模态交融技术,从实现简单场景下的特色集锦成果。AI云智剪能够对体育赛事视频进行高效的AI内容分析,能够实时生成多种类型的集锦内容,除了精彩动作镜头、运动员集锦等单赛事中的重要片段以外,还反对国将风采、凌空之美、小将出征等多种简单主题类型的集锦视频生产,实现视频内容解析、多类型视频素材生产、跨视频的简单主题视频生成的多层级短视频生产能力笼罩。 AI云智剪依附阿里云视频云弱小的流媒体解决能力,能够保障每场较量的精彩集锦,在3-5分钟内生成,再由平台疾速公布进来,极大晋升了媒体抢占先机的能力和公众尽享冬奥赛事的体感。图1 AI云智剪流程图 如上图所示,AI云智剪的智能生产过程,次要蕴含两个步骤: 第一,AI模型要对赛事视频进行了解,基于在AI畛域的长期积攒,AI云智剪能够对多种体育赛事进行细粒度行为、赛场事件、人文事件、镜头类型的深度了解,同时对视频片段进行美学评估、动作精彩度评估、多样性评估,这等同于整个零碎的眼睛和大脑,只有看得多、看得细、想得全、想得快,才能够在强烈的冬奥赛场上,为观众们尽快出现精美绝伦的内容。第二,基于AI模型输入的各类型片段和多指标评估,素材生产模块会基于合乎权重进行素材选取,生产大量精选素材,同时也输入多种主题集锦素材。 同时,为了响应绿色冬奥的主题,AI云智剪首次采纳了单视频了解模型,对多赛事、多起源、多品种的视频进行内容解析、多类型视频素材生产、跨视频的简单主题视频生成的多层级短视频生产。该视频了解模型有三点突出的内容价值: • 能够对横跨自由式滑雪、花样滑冰、单板滑雪、冰球、速度滑冰、短道速滑等多个赛事中的泛滥细粒度动作进行辨认,捕获精彩霎时; • 能够对赛事视频中的非竞技动作进行辨认,感知观众的欢呼、选手的情绪、颁奖夺金等关键时刻; • 能够对镜头类型进行辨别,进行多类型素材的智能化组合。 将实现如此多重简单的工作重任放在一个模型里,这也对AI云智剪的AI模型泛化能力带来微小的挑战。 冬奥云上新内容背地的新算法通过AI云智剪出现新内容,冬奥的云上智能生产使用了全新的智能算法技术。从实质逻辑上,AI云智剪是基于智能算法模型,对视频赛事进行解构、解析、评分,最终再基于多样性策略,以及AI模型输入的多样性评分进行智能化的视频素材生成。 正是依靠前沿技术,AI模型能够在较少的计算资源需要下,实现多赛事、多起源、多品种的视频进行内容解析、集锦素材生产。 协同阿里云视频云的技术输入,阿里巴巴达摩院的算法工程师采纳了阿里巴巴最新研发的预训练模型技术LOOK(该技术曾经被人工智能畛域顶级会议ICLR 2022录用)。相比于常见的训练形式要求所有的同类别样本特色靠近于一个核心特色,LOOK能够在模型训练过程中仅要求靠近的同类样本更加靠近,保留更多的特色自由度。 能够认为,这是从一个“求同去异”到“求同存异”的过程改良,正因为在训练过程保留了更多的无效信息,也使得模型特色的示意能力更加通用,最终基于这一个通用表征的根底模型,构建了多个轻量级的多分枝任务模型,去实现多项工作。 因为共享了同一个根底示意模型,在计算耗费上多个工作分枝比单个工作分支减少的额定计算累赘简直能够忽略不计,但却能够和间接应用多个模型达到同样的AI能力。 正是基于这一技术,AI云智剪更快更高更强地撑持起冬奥会的短视频生产工作。图2 预训练模型技术LOOK示意图 在应用预训练模型技术以外,因为此次冬奥会视频数据是模型“从未见过”的数据,为了保障模型的鲁棒性和计算结果的稳定性,阿里巴巴最新研发的开集辨认技术NGC(已被计算机视觉顶级会议 ICCV 2021 录用为口头报告)也被引入其中。AI模型会同时利用模型预测的置信度和特色的几何构造,来独特决定最终后果,这也使得AI云智剪尽管是第一次在冬奥会上退场,但也是相当的“稳”。图3 开集辨认算法NGC示意图 此外,阿里巴巴达摩院在视频了解畛域积攒了大量技术,包含根底模型表征,时序特色建模、自监督示意等,通过阿里云视频云AI云智剪的能力输入,均在这次冬奥会中展露头脚,也被开源在EssentialMC2技术框架(https://github.com/alibaba/Es...)中,以此致力于推动视频内容了解畛域社区的技术倒退。 屡次发明顶级赛事新视听早在2018年世界杯期间,阿里云视频云AI编辑部就聚焦于利用“视频AI+云剪辑+媒资治理”的技术,实时生产精彩集锦和球星集锦,满足球迷们的重温赛事和追星的需要。 在2018年世界杯上, CCTV5采纳了阿里云视频云AI编辑部的视频AI技术,实现对第一脚传球检测、回放检测、危险射门检测、犯规检测、静止轨迹剖析及防御节奏剖析等,用AI技术代替了宏大简单的高清现场制作设施,高效实时地产出赛事集锦,让精彩不容错过。 通过四年的技术锻炼和产品打磨,AI编辑部已陆续反对足球、篮球、冰壶、花样滑冰、短道速滑、滑雪等多种赛事的特色集锦和主题生产,帮忙用户无效进步视频的生产效率,让内容更疾速、更精彩,也更有柔美之感。 冬奥赛事靠近序幕,AI编辑部的视频AI技术在本次奥运会中胜利落地,这是赛事利用的又一里程碑,也是视频AI利用于体育行业及更多其余行业的广大开始。经验了对百年奥运如此大型赛事的技术保障,阿里云视频云能更成熟、稳固地应答赛事场景下的视频剖析与解决,AI技术也将渗透到各个行业中,帮忙行业客户高效晋升新内容的生产效率,让每场赛事都领有全然不同的新视听体验,也让赛事的人文美感由此绽开。 【AI编辑部】作为阿里云视频云的智能媒体生产产品,AI编辑部是智能时代内容生产行业的基础设施,是可本地化交付的端到端产品。AI编辑部交付面向新媒体的智能化内容生产流水线,借助大数据技术和人工智能,实现视频稿件、图文稿件的自动化、批量化、智能化生产,从而更快、更好、更广地为抢占新媒体市场服务。 【AI云智剪】 作为AI编辑部面向体育赛事主题集锦的智能生产能力,AI云智剪可能在赛事直播过程中实时生产素材,为精彩赛事提供优质高效的短视频内容生产技术。 阿里云视频云多媒体AI体验核心 「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实际技术文章,在这里与音视频畛域一流工程师交换切磋。公众号后盾回复【技术】可退出阿里云视频云产品技术交换群,和业内大咖一起探讨音视频技术,获取更多行业最新信息。

February 18, 2022 · 1 min · jiezi

关于算法:直播预告|一线专家邀你共话数据科学赋能多元应用场景价值

▌本期流动背景21世纪的数据就像18世纪的石油,是一笔微小的、尚未开发的宝贵财富。随着产业数字化转型浪潮迭起,各行各业都须要建设与本身商业模式适配的AI大脑,以实现智慧商业、智能决策。而数据迷信则是AI大脑组成中的重要一环,影响着商业化利用价值的高下。以后,机器学习技术已在大量的是理论场景中落地利用,本期将邀请到来自亚马逊、蚂蚁金服/谷歌开发者社区以及MobTech袤博科技等多位技术专家聚焦机器学习技术赋能多元利用场景价值的话题,探讨数据迷信如何拓宽产业边界。 ▌本期议程⏰工夫:3月3日(周四)20:00 —21:30报名形式:扫描上方海报蓝色二维码参加报名 20:00—20:25《MLOps、TFX pipelines 及大规模机器学习的利用》 江骏| 蚂蚁团体高级技术专家、谷歌开发者机器学习专家介绍MLOps概念,以及Google、TensorFlo在这方面生产级别的端到端计划,如何让大规模机器学习服务搜寻举荐、科学研究等畛域。帮忙听众从中受到启发,为本人的企业或是我的项目架设机器学习平台,并在业务中失去使用。 20:25—20:50《借助业务数据疾速构建个性化举荐引擎》 王宇博| Amazon Head of Developer Relations GCR始终以来,对于举荐零碎的需要能够说无处不在,从电商购物、新闻浏览、音视频到在线利用的举荐。当初,开发者可能应用基于亚马逊电商技术的举荐服务,疾速开启个性化举荐之旅,以普惠AI助力实现商业价值。 20:50—21:15《机器学习赋能商业地产决策进阶——商场客流和职住地剖析》 叶秋| MobTech袤博科技资深数据挖掘工程师随着疫情逐步消退和经济增长驱动转向国内生产,线下生产迎来了新一轮的增长风潮。商场商圈作为线下生产的重要组成部分引起了宽泛关注,商场的开发和经营成为了地产开发商关注的外围议题。在这其中,客流决定着商场的根本盘,而职住地的散布状况又间接影响着主力客群的消费水平和频次。因而,如何精确且疾速得理解客流及职住地散布是商场经营决策中的重要一环。MobTech通过丰盛的数据成绩积攒、多维规定及前沿算法剖析解决,精准得出客流和职住地散布,全方位赋能商业地产决策进阶 21:15—21:30 学习迷你Talk:将来数据迷信赋能商业利用场景的洼地在哪儿? 王宇博、江骏 ▌直播福利1、胜利举荐5位技术共事/敌人报名直播,即有机会获取技术书籍一本;2、胜利举荐10位技术共事/敌人报名直播,即有机会获取极客背包一个; ▌流动Tips:1、扫码填写根本信息提交报名表单,主办方将在24小时内进行审核2、审核胜利后,您会在流动前通过短信、邮件、公众号等渠道收取报名胜利告诉及直播链接3、增加小助手入挪动端技术交换群,学习抽奖两不误! ▌Coder Park直播为加强开发者间的技术交换,促成企业间的技术和业务单干,MobTech袤博科技联动各知名企业、社区平台、技术协会、优良技术专家等,独特打造一档线上技术直播分享栏目【Coder Park】。 第一季联动华为、中国信通院、阿里等出名平台10位+讲师,围绕大数据平台架构、数据安全、挪动开发等方向开展精彩分享,播种近50000+参会者关注,,踊跃推动业内交换和技术布道。 ▌第二季介绍【Coder Park】第二季将聚焦数据智能畛域,联动中国信通院、亚马逊、快手等一线企业,以及谷歌开发者社区、掘金、开源中国、火山引擎开发者社区、TechParty等社区组织单干,围绕数据迷信算法、数据治理、数据中台以及数据存储等技术畛域开展主题分享,帮忙更多企业疾速推动数字化转型过程。第二季嘉宾阵容与合作伙伴全新降级,更多精彩内容和礼品惊喜等你来摸索。 ▌【Coder Park】往期精彩回顾流动预报|【Coder Park】MobTech携手阿里聚焦大数据架构流动预报|【Coder Park】MobTech携手谷歌阿里技术专家共话挪动端新风向流动预报| MobTech携手中国信通院共话数据安全架构实际流动预报|【Coder Park】国内一线技术专家带你走进机器学习算法实际

February 18, 2022 · 1 min · jiezi

关于算法:ECE-92039023分析

ECE 9203/9023 – Random Signals, Adaptive and Kalman FilteringMidterm, March 5, 2021.NOTE: This is an open book, time-limited, take home exam. You are expected to solve this on your own, withoutoutside help. Anyone caught communicating with others during the exam, through internet or otherwise, willautomatically fail the course and will be reported to the Associate Dean Graduate, Western Engineering, forsuspension from the program.HONOUR PLEDGE: I will neither give aid to nor receive aid from others on this assessment.Name: _ ...

February 17, 2022 · 2 min · jiezi

关于算法:机器学习算法系列十七决策树学习算法Decision-Tree-Learning-Algorithm

浏览本文须要的背景知识点:一丢丢编程常识 一、引言 在生活中,每次到饭点时都会在心里默念——“等下吃啥?”,可能明天工作的一天了不想走远了,这时咱们会决定餐厅的间隔不能超过两百米,再看看本人钱包里的二十块钱,决定吃的货色不能超过二十,最初点了份兰州拉面。从下面的例子中能够看到,咱们明天吃兰州拉面都是由后面一系列的决策所决定的。 <center>图1-1</center> 如图1-1所示,将下面的决策过程用一颗二叉树来示意,这个树就被称为决策树(Decision Tree)。在机器学习中,同样能够通过数据集训练出如图1-1所示的决策树模型,这种算法被称为决策树学习算法(Decision Tree Learning)1 。 二、模型介绍模型 决策树学习算法(Decision Tree Learning),首先必定是一个树状构造,由外部结点与叶子结点组成,外部结点示意一个维度(特色),叶子结点示意一个分类。结点与结点之间通过肯定的条件相连接,所以决策树又能够看成一堆if...else...规定的汇合。 <center>图2-1</center> 如图2-1所示,其展现了一颗根本的决策树数据结构与其蕴含的决策办法。 特征选择 既然要做决策,须要决定的就是从哪个维度(特色)来做决策,例如后面例子中的店铺间隔、钱包零钱数等。在机器学习中咱们须要一个量化的指标来确定应用的特色更加适合,即应用该特色划分后,失去的子集合的“纯度”更高。这时引入三种指标——信息增益(Information Gain)、基尼指数(Gini Index)、均方差(MSE)来解决后面说的问题。 信息增益(Information Gain) 式2-1是一种示意样本集纯度的指标,被称为信息熵(Information Entropy),其中 D 示意样本集, K 示意样本集分类数,p_k 示意第 k 类样本在样本集所占比例。Ent(D) 的值越小,样本集的纯度越高。 $$\operatorname{Ent}(D)=-\sum_{k=1}^{K} p_{k} \log _{2} p_{k}$$ <center>式2-1</center> 式2-2示意用一个离散属性划分后对样本集的影响,被称为信息增益(Information Gain),其中 D 示意样本集,a 示意离散属性,V 示意离散属性 a 所有可能取值的数量,D^v 示意样本集中第 v 种取值的子样本集。 $$\operatorname{Gain}(D, a)=\operatorname{Ent}(D)-\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \operatorname{Ent}\left(D^{v}\right)$$ <center>式2-2</center> 当属性是间断属性时,其可取值不像离散属性那样是无限的,这时能够将间断属性在样本集中的值排序后俩俩取平均值作为划分点,改写一下式2-2,失去如式2-3的后果,其中 T_a 示意平均值汇合,D_t^v 示意子集合,当 v = - 时示意样本中小于均值 t 的样本子集,当 v = + 时示意样本中大于均值t的样本子集,取划分点中最大的信息增益作为该属性的信息增益值。 ...

February 16, 2022 · 8 min · jiezi

关于算法:CISC-260-Machine

CISC 260 Machine Organization and Assembly Language(Spring 2021)Assignment # 2(Due: March 10, 2021) [25 points] Given the following truth table, where X, Y, and Z are input and W isoutput, write the canonical expression and generate gate-level logical circuit(draw the wire diagram).X Y Z W0 0 10 1 11 0 01 1 00 0 00 1 01 0 11 1 1[25 points] Simply the following Boolean expressions as much as you can.a) Y= BC + ~A~B~C + B~Cb) Y = ~(A+~AB+~A~B) + ~(A+~B)[25 points] You are asked to design a circuit to detect if an overflow occurs whenadding two integers represented in two's complement: Z = X + Y. Let Sz, Sx, andSy be the sign bit for Z, X, and Y respectively, and they are fed as input to thecircuit. Let O be the output bit of the circuit, whose value is 1 if an overflowhappens, and 0 if otherwise.a) Build the truth table for O as a Boolean function of Sx, Sy, and Sz.b) Write the canonical expression (sum-of-product) for the Boolean functiondefined in the part a.c) Implement the Boolean expression defined in part b with a circuit by usingAND, OR, and NOT gates. Draw the wiring diagram.[25 points] Prove that NOR gate is universal, by showing how AND, OR, and NOTgates can be built by wiring a bunch of NOR gates. Draw the wire diagram for eachcase. WX:codehelp

February 16, 2022 · 2 min · jiezi

关于算法:分析COMP122-The-Caesar-Cipher

COMP122 Assessment 1 Due 2021-03-05 at 5pmThe Caesar CipherThe Caesar cipher is an ancient method of encrypting text, i.e. to transform text into a format that isunreadable for anyone without a secret key. It is believed that Julius Caesar actually used such a cipherfor his correspondence. Unfortunately for him, This type of cipher is easily broken using a frequencyanalysis method outlined below. Your assignment is to implement this in Java.Part 1: Encrypting and DecryptingThe Caesar cipher is a “rotation cipher” and operates by translating each letter into the one that isshied along the alphabet by a fixed distance. This distance is called the shi. It is the same for allletters in the alphabet and therefore can be seen as the secret key to encrypt and decrypt: To encryptyour text using a given shi, you translate letters by that many places later in the alphabet. A Caesarcipher with shi 3 can be illustrated as follows.For example, if your text to encrypt is “Meet me at midnight under the bridge” and your shi is 3, theencrypted text is “Phhw ph dw plgqljkw xqghu wkh eulgjh”, as the letter “b” gets translated into an “e”,and “e” gets translated into “h” and so on. We “wrap around” at the end of the alphabet, so that “z”gets changed to a “c” given a shi of 3. We can interpret a negative value for the shi as translatingletters backwards (e.g. an “f” gets encrypted as the letter “b” if the shi is −4).RequirementsIn a file called Caesar.java, implement the following (public static) methods.• a method called rotate that rotates a single character. It should have two arguments: an integer(int) shi and a char to rotate, and return the character rotated by the given shi, as a char.Lower-case characters should be translated into lower-case characters, capitalised ones intocapitalised ones, and all other characters should remain untouched.1COMP122 Assessment 1 Due 2021-03-05 at 5pm• another method called rotate that rotates a whole string. It should have two arguments: aninteger (int) shi and a String to rotate and return the string rotated by the given shi, as aString.• a main method, that allows to encode/decode text, as follows. This should interpret the first twoThe first argument is interpreted as an integer shi and the second one as a (string) message tobe rotated. The only output printed by the program should be the rotated string output.Moreover, the main method should check if it was called with exactly two arguments and complainotherwise. See below for example outputs. Your program needs to print the exact sameoutput to be considered correct.$> java Caesar 3 "The ships hung in the sky in much the same way that bricks don't."Wkh vklsv kxqj lq wkh vnb lq pxfk wkh vdph zdb wkdw eulfnv grq'w.$> java Caesar -13 "The ships hung in the sky in much the same way that bricks don't."Gur fuvcf uhat va gur fxl va zhpu gur fnzr jnl gung oevpxf qba'g$> java Caesar 13 The ships hung in the sky in much the same way that bricks don't.Too many parameters!Usage: java Caesar n "cipher text"$> java Caesar 13Too few parameters!Usage: java Caesar n "cipher text"Part 2: Cracking the Caesar cipher.Suppose we are given a cipher text, i.e. text that has already been encrypted with some (unknown)shi, and we want to determine the original unencrypted text (typically referred to as the plaintext).To reconstruct the original text we could decode with each of the 26 possible shis, and take the resultthat looks “closest” to an English sentence.How do we measure “closeness”? This is where letter frequencies and a small statistical trick comes in.First of all, we know how oen each letter occurs on average in English text. For instance, “e” is themost common letter, then “t”, and so on. To decode our cipher text, we can compute the frequenciesof each letter as they appear in the text. To measure how “close” these are to the known English letterfrequencies, we use the 2-score (that is the Greek letter “chi”, so it’s the “chi-squared score”). Thisscore is defined as2 =Xz=a(freq − English)2Englishwhere freq denotes the frequency of a letter (the number of occurrences divided by the total number2COMP122 Assessment 1 Due 2021-03-05 at 5pmof letters in the text), and Englishis the corresponding English letter frequency. In other words, wesum the fraction over all 26 possible letters to determine this score, which is a single number.The 2score will be lower when the frequencies are closer to English. Note that when we do this, weare ignoring the case of letters (we want to treat upper and lower case equally for our purposes).You are provided with a file called Brutus.java, which already defines letter frequencies in Englishtexts. This is given as array of doubles, in alphabetical order:1 public static final double[] english = {2 0.0855, 0.0160, 0.0316, 0.0387, 0.1210, 0.0218, 0.0209, 0.0496, 0.0733,3 0.0022, 0.0081, 0.0421, 0.0253, 0.0717, 0.0747, 0.0207, 0.0010, 0.0633,4 0.0673, 0.0894, 0.0268, 0.0106, 0.0183, 0.0019, 0.0172, 0.00115 };Accordingly, the frequency of the letter “a”, the probability that a randomly chosen letter in an Englishtext is an “a”, is Englisha = 0.0855 and can be accessed as english[0]. Similarly, Englishb = 0.0160and so on.RequirementsIn Brutus.java, write• a method called count that takes a single String parameter and returns a length-26 integerarray whose values reflect how oen each character occurred. You should not make a dierencebetween upper and lower case letters and the returned array should be in alphabetical order.This way, if letterCounts is an array resulting from your method then letterCounts[25] isthe number of times the letter “z” or “Z” occurs.• a method called frequency that takes a single String and returns a length-26 array of doubles whose values correspond, in alphabetical order, to the frequency of the letter. This way, ifletterFreq is an array resulting from this method then letterFreq[24] is the number oftimes the letter “x” or “X” occurs, divided by the length of the string input.• a method called chiSquared, which returns the 2-score (a double) for two given sets offrequencies. That is, it should take two parameters, both of type double[], and return a singledouble value that tells us how close these two arrays are. You may assume that the two inputsare always of length 26.• a main method that can be used to decipher Caesar-encoded English cryptotext without thekey. Of course, you should be using your chiSquared method as well as the given English letterfrequencies.3COMP122 Assessment 1 Due 2021-03-05 at 5pmThe string that is to be deciphered should be read from the first command line argument andyour program should ensure that it gets exactly this one argument and complain otherwise.Sample output below.$> java Brutus "Vg vf n zvfgnxr gb guvax lbh pna fbyir nal znwbe ceboyrzf whfg jvgucbgngbrf."It is a mistake to think you can solve any major problems just with potatoes.$> java BrutusToo few parameters!Usage: java Brutus "cipher text"$> java Brutus Too Many ParametersToo many parameters!Usage: java Brutus "cipher text"Hints and Comments ...

February 16, 2022 · 8 min · jiezi

关于算法:欧拉函数求小于等于n且与n互质的数的个数

求小于等于n且与n互质的数的个数互质穷举法互质:两个数互质代表两者最大公约数为1最大公约数求法:辗转相除法,最小公倍数:较大值除以最大公约数乘以较小值辗转相除法: 较大的数a取模较小的数b,得取模值c若取模值等于0 则最大公约数为取模值,否则持续下一步a与c再次取模,回到第二步 //求最大公约数gcd以及最大公倍数lcm // 36 24 36/24 // 24 12 24/12 // 0 完结最大公约数为12 // 求最小公倍数 // lcm(a, b) = (a * b)/gcd(a, b) public static int gcd(int a, int b){ //a>=b //辗转相除法 if (b==0){ return a; } return gcd(b,a%b); }穷举到n,一一判断该数与n的最大公约数是否为1,即是否为互质论断:能够实现,但工夫复杂度太高 采取欧拉函数进行求取在数论,对正整数n,欧拉函数是小于等于n的正整数中与n互质的数的数目. n为正整数n,p1、p­­­­2 ……pn 为正整数n的质因数 n的质因数:既是n的因数,又是质数的数 计算方法: $$\phi (n) = n \times (\frac{p_1-1}{p_1})\times (\frac{p_2-1}{p_2})\cdots\times (\frac{p_n-1}{p_n})$$ 例: $$\phi (10) = 10 \times \frac{1}{2}\times \frac{4}{5} = 4$$ 质数的求法:因数只有1和其自身 单个质数n的判断 顺次判断2到 的数被n取模的值是否等于零,存在任意一个即不为质数 ...

February 15, 2022 · 1 min · jiezi

关于算法:面向B端算法实时业务支撑的工程实践

简介:在营销场景下,算法同学会对广告主提供个性化的营销工具,帮忙广告主更好的精细化营销,在可控老本内实现更好的ROI晋升。咱们在这一段时间反对了多个实时业务场景,比方出价策略的实时化预估、关键词批量服务同步、实时特色等场景,理解到业务侧同学来说,针对ODPS场景来说大部分能够灵便应用,但对于Blink应用还有有余,咱们这里针对场景积攒了一些教训,心愿对大家有一些帮忙。 作者 | 茂道起源 | 阿里技术公众号 一 背景在营销场景下,算法同学会对广告主提供个性化的营销工具,帮忙广告主更好的精细化营销,在可控老本内实现更好的ROI晋升。咱们在这一段时间反对了多个实时业务场景,比方出价策略的实时化预估、关键词批量服务同步、实时特色等场景,理解到业务侧同学来说,针对ODPS场景来说大部分能够灵便应用,但对于Blink应用还有有余,咱们这里针对场景积攒了一些教训,心愿对大家有一些帮忙。 二 技术选型为什么要抉择Blink?大部分离线场景如果对于时效性没有要求,或者数据源是Batch模式的,非Streaming的(比方TT、SLS、SWIFT、程序)等,这个场景的话抉择ODPS就比拟不错;总体来说,数据源是实时的(如TT/SLS/SWIFT)、须要程序读取ODPS、对时效性要求高的场景,抉择Blink是比拟好的。 Blink目前也是反对Batch模式和Steaming模式。Batch模式是指有固定的起始工夫和完结工夫, 相比ODPS而来,他最大的劣势是提前申请资源,可是独占的,这样能够保障时效性;Streaming模式就是传统意义上的实时生产,可实现毫秒级的解决。 从开发模式上看,次要分为Data Stream模式,相似于ODPS MR;第二种是SQL模式;从易用性角度看,SQL无疑是应用老本最低的;但对于简单场景,Data Stream的掌控能力也是最好的,可灵便定义各类cache和数据结构,以及同时反对多类场景。 三 次要场景1 实时replay出价策略评估业务背景 Replay零碎是一套集线上竞价日志收集、结构化、后续解决的模拟系统。该零碎记录了直通车线上引擎在召回之后的竞价信息,次要涵盖了线上的召回、出价、打分等队列信息。联合排序以及扣费公式,能够利用该日志实现对线上竞价环境的模仿。简略来说,就是能够评估bidword上如果过后采纳其余的出价,会带来什么样的后果。通过replay零碎,算法团队和广告主能够在线上AB测试之前,利用离线流量预估用户策略批改之后带来的成果,这样能够尽可能地缩小策略的批改带给线上的影响,让后果变得更加可控。同时在进行负向策略测试的过程中,能够尽可能地缩小对大盘的收益影响。 算法团队心愿基于在线精排召回日志实现业务侧多种出价策略评估,回放1天内采样日志(10亿数据),在出价策略上评估,并反对ad的实时下线,防止下线ad对出价策略有影响,并且预期心愿10亿数据量在1-2个小时内跑完。 次要挑战 1千万物料数据如何加载;高qps(100万)下线ad的实时同步;业务侧解耦,整个实时job链路如何实现和业务解耦解决方案 物料数据加载:间接在blink启动时加载所有数据,防止高qps状况下,对igraph拜访造成压力;另外采纳播送模式,仅一次加载,每个节点都能够应用,防止屡次加载odps数据;下线的ad信息采纳分桶的形式存入到IGraph中,并周期性cache形式全量读取全量下线ad,将查问的200W+qps管制在1w左右,并应用RateLimit限流组件管制拜访并发,把IGraph并发管制限度在40万左右,实现整体流量平滑;整体实时工程框架,预留UDF接口,让业务侧仅实现SDK即可,其余工程性能、并发、限流、埋点等逻辑外部实现即可,反对工程框架和算法策略Replay解耦。 总结基于此业务需要,咱们基于blink streaming Batch模式的灵便能力,实现了对tt数据固定开始和完结工夫的数据处理。积淀了读写tt组件 ,ODPS组件,iGraph组件和埋点组件 ,这些积淀的组件很好地反对了后续类似业务的作业开发,同时组件作为之后作业产品化提供了根底能力。 2 实时特色业务背景 随着B端算法倒退,模型降级带来的增量红利越来越少,须要思考从客户实时信息方面进一步捕获用户用意,更全面、更实时的开掘潜在需要,从B端视角进一步晋升增长空间,基于线上用户行为日志产出用户行为实时特色,算法团队应用实时数据改良线上模型。 基于此需要咱们产出一条用户实时特色产出链路,通过解析上游A+数据源获取用户实时特色,实时特色次要蕴含以下几种: 获取用户近50条特色数据值,并产出到igraph中。输入具备某种特色的用户id,并依照分钟工夫聚合输入某种特色近1小时的和、均值或者数目 次要挑战 实时特色数据开发数量十分多,对于每个特色数据都须要开发实时数据链路、保护,开发成本、运维老本较高,反复造轮子; 特色数据开发要求开发者理解: 数据源头,会基于事实数据源进行ETL解决;计算引擎,flink sql保护了一套本人的计算语义,须要学习理解并依据场景纯熟应用;存储引擎,实时数据开发好须要落地能力服务,故须要关系存储引擎选型,例如igraph、hbase、hologres等;查问优化办法,不同存储引擎都有本人的查问客户端、应用及优化办法,故要学习不同引擎应用办法。解决方案 从产品设计角度,设计一套实时平台能力,让开发实时特色跟在odps开发离线表一样简略。产品劣势是让用户只须要懂SQL就能够开发实时特色: 不须要理解实时数据源不须要理解底层存储引擎只用sql就能够查问实时特色数据,不须要学习不同引擎查询方法整个实时开发产品联动极光平台、dolphin引擎、blink引擎和存储引擎,把整个流程串联买通,给用户提供端到端的开发体验,无需感知跟本人工作无关的技术细节。 相干平台介绍: Dolphin智能减速剖析引擎:Dolphin智能减速剖析引擎源自阿里妈妈数据营销平台达摩盘(DMP)场景,在通用OLAP MPP计算框架的根底上,针对营销场景的典型计算(标签圈人,洞察剖析)等,进行了大量存储、索引和计算算子级别的性能优化,实现了在计算性能,存储老本,稳定性等各个方面的大幅度的晋升。Dolphin自身定位是减速引擎,数据存储和计算算子依赖于底层的odps, hologres等引擎。通过插件模式,在hologres中,实现了算子集成和底层数据存储和索引的优化,实现了特定计算场景计算性能和撑持业务规模的数量级的晋升。目前Dolphin的外围计算能力次要包含:基数计算内核,近似计算内核,向量计算内核,SQL后果物化及跨DB拜访等。Dolphin同时实现了一套SQL转译和优化能力,主动将原始用户输出SQL,转化成底层优化的存储格局和计算算子。用户应用,不须要关怀底层数据存储和计算模式,只须要依照原始数据表拼写SQL,极大的晋升了用户应用的便利性。 极光消费者经营平台:极光是面向营销减速场景的一站式研发平台,通过平台产品化的形式,能够让特色引擎能力更好赋能用户。极光反对的特色场景蕴含超大规模标签交并差(百亿级标签圈选毫秒级产出)、人群洞察(上千亿规模秒级查问)、秒级成果归因(事件剖析、归因剖析)、实时和百万级人群定向等能力。极光在营销数据引擎的根底上提供了一站式的运维管控、数据治理以及自助接入等能力,让用户应用更加便捷;极光积淀了搜推广罕用的数据引擎模板,蕴含基数计算模板、报表模板、归因模板、人群洞察模板、向量计算模板、近似计算模板、实时投放模板等,基于成熟的业务模板,让用户能够零老本、无代码的应用。 依据目前的业务需要,封装了实时数据源和存储数据源应用举例: --- 注册输出表create table if not exists source_table_name( user_id String comment '', click String comment '', item_id String comment '', behavior_time String comment '') with ( bizType='tt', topic='topic', pk='user_id', timeColumn='behavior_time');---- 创立输出表create table if not exists output_table_name ( user_id STRING click STRING) with ( bizType='feature', pk='user_id');实现实时特色算子: ...

February 15, 2022 · 1 min · jiezi

关于算法:ICSI213IECE213-Data-Structures

COLLEGE OF ENGINEERING AND APPLIED SCIENCESDEPARTMENT OF COMPUTER SCIENCEICSI213/IECE213 Data StructuresClick here for the project discussion recording.Table of ContentsPart I: General project information ……………………………………………………………………………………… 02Part II: Project grading rubric……………………………………………………………………………………………….. 03Part III: Examples on how to complete a project from start to finish …………………………………… 04Part IV: A. How to test a software design? …………………………………………………………………………….06 B. Project description ……………………………………………………………………………………………… 072Part I: General Project Information• All projects are individual projects unless it is notified otherwise.• All projects must be submitted via Blackboard. No late projects or e-mail submissions or hard copieswill be accepted.• Two submission attempts will be allowed on Blackboard. Only the last attempt will be graded.• Work will be rejected with no credit if The project is late. The project is not submitted properly (wrong files, not in required format, etc.). For example,o The submitted file can’t be opened.o The submitted work is empty or wrong work.o Other issues. The project is a copy or partial copy of others' work (such as work from another person or theInternet).• Students must turn in their original work. Any cheating violation will be reported to the college.Students can help others by sharing ideas, but not by allowing others to copy their work.• Documents to be submitted as a zipped file:o UML class diagram(s) – created with Violet UML or StarUMLo Java source file(s) with Javadoc style inline commentso Supporting files if any (For example, files containing all testing data.)• Students are required to submit a design, all error-free source files with Javadoc style inline comments,and supporting files. Lack of any of the required items will result in a really low credit or no credit.• Your TA will grade, and then post the feedback and the grade on Blackboard if you have submitted itproperly and on time. If you have any questions regarding the feedback or the grade, please reach outto the TA first. You may also contact the instructor for this matter.3Part II: Project grading rubricComponents Max pointsUML Design (See an example in part II.) Max. 10 pointsJavadoc Inline comments (See an example in part II.) Max. 10 pointsThe rest of the project Max. 40 pointsAll projects will be evaluated based upon the following software development activities.Analysis:• Does the software meet the exact specification / customer requirements?• Does the software solve the exact problem?Design:• Is the design efficient?Code:• Are there errors?• Are code conventions followed?• Does the software use the minimum computer resource (computer memory and processingtime)?• Is the software reusable?• Are comments completely written in Javadoc format?a. Class Javadoc comments must be included before a class header.b. Method Javadoc comments must be included before a method header.c. More inline comments (in either single line format or block format) must be includedinside each method body.d. All comments must be completed in correct format such as tags, indentation etc.Debug/Testing:• Are there bugs in the software?Documentation:• Complete all documents that are required. 4Part III: Examples on complete a project from start to finishTo complete a project, the following steps of a software development cycle should be followed. These stepsare not pure linear but overlapped. Analysis-design-code-test/debug-documentation.1) Read project description to understand all specifications(Analysis).2) Create a design (an algorithm for method or a UML class diagram for a class) (Design)3) Create Java programs that are translations of the design. (Code/Implementation)4) Test and debug, and (test/debug)5) Complete all required documentation. (Documentation)The following shows a sample design. The corresponding source codes with inline Javadoc comments areincluded on next page. How to test/debug a software is included on the following pages. 5import java.util.Random;/** ...

February 14, 2022 · 11 min · jiezi

关于算法:COMP124-Computer-Systems

University of LiverpoolDepartment of Computer ScienceCOMP124 – Computer SystemsCoursework 1 – Assembly Language ProgrammingDeadline: Thursday 18th March at 17:00Weighting: 15%Follow the instructions at the end of this document to submit your work. Penalties for late work will beapplied in accordance with the Code of Practice on Assessment. The standard department markingdescriptors apply to this assessment.OverviewThe purpose of this assessment is to test your ability to write efficient assembly language code anddescribe clearly how it works. Write a small assembly language program that…• Asks the user how many numbers they would like to enter• Loops for the given number of times• Prompts the user to input a number each time round the loop• Displays a summary of how many positive, negative and zero numbers were enteredYour assembly code will be inside an _asm block within a C program, with variables declared using Csyntax, as shown during the lab tasks. Create a new Visual Studio project from your existing template. Thescreenshot below shows the expected output of the program.All the aspects of the program have been covered in the lab tasks, so your program will be based on codethat you’ve already written. In particular, you will use code to output strings, input integers, test orcompare register values, jump according to status flags, and loop according to a counter register. Youshould try to make your code as optimal and efficient as possible.Useful HintThis program will require a slightly more complex set of tests and jumps than the lab examples, becauseyou are testing for three possible values (positive, negative, and zero). Write an initial version that detectsonly positive and negative numbers, because this will be easier. Submit this version if you can’t work outhow to detect zero values. You will still be able to obtain a passing mark for this assessment. A higher markwill be awarded if your code can detect all three input possibilities.Code Comments & StructureUse the C style comment notation (comments start with //) or the assembly language comment notation(comments start with ;) to place useful explanations within the code. However, do not write lengthycomments that get in the way of readability. Include your student ID as a comment at the top of yourcode.Assembly language doesn’t make much use of indentation, but you should still make sure your code is easyto understand, including correct placement of any code labels. The C code containing your _asm blockshould be properly indented.Short ReportYou should also write a short report that describes how you implemented the loop, comparisons andjumps, and any optimisations you made. This should be just a couple of paragraphs at most. Do notprovide excessive detail. If you encountered any problems (for example if your program doesn’t work),write about that and show what you were trying to do. Include your student ID at the top of your report.Show that you tested your program with a variety of input, so include a screenshot of your programrunning within the console window. Paste this into your report so it’s all in one document.Marking BreakdownYour work will be marked according to the following criteria.Report: 15% – Clarity, succinctness and understandabilityTesting: 10% – Evidence of testing with a range of inputsStyle: 10% – Overall layout, presentation and structure of the codeProgramming: 65% – Correctness and efficiency of the codeHow to SubmitLocate the Visual Studio project folder in your file system and navigate to the source file. It will have a .cppextension. Refer back to the very first lab sheet for guidance on this. Copy this to another location so youdon’t corrupt your project, then change its name so it contains your username and student ID. Save yourreport as a PDF document with the same name. For example, if your username is sgnabog and yourstudent ID is 201355426, your files should be named:• sgnabog_201355426.cpp• sgnabog_201355426.pdfSubmit just these two files via the assessment page on Canvas. Please don’t submit any other documents.We can only mark your work if we can easily locate and open the files. Please do not submit the entireVisual Studio project. ...

February 12, 2022 · 4 min · jiezi

关于算法:Elec4621-Lab2

Elec4621 Lab2, T1 2021This is the first assessable lab. You are required to submit your reportor lab notes by the due date and time set on Moodle.The file “SN d tot V2.0” under the link “Sun Spot Data” contains historicalobservations of the number of sunspots since the year 1818. The firstfive columns are (the last three columns can be ignored): YearMonthDayDecimal year (that is with the month and day counted as fractions ofa year)Number of sunspots.Note that an entry of -1 in the number of sunspots indicates that theobservation was not made and data is therefore not available.The file is in csv format, which you can load into Matlab so that eachcolumn becomes an array variable. You can seek help (either on the internetor from the demonstrators) on how to do that.In what follows, unless otherwise stated, you will be ignoring the -1entries.Load the csv file into Matlab, saving the data in the fourth and fifthcolumns into variables ’t’ and ’x’ respectively.Plot the sunspot data versus time (that is x vs t), properly labellingthe axes. Record your observations.What is the sampling period of the data?1Take the “appropriate” Fourier Transform of the data and plot themagnitude spectrum. What do you observe? What significant frequencymodes are there and what are their corresponding periods.We would like to check the variations of the modes over time. Breakthe data into a number of blocks (each spanning at least 40 years).Take the FT of each block. Plot the corresponding amplitude spectraand compare them. What do you obvserve.Discuss your results in light of what is known in the literature aboutsunspot activity (that is look up available information from the literatureon sunspot activity and compare your results to them).

February 11, 2022 · 2 min · jiezi

关于算法:堆排序

在堆排序算法中,应用的是最大堆,最小堆通常用于结构优先队列。堆的数据结构如果咱们应用指针来示意堆有序的二叉树,那么每个元素都须要3个指针来找到它的高低结点(父结点和两个子节点各须要一个)。但如果应用齐全二叉树来示意二叉堆,则只须要数组而不须要指针皆能够示意。具体方法就是将二叉树的结点依照层级程序放入数组中,根结点在地位1[不应用数组的第一个地位0]。则结点k的父结点为k/2,两个子结点地位为k*2、k*2+1。 高级实现数组实现(无序)insert和栈的push()操作统一;del须要增加一段相似于抉择排序的内循环找到最大元素并删除数组实现(有序)insert须要将所有较大元素向右挪动以使数组放弃有序;del和栈的pop()操作统一上述两种高级计划中,插入元素和删除最大元素这两个操作之一在最坏状况下须要线性工夫来实现。应用无序序列是解决问题的惰性办法,仅在必要的时候才会采取行动(找到最大元素);应用有序序列则是解决问题的踊跃办法,因为会尽可能防患未然(在插入元素时就放弃列表有序),使后序操作更高效。 堆的有序化上浮:如果堆的有序状态因为某个结点变得比它的父结点更大而突破,那么就须要通过替换它和它的父结点来修复堆。 void swim(int nums[], int k, int n) { while (k > 1 && nums[k / 2] < nums[k]) { swap(nums[k / 2], nums[k]); k = k / 2; }}下沉:如果堆的有序状态因为某个结点变得比它的两个子结点或是其中之一更小了而被突破了,那么就须要通过将它和它的两个子结点中的较大者替换来修复堆。 void sink(int nums[], int k, int n) { while (k * 2 <= n) { int j = k * 2; if (j < n && nums[j] < nums[j + 1]) j++; if (!(nums[k] < nums[j])) break; swap(nums[k], nums[j]); k = j; }}构建堆堆排序之前首先须要将N个元素的数组结构一个堆。当然能够在O(NlogN)工夫内,从左至右遍历数组,用swim()保障左侧的元素曾经堆有序。更高效的方法是从右至左用sink()办法结构子堆。因为当用数组示意存储n个元素的堆时,叶结点下标别离是n/2 + 1, n/2 + 2, ... , n。每个叶结点都能够看成是只蕴含一个元素的堆。故这部分曾经堆有序,咱们只须要从n/2开始往前遍历一半元素,调用sink(),直到下标1即可。工夫复杂度为O(NlogN)。 ...

February 11, 2022 · 1 min · jiezi

关于算法:YOLO-V3

原文地址:https://zhuanlan.zhihu.com/p/... YOLO V3网络架构backbone:Darknet-53 网络结构解析: Yolov3中,只有卷积层,通过调节卷积步长管制输入特色图的尺寸。所以对于输出图片尺寸没有特地限度。流程图中,输出图片以256*256作为样例。Yolov3借鉴了金字塔特色图思维,小尺寸特色图用于检测大尺寸物体,而大尺寸特色图检测小尺寸物体。特色图的输入维度为 NxNx[3x(4+1+80)], NxN 为输入特色图格点数,一共3个Anchor框,每个框有4维预测框数值 tx,ty,tw,th ,1维预测框置信度,80维物体类别数。所以第一层特色图的输入维度为 8x8x255 。Yolov3总共输入3个特色图,第一个特色图下采样32倍,第二个特色图下采样16倍,第三个下采样8倍。输出图像通过Darknet-53(无全连贯层),再通过Yoloblock生成的特色图被当作两用,第一用为通过33卷积层、11卷积之后生成特色图一,第二用为通过1*1卷积层加上采样层,与Darnet-53网络的中间层输入后果进行拼接,产生特色图二。同样的循环之后产生特色图三。concat操作与加和操作的区别:加和操作来源于ResNet思维,将输出的特色图,与输入特色图对应维度进行相加,即 y=f(x)+x;而concat操作源于DenseNet网络的设计思路,将特色图依照通道维度间接进行拼接,例如8816的特色图与8816的特色图拼接后生成8832的特色图。上采样层(upsample):作用是将小尺寸特色图通过插值等办法,生成大尺寸图像。例如应用最近邻插值算法,将88的图像变换为1616。上采样层不扭转特色图的通道数。Yolo的整个网络,汲取了Resnet、Densenet、FPN的精华,能够说是交融了指标检测以后业界最无效的全副技巧。Loss函数 \( \lambda \)为权重常数,管制检测框Loss、obj置信度Loss、noobj置信度Loss之间的比例,通常负例的个数是正例的几十倍以上,能够通过权重超参管制检测成果。\( 1^{obj}_{ij} \)若是正例则输入1,否则为0; \( 1^{obj}_{ij} \) 若是负例则输入1,否则为0;疏忽样例都输入0。x、y、w、h应用MSE作为损失函数,也能够应用smooth L1 loss(出自Faster R-CNN)作为损失函数。smooth L1能够使训练更加平滑。置信度、类别标签因为是0,1二分类,所以应用穿插熵作为损失函数。

February 9, 2022 · 1 min · jiezi

关于算法:机器学习算法系列十六非线性支持向量机算法NonLinear-Support-Vector-Machine

浏览本文须要的背景知识点:线性反对向量机、一丢丢编程常识 一、引言 后面咱们用两节介绍了两种反对向量机模型——硬距离反对向量机、软距离反对向量机,这两种模型能够统称为线性反对向量机,上面来介绍另一种反对向量机模型——非线性反对向量机1 (Non-Linear Support Vector Machine)。 二、模型介绍 在介绍非线性反对向量机之前,让咱们来看如下的线性不可分的数据集: <center>图2-1 </center> 图2-1中别离用圆和叉来代表不同的标签分类,很显著该数据集无奈通过一条直线正确分类,然而如图2-2所示,该数据集能够被一条椭圆曲线正确的分类。 <center>图2-2</center> 然而想要求解如图2-2中的椭圆曲线这种非线性分类的问题,相对来说难度较大。既然线性分类问题绝对容易求解,那么该数据是否通过肯定的非线性变动转化为一个线性分类的数据呢,答案是能够的。 <center>图2-3</center> 如图2-3所示,将数据集进行非线性转换(Z = X * X),这时能够看到转换后的数据能够通过一条直线正确分类,原来图2-2中的椭圆曲线变换成了图2-3中的直线,原来非线性分类问题变换成了线性分类问题。 原始模型 先来回顾一下后面软距离反对向量机的原始模型: $$\begin{array}{c}\underset{w, b, \xi}{\min} \frac{1}{2} w^{T} w+C \sum_{i=1}^{N} \xi_{i} \\\text { s.t. } \quad C>0 \quad \xi_{i} \geq 0 \quad \xi_{i} \geq 1-y_{i}\left(w^{T} x_{i}+b\right) \quad i=1,2, \cdots, N\end{array}$$ <center>式2-1</center> 假如存在一个 函数能对 x 进行变换,例如下面例子中的将 x 映射成 z,带入下面的软距离反对向量机的原始模型中得: $$\begin{array}{c}\underset{w, b, \xi}{\min} \frac{1}{2} w^{T} w+C \sum_{i=1}^{N} \xi_{i} \\\text { s.t. } \quad C>0 \quad \xi_{i} \geq 0 \quad \xi_{i} \geq 1-y_{i}\left(w^{T} \phi(x_{i})+b\right) \quad i=1,2, \cdots, N\end{array}$$ ...

February 7, 2022 · 7 min · jiezi

关于算法:机器学习算法系列十五软间隔支持向量机算法Softmargin-Support-Vector-Machine

浏览本文须要的背景知识点:硬距离反对向量机、松弛变量、一丢丢编程常识 一、引言 后面一节咱们介绍了一种最根底的反对向量机模型——硬距离反对向量机,该模型能对线性可分的数据集进行分类,但事实中的数据集往往是线性不可分的,那么这一节咱们来介绍反对向量机中的第二种——软距离反对向量机1(Soft-margin Support Vector Machine),来解决下面说的数据集线性不可分的问题。 二、模型介绍原始模型 咱们先来看下硬距离反对向量机的原始模型如下: $$\begin{array}{}\underset{w, b}{\max} \frac{1}{2} w^Tw \\\text { s.t. } \quad y_{i}\left(w^{T} x_{i}+b\right) \geq 1 \quad i=1,2, \cdots, N\end{array}$$ <center>式2-1</center> 约束条件 y(wx + b) 大于等于 1 是为了使得所有样本点都在正确的分类下,这也是为什么称为硬距离的起因。而当初数据集无奈用一个超平面齐全离开,这时就须要容许局部数据集不满足上述约束条件。 批改下面的代价函数,加上分类谬误的样本点的惩办项,其中 1(x) 在后面章节中提到过,即批示函数2(indicator function),当满足上面不等式时函数返回 1,不满足时函数返回 0。同时通过常数 C 来管制惩办力度,其中 C > 0,能够看到当 C 取无限大时,会迫使每一个样本点分类正确,等同于硬距离反对向量机。 $$\begin{array}{}\underset{w, b}{\min} \frac{1}{2} w^{T} w+C \sum_{i=1}^{N} 1_{x_{i}}\left(y_{i}\left(w^{T} x_{i}+b\right) \lt 1\right) \\\text { s.t. } \quad C>0\end{array}$$ <center>式2-2</center> 式2-2中的批示函数既不是凸函数又不是连续函数,解决起来比拟麻烦,这时能够用max函数来替换,模式如下: $$\begin{array}{}\underset{w, b}{\min} \frac{1}{2} w^{T} w+C \sum_{i=1}^{N} \max\left(0, 1 - y_{i}\left(w^{T} x_{i}+b\right)\right) \\\text { s.t. } \quad C>0\end{array}$$ ...

January 30, 2022 · 7 min · jiezi

关于算法:动态规划

前一篇咱们认真聊了聊递归,如果大伙都认真敲了相干代码,没有播种那是不可能的。同时敏锐的搭档可能也发现了,接下来咱们要说啥了——动静布局,对,终于终于咱们聊到动静布局了。 提到动静布局,不晓得你们第一反馈是啥,难?他人的帖子看不懂?这些都不是事儿,跟着我的步调一步一步往下走,等更完几篇文章之后,咱们再来总结的时候,那时,面对动静布局就不会再感觉难了。 以下注释:(本文篇幅仍旧较长,请急躁品尝) 一、暴力递归是啥说直白点:暴力递归就是尝试 1、把问题转化为规模放大的同类问题的子问题 2、有明确的不须要持续进行递归的条件(base case) 3、有当失去了子问题的后果之后的决策过程 4、不记录每一个子问题的解 二、动静布局是啥在递归调用过程中,动静布局会把已经的调用过程保留下来,下次遇到雷同的过程间接调用就行(空间换工夫)。也就是遇到有反复调用的递归过程,就能够应用动静布局进行优化。 拿咱们熟知的斐波那契数列举例。 斐波那契数列规定第一项是1,第二项是1,当前的每一项F(n) = F(n-1) + F(n-2)。 咱们开展求解第7项的过程如下: 咱们将求第7项的值开展后会发现,整个递归过程会有很多反复的过程,这时候咱们就能够应用动静布局进行优化求解。 在咱们求解过一次F(5)后,将其值存起来,下次再遇到需要求F(5)时间接取就能够了,缩小了反复求解的过程,同理,对于每一个求解过的值都这样做,这就是动静布局。 以上概念性的货色都太形象了,OK,来看两个理论的题目,认真感触感触从暴力递归到动静布局的魅力。 三、机器人挪动问题1、题目形容对于N个格子(从1~N标号),机器人最开始在Start(1<=Start<=N)地位,要求在走过K(K>=1)步后(一次一格),来到aim地位(1<=aim<=N),问机器人有多少种走法? (注:在两端的格子只能往两头走,在两头的任意一个格子,能够抉择左走或右走) 2、思路1 从尝试开始/** * 1.从尝试开始 * * @author Java和算法学习:周一 */public static int way1(int n, int start, int aim, int k) {    if (n < 2 || start < 1 || start > n || aim < 1 || aim > n || k < 1) {        return -1;    }    return process1(start, k, aim, n);}/** * 计算机器人满足条件的走法有多少种 * * @param current   以后地位 * @param remaining 残余步数 * @param aim       指标地位 * @param n         格子数 */private static int process1(int current, int remaining, int aim, int n) {    // base case,不须要走时    if (remaining == 0) {        // 残余步数为0时以后正好在aim地位,则这是一种走法        return current == aim ? 1 : 0;    }    // 还有步数要走    if (current == 1) {        // 在最左侧,只能往右走        return process1(2, remaining - 1, aim, n);    } else if (current == n) {        // 在最右侧,只能往左走        return process1(n - 1, remaining - 1, aim, n);    } else {        // 在两头地位,左走或右走都能够,所以是两种状况产生的后果之和        return process1(current - 1, remaining - 1, aim, n)                + process1(current + 1, remaining - 1, aim, n);    }}以上代码是依照题目要求写出的最合乎天然智慧的代码,也是最容易了解的代码。 3、思路2 傻缓存法优化首先剖析这个调用过程是否有反复的步骤。 在递归调用的过程中,指标地位和格子数始终都是不变的,只有以后地位和残余步数始终在变,对于某次在格子6,残余步数为8的状况下剖析调用过程,如下: 会发现有反复的调用过程,所以这是能够用动静布局优化的,如果没有反复的调用过程,动静布局是优化不了的,也无奈优化。 定义一个缓存表的二维数组dp,机器人以后地位范畴是1\~n,残余步数范畴是0\~k,dp表(n + 1)*(k + 1)必定是可能将所有的状况都蕴含的。 最开始dp表均为-1,前面在递归调用时都先判断缓存表中是否有值,如果有(!=-1)间接返回值,没有才走递归过程,同时在每一次递归返回后果前都要更新缓存表dp。 /** * 2.傻缓存法 * * @author Java和算法学习:周一 */public static int way2(int n, int start, int aim, int k) {    if (n < 2 || start < 1 || start > n || aim < 1 || aim > n || k < 1) {        return -1;    }    // 机器人以后地位范畴是1~n,残余步数范畴是0~k,dp表(n + 1)*(k + 1)必定是可能将所有的状况都蕴含的    int[][] dp = new int[n + 1][k + 1];    for (int i = 0; i <= n; i++) {        for (int j = 0; j <= k; j++) {            dp[i][j] = -1;        }    }    // dp[current][remaining] == -1,示意没算过    // dp[current][remaining] != -1,示意算过,保留的是产生的后果    return process2(start, k, aim, n, dp);}/** * 计算机器人满足条件的走法有多少种,傻缓存法 * * @param current   以后地位 * @param remaining 残余步数 * @param aim       指标地位 * @param n         格子数 */private static int process2(int current, int remaining, int aim, int n, int[][] dp) {    // 缓存表曾经有值了,间接返回    if (dp[current][remaining] != -1) {        return dp[current][remaining];    }    // 之前没算过    int answer;    if (remaining == 0) {        answer = current == aim ? 1 : 0;    } else if (current == 1) {        answer =  process2(2, remaining - 1, aim, n, dp);    } else if (current == n) {        answer =  process2(n - 1, remaining - 1, aim, n, dp);    } else {        answer =  process2(current - 1, remaining - 1, aim, n, dp)                + process2(current + 1, remaining - 1, aim, n, dp);    }    // 返回前更新缓存    dp[current][remaining] = answer;    return dp[current][remaining];}因为此办法中递归调用过程是从顶向下的,所以此办法又叫从顶向下的动静布局。 同时,dp表中存在数据就间接返回,相似记忆,所以也叫记忆化搜寻。 傻缓存法是在暴力递归的过程上减少了一个dp数组,用于寄存之前产生的后果,所以把反复调用的过程优化了。然而,就完结了吗?必定不是。 4、最终版的动静布局咱们画出第2种办法中的dp表。假如格子数n=5,start=2,aim=4,步数k=6。 从第1种办法的递归过程剖析如何填dp表 (1)因为格子数n=5,所以以后地位的范畴为1\~5,第0行应用不到,用“×”示意;因为步数k=6,残余步数范畴为0\~6; public static int way1(int n, int start, int aim, int k) {    if (n < 2 || start < 1 || start > n || aim < 1 || aim > n || k < 1) {        return -1;    }    return process1(start, k, aim, n);}主函数调用递归函数时,求的是start=2、k=6的值,即(2, 6)的值,可得初始表如下 (2)残余步数为0时,以后地位为aim=4时为1,其余均为0; // base case,不须要走时if (remaining == 0) {    // 残余步数为0时以后正好在aim地位,则这是一种走法    return current == aim ? 1 : 0;}以后地位为1时,只能往第2格走,同时走一格残余步数减1(即依赖左下方格子的值);以后地位为n=5时,只能往第n-1=4格走(即依赖左上方的值);对于任意一个非边上的地位,能够往n-1和n+1格走(即依赖左下方和左上方的值)。可得dp表如下: (3)据此,咱们能够依据从上往下从左往右的程序将整个表填完,如下所示 最初可得(2, 6)的值为13,即最初的后果是13。 (4)依据以上剖析,能够写出动静布局代码如下: /** * 3.最终版的动静布局 * * @author Java和算法学习:周一 */public static int way3(int n, int start, int aim, int k) {    if (n < 2 || start < 1 || start > n || aim < 1 || aim > n || k < 1) {        return -1;    }    // 机器人以后地位范畴是1~n,残余步数范畴是0~k,dp表(n + 1)*(k + 1)必定是可能将所有的状况都蕴含的    int[][] dp = new int[n + 1][k + 1];    // 残余步数为0时,以后地位为aim时为1    dp[aim][0] = 1;    for (int remaining = 1; remaining <= k; remaining++) {        // 第一行,依赖左下方的值        dp[1][remaining] = dp[2][remaining - 1];        // 第一行和第n行独自算后,此处就不必判断越界问题了        for (int current = 2; current <= n - 1; current++) {            // 非边上的行,依赖左下方和左上方的值            dp[current][remaining] = dp[current - 1][remaining - 1] + dp[current + 1][remaining - 1];        }        // 第n行,依赖左上方的值        dp[n][remaining] = dp[n - 1][remaining - 1];    }    return dp[start][k];}看残缺个过程后,是不是恍然大悟,要是间接给你最初的代码,必定是不知所云,同时也不倡议去背这个动静规划表,动静规划表只是后果,不是起因。咱们从最开始的尝试开始,一步一步的往下推导,这就是状态转移的过程,想要一步间接写出最初的动静布局代码来是须要一直的练习和总结的。看到这里,置信大家都有播种了。 所有代码:https://github.com/monday-pro/algorithm-study/blob/master/src/basic/dynamicprogramming/RobotWalk.java 趁热打铁,再来一题。 四、纸牌问题1、题目形容给定一个负数整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B顺次拿走每张纸牌(能够看见所有的牌),规定玩家A先拿,玩家B后拿。然而每个玩家每次只能拿走最左或最右的纸牌。玩家A和玩家B都绝顶聪明,请返回最初获胜者的分数。 2、思路1 从尝试开始(1)剖析后手的状况 定义函数 f(arr, L, R),示意后手在数组arr[L...R]上取得的最大分数。L、R是下标。 1)如果L==R,表明当初只剩下一张牌了,返回arr[L]即可; 2)否则,表明还剩不止一张牌,分两种状况 取L地位的,分数 = arr[L] + g[arr, L+1, R](函数g是后手产生的最大分数) 取R地位的,分数 = arr[R] + g[arr, L, R-1] ...

January 29, 2022 · 1 min · jiezi

关于算法:MindSpore跟着小Mi一起机器学习吧异常检测一

一周未见,甚是惦记,明天小Mi带大家学习异样检测(Anomaly detection)!废话不多说,咱们开始吧~ 1 定义异样检测(Anomaly detection)这个算法很有意思:它尽管次要用于非监督学习问题,但从某些角度看,它又和一些监督学习问题很相似。 什么是异样检测: 通常飞机的引擎从生产线上流出时须要进行品质管制测试,作为根据会测试引擎的一些特色变量,比方引擎运行时产生的热量,或者引擎的振动等等。 这样一来,咱们就有了一个数据集,从到,如果生产了个引擎的话,能够将这些数据绘制成图表: 因而,异样检测问题能够定义如下:假如有一个新的飞机引擎从生产线上流出,看似有点异样,赋予其特色变量来判断该引擎是否须要进一步的测试。 给定数据集,倘若数据集是失常的,咱们心愿晓得新的数据是不是异样的,即这个测试数据不属于该组数据的几率是多少,因而构建的模型须要依据该测试数据来通知咱们其属于这组数据集的可能性。 上图中,在蓝色圈内的数据属于该组数据的可能性较高,而越是偏僻的数据,其属于该组数据的可能性就越低。 这种办法称为密度估计,表白如下: 异样检测常常用来辨认坑骗。例如在线采集用户的数据,一个特征向量中可能会蕴含如:用户多久登录一次,拜访过的页面,在论坛公布的帖子数量,甚至是打字速度等。尝试依据这些特色构建一个模型,能够用这个模型来辨认那些不合乎该模式的用户。 模型为咱们其属于一组数据的可能性,通过检测非正常用户。 2 正态分布正态分布其实也能够称之为高斯分布,大家是不是很相熟。小Mi先带大家回顾下高斯分布的基本知识。 通常认为:变量合乎高斯分布,则其概率密度函数为: 利用已有的数据来预测总体中的和: 高斯分布样例: 注:机器学习中对于方差咱们通常只除以而非统计学中的。其实抉择还是两者之间区别很小,简直能够忽略不计,在机器学习畛域大部分人更习惯应用。 3 算法那么这个时候大家是不是会感觉疑难了,异样检测和正态分布又有什么关系呢? 异样检测算法: 对于给定的数据集,咱们要针对每一个特色计算和的估计值。 一旦咱们取得了平均值和方差的估计值,给定新的一个训练实例,依据模型计算 : 过后,为异样。 下图是一个由两个特色的训练集,以及特色的散布状况: 上面的三维图表示意的是密度估计函数,轴为依据两个特色预计的值: 抉择一个,将作为断定边界,过后预测数据为失常数据,否则为异样。 4 异样检测零碎异样检测算法是一种非监督学习算法,意味着无奈依据后果变量的值来通知咱们数据是否真的是异样的。因而,咱们须要另一种办法来帮忙测验算法是否无效,开发一个异样检测零碎,须要从带标记(异样或失常)的数据着手,抉择一部分失常数据用于构建训练集,而后用剩下的失常数据和异样数据混合的数据形成穿插测验集和测试集。 例如:有10000台失常引擎的数据,有20台异样引擎的数据,调配如下: 6000台失常引擎的数据作为训练集 2000台失常引擎和10台异样引擎的数据作为穿插测验集 2000台失常引擎和10台异样引擎的数据作为测试集 具体的评估办法如下: 1.依据测试集数据,能够预计特色的平均值和方差并构建函数 2.对穿插测验集,尝试应用不同的值作为阀值,并预测数据是否异样,依据F1值或者查准率与查全率的比例来抉择 3.选出后,针对测试集进行预测,计算异样测验零碎的F1值,或者查准率与查全率之比 5 比照因为构建的异样检测零碎也应用的是带标记的数据,与监督学习有些类似,上面的比照有助于抉择是采纳监督学习还是异样检测: 当然,如果遇到正样本的数量很少,甚至为0的状况,通常采纳的算法就是异样检测算法啦,因为这时候呈现了太多没见过的不同的异样类型。 6 特色的抉择对于异样检测算法,特色的抉择是很重要的: 异样检测中的数据集假如特色合乎高斯分布,(如果数据的散布不是高斯分布,异样检测算法也能够进行工作,然而通常是将数据转换成高斯分布),例如应用对数函数:,其中为非负常数; 或者 ,为0-1之间的一个分数,等办法。(python中,通常用np.log1p()函数,就是 ,反向函数就是np.expm1())。 一个常见的问题是一些异样的数据可能也会有较高的值,从而会被算法认为是失常的。这种状况下误差剖析可能帮忙咱们,咱们能够剖析那些被算法谬误预测为失常的数据,察看是否找出一些问题。可能还会从问题中发现须要减少一些新的特色,减少这些新特色后取得的新算法可能帮忙咱们更好地进行异样检测。 异样检测误差剖析: 通常能够将一些相干的特色进行组合来取得一些新的更好的特色(异样数据的特征值异样地大或小),例如,在检测数据中心的计算机情况时,能够用CPU负载与网络通信量的比例作为一个新的特色,如果该值异样地大,便有可能意味着该服务器是陷入了一些问题中。 在抉择特色的时候,其实有时候咱们能够对特色进行一些小小的转换,让数据更像正态分布,而后再把数据输出异样检测算法;而误差分析方法也能够捕获各种异常情况。 明天小Mi先带大家简略理解了异样检测的定义呀,算法呀,如何抉择特色呀等等,下期小Mi还要介绍更加简单的多元高斯分布以及如何应用多元高斯分布进行异样检测呢!好啦,明天的介绍就完结啦~咱们下期再见呦!(挥手十分钟)~~

January 29, 2022 · 1 min · jiezi

关于算法:MindSpore跟着小Mi一起机器学习吧推荐系统

一周未见,甚是惦记,明天小Mi带大家学习举荐零碎(Recommender Systems)!举荐零碎是机器学习中一个很重要的利用,比方某易举荐的歌曲呀,某宝举荐的购物清单呀等等,既然应该这么宽泛,那就废话不多说,咱们开始吧~ 1 定义举荐零碎是个很有意思的问题,机器学习的学术会议上通常不太会关注举荐零碎问题,然而在咱们生存中却随处可见。 同时对机器学习来说,特色是很重要的,抉择的特色将对学习算法的性能有很大影响。因而,在机器学习中有一种大思维,针对一些问题,能够通过算法主动学习一套比拟好的特色,从而代替手动设计,其中举荐零碎就是类型设置的一个例子。 那么什么是举荐零碎问题呢?咱们从一个例子开始定义举荐零碎的问题。 倘若一个电影供应商有5部电影和4个用户,咱们要求用户为电影打分。 前三部电影是爱情片,后两部则是动作片,图中能够发现Alice和Bob仿佛更偏向与爱情片,而Carol和Dave仿佛更偏向与动作片,同时每个用户都并未给全副的电影都打过分。这时能够构建一个算法,预测每个人可能会给各自没看过的电影打多少分,并以此作为举荐的根据。 上面引入一些相干参数: :用户数量; :电影数量; :如果用户给电影评过分,则; :用户给电影的评分; :用户评过分的电影总数。 2 特色与算法在一个基于内容的举荐零碎算法中,对于用户心愿举荐的电影有一些数据,而这些数据更精确地说就是相干的特色。 假如每部电影都有两个特色,如代表电影的浪漫水平,代表电影的动作水平。 那么每部电影都有一个特征向量,如是第一部电影的特征向量:[0.9 0]。 基于这些特色来构建一个举荐零碎算法,采纳线性回归模型,咱们能够针对每一个用户都训练一个线性回归模型,如是第一个用户的模型参数。于是就有: :用户的参数向量; :电影的特征向量; 对于用户和电影,咱们预测评分为:; 代价函数 针对用户,该线性回归模型的代价为预测误差的平方和,加上正则化项: 其中示意只计算那些用户评过分的电影。在个别的线性回归模型中,误差项和正则项应该都是乘以,在这里的话咱们抉择将去掉,同时也不会对方差项进行正则化解决。 下面的代价函数只是针对一个用户的,为了学习所有用户,将所有用户的代价函数求和: 如果要用梯度降落法来求解最优解,计算代价函数的偏导数后失去梯度降落的更新公式为: 3 协同过滤在基于内容的举荐零碎中,对于每一部电影,咱们都把握了可用的特色,应用这些特色训练出了每一个用户的参数。触类旁通,如果咱们领有用户的参数,那么其实也能够学习得出电影的特色,有没有?! 然而如果既没有用户的参数,也没有电影的特色,那么应该如何解决呢?不必放心,协同过滤算法闪亮退场~ 优化指标将同时针对和进行,对代价函数求偏导数的后果如下: 注:在协同过滤算法中,通常不应用方差项,如果需要的话,算法会主动学得。 协同过滤算法应用步骤如下: 1.初始为一些随机小值 2.应用梯度降落算法最小化代价函数 3.在训练完算法后,预测为用户给电影的评分 通过这个学习过程取得的特色矩阵蕴含了无关电影的重要数据,能够用这些数据作为给用户举荐电影的根据。 例如,如果一位用户正在观看电影,寻找另一部电影,根据两部电影的特征向量之间的间隔大小,间隔越小,那么就越合乎该用户的品尝。 4 协同过滤算法协同过滤优化指标: 给定,预计:: 给定,预计,同时最小化和: 5 算法的向量化实现依据五部电影的数据集,将这些用户的电影评分,进行分组并存到一个矩阵中。 因为数据集有五部电影和四位用户,那么这个矩阵Y就是一个5行4列的矩阵,同时蕴含了这些电影的用户评分数据: 推出评分: 找到相干影片: 后期小Mi曾经带大家对特征参数向量进行了学习,那么其实如何度量两部电影之间的相似性就很好解决啦。例如说:电影有一个特征向量,而另一部不同的电影,只有保障两部电影的特征向量之间的间隔和很小,那就能很无力地表明电影和电影在某种程度上有类似,至多在某种意义上,某些人喜爱电影,或者更有可能也对电影感兴趣。也就是说,当用户在看某部电影的时候,如果须要找出5部与电影十分类似的电影,为了能给用户举荐5部新电影,咱们须要做的是找出电影,在这些不同的电影中与咱们要找的电影的间隔最小,这样你就能给你的用户举荐几部不同的电影了。 通过这个办法,置信大家能够晓得,应该如何进行一个向量化的计算来对所有的用户和所有的电影进行评分计算,同时也能把握通过学习特征参数,来找到相干电影和产品的办法。 6 均值归一化用户评分数据: 如果新增一个用户Sky,并且Sky没有为任何电影评分,那么咱们以什么为根据为Sky举荐电影呢? 首先须要对矩阵Y进行均值归一化解决,将每一个用户对某一部电影的评分减去所有用户对该电影评分的平均值: 而后利用这个新的矩阵来训练算法,如果咱们要用新训练出的算法来预测评分,则须要将平均值从新加回去,预测,而对于用户Sky,新模型会认为她给每部电影的评分都是该电影的平均分。 好啦,对于举荐零碎的学习就先到这咯~下周小Mi给大家安顿大规模机器学习!咱们,下周再见呦(挥手十分钟!)

January 29, 2022 · 1 min · jiezi

关于算法:基于OpenMLDB-v040快速搭建全流程线上AI应用

本文依据陈迪豪在『OpenMLDB Meetup No.1』中的演讲整顿而成。基于OpenMLDB v0.4.0疾速搭建全流程线上AI利用OpenMLDB在立项开始就有很多性能的优化,包含基于LLVM的JIT优化,能够针对不同的CPU架构、Linux服务器或MAC服务器,通过LLVM做对应的代码生成优化,甚至是最新的基于M1的ARM架构苹果电脑,也是能够让OpenMLDB针对这种场景做优化的。 后面提到了在局部场景OpenMLDB能够比Spark有10倍甚至10倍以上的性能晋升,其实也得益于咱们对 Spark做了很多代码优化,包含像开源Spark不反对的窗口歪斜优化、窗口并行优化等等,甚至咱们对 Spark源码进行了革新,来实现这种定制化的针对AI场景的性能优化。 OpenMLDB在存储上也有优化,传统的数据库服务大多基于文件,这种基于b+树数据结构的存储,对于高性能在线AI利用还是不太适宜,还可能须要针对时序特色做优化。咱们实现了针对分区键和排序键盘做的多级跳表数据结构,能进一步晋升OpenMLDB在时序数据上的读写性能。 近期咱们正式公布了OpenMLDB 0.4.0版本,这个版本也有很多性能和性能上的优化,那么本文会介绍OpenMLDB 0.4.0最新版本上的一些新个性,以及怎么基于这个新版原本疾速搭建一个全流程的线上AI利用。 首先做一个简略的自我介绍,我叫陈迪豪,目前在第四范式负责平台架构师,是OpenMLDB我的项目的外围研发和PMC成员,之前参加过分布式存储HBase、分布式的基础架构我的项目OpenStack我的项目的开发,是机器学习中罕用的TVM框架的贡献者,目前专一于分布式系统和数据库的设计。 P3: 明天会给大家介绍三个方面的内容: OpenMLDB 0.4.0全流程的新个性OpenMLDB 0.4.0单机版和集群版的疾速上手手把手教大家如何应用OpenMLDB来疾速搭建一个全流程的线上AI利用【01 | OpenMLDB 0.4.0的全流程新个性介绍】OpenMLDB 0.4.0 全流程新个性 1 | 在线离线对立存储第一个新个性是,OpenMLDB的在线存储和离线存储对立了,即一致性的表的视图,右上角是咱们旧版本的表信息,通过SQL的describe语句,能够看到这个表名叫T1, 它的Schema信息,蕴含多少列以及每一列的类型,上面就是它的索引信息。 在0.4.0咱们新减少了一个对立的表视图,就是把离线存储和在线存储对立到一起了。右下角就是在一个一般表的定义上面,减少一个offline的table信息,信息中会包含:offline存储门路、离线存储的数据格式、是否是deep copy等一些属性。 对立存储也是业界数据库外面很少呈现的设计,它实现了离线表和在线表共享一套表名和scheme,共享一套索引信息,共享一个SQL解析引擎,咱们应用C++实现的SQL解析引擎来编译SQL,而后共享同一个数据引入和导出流,也就是说离线表和在线表都能够应用雷同的SQL语句来做数据导入和导出,他们惟一的区别就是离线和在线别离有独立的长久化存储。咱们刚刚提到的在线是全内存的高性能多级跳表存储,离线上咱们反对让本地的文件存储以及像HDFS这种分布式存储,来应答离线和在线不同的场景需要。 OpenMLDB 0.4.0 全流程新个性 2 | 高可用离线工作治理第二个新个性就是,新减少了一个高可用的离线工作治理服务,叫TaskManager Service, 高可用的离线工作治理服务,反对本地或Yarn集群上的Spark工作治理,反对应用SQL来做工作治理,像SHOW JOBS, SHOW JOB, STOP JOB等,都是通过拓展SQL语法来实现的。它内置反对多种数据工作,包含:导入在线数据,导入离线数据,导出离线数据。 OpenMLDB 0.4.0 全流程新个性 3 | 端到端的AI工作流第三个重要的个性是,实现了真正的端到端AI工作流,能够基于SDK或者CLI命令行应用。 右边的列表就是咱们在做端到端AI利用落地的8个步骤,别离是:创立数据库、创立数据库表、导入离线数据、进行离线的特色抽取,而后应用机器学习框架进行模型训练、部署SQL上线、导入在线数据,以及上线在线特色服务。 从第1到第8个步骤,简直每个步骤都能够通过OpenMLDB的SDK或命令行来实现: 应用规范的SQL语句创立数据库和创立数据库表,这个是规范SQL就反对的像导入离线数据,一些SQL方言也能够反对,例如SQL Server或MySQL能够反对相似这种Load Data in File的语法,即从文件导入数据到一个表中。咱们也反对离线和在线的数据导入,以及离线的特色抽取,因为后面介绍了咱们特色计算都是应用拓展的SQL语言,咱们在命令行里集成了离线SQL工作的提交性能,你能够在命令行去执行一个规范的SQL,比方这里的select sum语句,应用SQL提交工作后,因为它是离线工作,因而会提交到一个分布式的计算集群,比方yarn集群,而后做分布式的离线特色计算。 对于第5步机器学习模型训练: 咱们反对内部的机器学习训练框架,像TensorFlow,PyTorch,LightGBM,XGBoost或者OneFlow等;因为咱们生成的是规范的样本数据格式,像CSV、LIBSVM或者TFRecords等,用户能够应用TensorFlow等框架来做模型训练;这些框架也能够提交到本地、yarn集群、k8s集群等,来做分布式的训练;反对应用GPU等硬件进行减速,跟咱们的特色数据库OpenMLDB是齐全兼容的。模型训练当前,即咱们的SQL特色能够上线了,而后能够间接执行一个Deploy命令,接上要上线的SQL,就能够上线咱们的在线特色服务了。这个也是咱们通过SQL拓展来实现的。 而后上线后的服务,须要给它注入一些历史的时序特色,咱们称之为特色的蓄水。用户的一些历史数据,也能够应用Load Data的这个SQL语句来实现。 实现当前,咱们外部会起一个反对HTTP和RPC接口的服务,客户端应用规范的HTTP申请就能够拜访了,或者应用咱们的Java、Python SDK。将来咱们也会把这个性能集成到CLI中,来实现全流程的端到端AI工作流在命令行上的整合。 【02 | OpenMLDB 0.4.0 单机/集群版疾速上手】介绍完0.4.0新增的全流程个性,那么接下来,就给大家疾速上手一下0.4.0的单机版和集群版性能。 ...

January 29, 2022 · 1 min · jiezi

关于算法:开源机器学习数据库OpenMLDB-v040产品介绍

本文依据卢冕在『OpenMLDB Meetup No.1』中的演讲整顿而成。开源机器学习数据库OpenMLDB:为企业提供全栈FeatureOps解决方案明天的演讲围绕OpenMLDB给企业提供全栈FeatureOps解决方案开展,同时对OpenMLDB的次要个性和新公布0.4.0版本的新性能进行介绍。 首先介绍一下我本人,我叫卢冕,博士毕业于香港科技大学计算机系,目前在第四范式负责零碎架构师,次要负责数据库团队和高性能计算团队,同时也是开源我的项目OpenMLDB的次要研发负责人,目前次要专一于数据库系统和异构计算。明天的分享次要蕴含三个内容: 背景介绍:AI工程化落地的数据和特色的挑战。OpenMLDB为企业提供全栈FeatureOps解决方案:为什么要做FeatureOps,为什么要去有OpenMLDB,OpenMLDB的一些次要个性是什么。OpenMLDB当初的开源情况、倒退情况以及0.4.0版本的个性。 【01 | AI工程化落地的数据和特色的挑战】数据侧的技术演进为基于人工智能的决策提供了可能 明天数据的大规模疾速演进,为人工智能的决策提供了可能。因为10年、20年前,对于企业来说数据量可能只是百G级别的,数据规模在明天来看其实是非常少的,次要依赖于人工录入去做数据分析。到明天这个数据规模就曾经变得十分大了,可能达到数百PB级别的数据,这种超大的数据量为咱们做人工智能决策提供了可能,同时也带来了一个十分大的挑战——怎么去做数据治理。正确、高效的 AI 数据和特色供应成为数据侧的新挑战 企业在数据治理上破费了高达95%的工夫和精力,数据治理包含数据收集、数据清理、数据处理、数据计算、数据供应。明天在业界有十分多的数据治理计划,例如Hadoop、MySQL、MEMSAL、Oracle、DeltaLAKE,这些基础架构软件都是构建AI零碎的一个十分重要的组成部分。然而这些软件到底是否曾经解决了AI工程化落地的问题呢?其实咱们明天看到这些现有的计划,很多时候并没有齐全解决 AI工程化的数据问题。MLOps 的残缺生命周期 为了了解AI工程化落地数据问题到底是什么,咱们先来介绍一些背景信息。先引出一个最近十分火的名词叫做MLOps,MLOps笼罩了机器学习从开发到上线到运维整个生命周期的所有工具集和运维伎俩。 把MLOps拆开来看就失去这张图,它分为离线开发和线上服务两个拆散的流程,为什么会有这两个流程?咱们留神到,两个流程外面high level的组件其实都是一样的,包含DataOps、FeatureOps、 ModelOps,然而这两个流程还是有十分不一样的点。 人工智能的开发流程依照这个图来,先要有一个离线开发,做离线训练的流程,等到模型训练曾经达到要求了,就转为线上服务。这个线上服务又叫做Inference,在ModelOps外面是做推理。 这两个流程尽管有一些共同点,然而在算法的实现上,在落地工程落地的要求上,其实都有十分大的差异。在真正地做到 MLOps实际企业落地的时候,常常会把这两个流程离开看。在这两个流程外面,能够看到有DataOps、FeatureOps、 ModelOps,在离线开发这一块,DataOps负责数据采集和存储。 FeatureOps是我明天要重点笼罩的局部,它次要蕴含了特色计算、特色存储、线上实时特色计算以及特色服务这几个环节。ModelOps笼罩的是线下离线局部的模型训练和线上的推理。 简略来讲,这6大组件形成了MLOps的整体闭环。还有一个环节 ProductionOps,是企业真正做人工智能工程化落地时一个十分重要的环节。做线上服务的时候,会十分看重这些企业级的外围,包含高可用可扩缩容、降级、监控,都是十分必要的,所以 ProductionOps作为一个子模块,被蕴含在MLOps外面。FeatureOps - 实时特色计算 FeatureOps最次要的性能是什么?它最次要涵盖的性能就是特色工程,举个做实时特色计算的例子,例子中还蕴含了一个离线的特色计算。离线的特色计算和实时特色计算在总体的逻辑上是相似的,区别次要体现在实现的要求上,这里咱们次要关注实时的特色计算。 举一个性化搜寻的例子,比方小李同学,在某个工夫点想买洗衣机,去搜寻洗衣机,触发了搜寻行为当前,前面整个特色计算会做什么?首先进来的实时行为特色,只是这三个原始的特色,就是 User ID,data以及他在搜寻货色。如果咱们只是拿这三个特色去做模型训练和推理,它是达不到一个十分好的模型精度的。 此时须要做一个特色工程,所谓的特色工程就是咱们从数据库里去进一步的去拉取一些历史数据,比方说咱们从交易数据库、商品数据库、用户数据库去拉取一些历史数据,而后组合、计算,失去一些更残缺的更有意义的特色。 图片最左边就是一个实时的特色,比方说以后有个主播正在带货,或者天猫正好有一批优惠券正在发放,就会存在一个十分实时的特色,比方以后优惠券最多的或者折扣力度最大的洗衣机型号是什么,也可能是过来5分钟内点击量最多的洗衣机是什么,也可能是跟小李过来的消费行为有一些联合的特色,就比方说小李过来一年买的最多的电子品牌是什么,他的生产平均水平是什么,这些所有的这些特色全副组合起来,这些新的衍生进去的特色,就是通过特色工程(或者叫做特色计算)衍生进去的特色,最初组合成一个残缺的特色列表,而后再去给到前面做模型预估。所以做特色工程蕴含了十分重要的特色计算步骤。FeatureOps 工程化的最大挑战-线上线下一致性校验 接下来,带大家理解一下,在理论落地过程当中特色工程是怎么做的。广泛流程是,一开始做 AI模型的时候,首先是数据科学家写特色脚本,所谓这个特色脚本就是后面提到的,要如何去抽取这些特色,要定义哪些特色,比方抽取什么最近三天内什么交易量最大的特色。 数据科学家会首先进场去写特色脚本,而后做模型训练,当他做完这部分内容,达到称心的成果当前,即特色脚本和模型都调整实现之后,就到了业务上线的局部。此时会有一个工程化团队来负责业务上线的局部,并进一步染指。 为什么不能间接拿数据科学家做的货色上线? 数据科学家他关注的点是模型的准确度、精确度、品质,但他不太关怀模型上线后latency, QPS等等。大部分迷信数据科学家做这个过程当中,用的是Python,RSQL这种偏差批处理比拟易用的框架,这种面向批处理的这种框架,它间接上线会带来很多问题:上线的逻辑和数据处理的逻辑不同;在性能上,这种批处理的框架不能满足实时处理的需要。所以个别会有一个工程化团队,把科学家做的特色工程的脚本和模型训练的建模办法,翻译成线上的一套货色。线上的工程化团队不会应用 Python这种框架去上线,因为他们十分关注latency、QPS,他们会用一些高性能数据库,甚至去用c++本人搭建一套特色抽取的服务,买通前面预估服务这条线。 图中虚线框起来的局部就是FeatureOps所笼罩的性能范畴,下文将重视讲次要的特色抽取、特色计算所笼罩的性能范畴。从离线开发翻译到线上的实时特色计算,因为线上线下是两套零碎,由两个团队开发,所以一致性校验是不可避免的。它其实是整个FeatureOps工程化外面代价最大的环节,依照第四范式的教训来说,一致性校验占整个工程的比例会十分高,因为这里牵涉到很多成果的对齐联调,以及人和人之间的沟通老本。线上线下不统一可能的起因 1.工具能力的不一致性。离线开发和线上利用,应用的工具栈和开发栈可能是齐全不一样的。 离线开发数据科学家更偏好于像python、spark这种这种工具;做线上利用的时候,考究高性能、低latency,就须要用一些高性能的编程语言或者数据库来做。当咱们有两套工具的时候,它们笼罩的性能范畴是不一样的,比方说做离线开发的时候,应用的是python,能够实现很简单的性能,而线上MySQL的性能就会受限于于SQL。工具能力的不一致性,就会造成做一些斗争的场面,产生的成果就不同。 需要沟通的认知差。这不是一个技术问题,然而在理论工程落地当中十分重要。这里咱们举一个例子,Varo,一家十分有名做线上银行的公司,在美国有很多的用户,他们的工程师提到了需要沟通认知差的问题。对于如何定义account balance,他们有一个教训:很显著两者之间的认知差,就能造成前面的整个训练成果的不一致性,从而导致了他们的利用里呈现了十分重大的线上业务问题。其实不光是这家银行,在第四范式整个我的项目实际的周期教训当中,咱们都或多或少都碰到过这种沟通认知差带来的问题。一旦呈现这种问题,排查的老本其实还是十分高的。 当然还有其余一些起因,这里我就列举了两种最重要的起因。线上线下一致性校验带来的昂扬工程化落地老本 因为线上线下的一致性问题的产生,校验是必然的。一次性校验带来了很多老本上的问题: 须要两组不同技能栈的开发人员投入,能力去实现从线下到线上的部署的过程。线上线下两套零碎的开发和经营。这两点在工程化落地老本、开发成本、人力老本下面,都有十分大的代价。 【02 | OpenMLDB为企业提供全栈FeatureOps解决方案】FeatureOps工程化解决方案 所以FeatureOps它有一些什么样的解决方案? 头部企业会自研构建保障线上线下一致性的平台,然而他们投入的老本也是十分高的。除了这些有十分强的研发能力的企业以外,剩下的企业更多地会洽购一些Saas工具和服务,解决这个问题,因为投入研发的老本可能比洽购的老本更高。 而OpenMLDB就提供了另外一种解决方案,咱们提供了开源的解决方案,帮忙企业去做到低成本高效率地解决问题,提供FeatureOps企业级的解决方案。OpenMLDB 是一个开源机器学习数据库,提供企业级 FeatureOps 全栈解决方案 首先这张图把整个架构把转换到了OpenMLDB的架构图上。咱们看到这张图跟后面的图片有三个显著的区别: 1、从对外裸露的编程语言 API来讲,咱们提供了对立的 SQL接口。 对开发人员来讲,就不再须要两套开发接口。数据科学家在离线开发过程当中写的 SQL,就是最初上线的 SQL,这两者是人造对立的。对外部的开发者来说,它就是同一种语言。数据科学家写的SQL不须要工程化团队翻译,就间接能上线。 为了保障这个特点,咱们外部有对立的计算执行引擎,做对立的底层计算逻辑,以及逻辑打算到物理打算的翻译。拿来同一个SQL,翻译成适合的、保障两者一致性的执行打算给到线上计算引擎。 2、这里看到线下的计算引擎和线上的计算引擎,他们其实还是离开的,因为后面提到过,线上和线下两者的性能要求其实是齐全不一样的。 线下做离线开发的时候,咱们看重的是看中的是批处理的效率,所以线下这个模块它其实咱们实质上还是基于spark的,只是咱们在spark上做了一些改良。 ...

January 29, 2022 · 1 min · jiezi

关于算法:从-最具启发性的汉诺塔问题开始-聊递归

本文篇幅较长,倡议认真急躁看完,置信会有极大的播种。 一、最具启发性的汉诺塔问题1、汉诺塔问题形容有三根杆子A,B,C。A杆上有 N 个 (N>1) 穿孔圆盘,盘的尺寸由下到上顺次变小。要求按下列规定将所有圆盘移至 C 杆:每次只能挪动一个圆盘;大盘不能叠在小盘下面。 问:起码要挪动多少次?并打印每次挪动的状况。 2、从最后开始咱们的指标是将1、2、3圆盘从左杆移到右杆上 能够拆解为以下三步 1)(大步)将1、2圆盘从左移到中杆上 2)将3圆盘从左移到右杆上 3)(大步)将1、2圆盘从中移到右杆上 代码如下: /** * @author Java和算法学习:周一 */public static void leftToRight(int n) {    if (n == 1) { // base case        System.out.println("Move 1 from left to right");        return;    }    // 1、1到n-1个圆盘从左到中    leftToMid(n - 1);    // 2、从左到右    System.out.println("Move " + n + " from left to right");    // 3、1到n-1个圆盘从中到右    midToRight(n - 1);}整个左到右办法,你会发现第一大步依赖左到中子办法,第三大步依赖中到右子办法,而后你去补起左到中办法、中到右办法;此时又会发现左到中依赖左到右、右到中办法,中到右依赖中到左、左到右办法…… /** * @author Java和算法学习:周一 */private static void leftToMid(int n) {    if (n == 1) {        System.out.println("Move 1 from left to mid");        return;    }    leftToRight(n - 1);    System.out.println("Move " + n + " from left to mid");    rightToMid(n - 1);}private static void midToRight(int n) {    if (n == 1) {        System.out.println("Move 1 from mid to right");        return;    }    midToLeft(n - 1);    System.out.println("Move " + n + " from mid to right");    leftToRight(n - 1);}private static void rightToMid(int n) {    if (n == 1) {        System.out.println("Move 1 from right to mid");        return;    }    rightToLeft(n - 1);    System.out.println("Move " + n + " from right to mid");    leftToMid(n - 1);}private static void midToLeft(int n) {    if (n == 1) {        System.out.println("Move 1 from mid to left");        return;    }    midToRight(n - 1);    System.out.println("Move " + n + " from mid to left");    rightToLeft(n - 1);}private static void rightToLeft(int n) {    if (n == 1) {        System.out.println("Move 1 from right to left");        return;    }    rightToMid(n - 1);    System.out.println("Move " + n + " from right to left");    midToLeft(n - 1);}最初你会发现左到中、左到右、中到左、中到右、右到左、右到中这6个办法相互依赖实现了汉诺塔问题。 是不是有点神奇,递归有时候是有点玄学,然而只有把子过程想明确,base case写对,就跑进去了(同时,须要有一点宏观思维)。 3、优化这6个过程,是不是有点麻烦,同时仔细的搭档可能也发现了,这6个办法是及其类似的,那么咱们是不是能够定义from、to、other三个变量,他们都能够示意左、中、右。当我左到右时,from=左、to=右、other=中;当左到中时,from=左、to=中、other=右……是不是就能六合一号召神龙了。 同样拆解为以下三步 1)(大步)将1、2圆盘(即下面n-1个圆盘)从左移到中杆上 2)将3圆盘(即最大的圆盘)从左移到右杆上 3)(大步)将1、2圆盘(即下面n-1个圆盘)从中移到右杆上 /** * 第一次调用function时:from=左、to=右、other=中 * 示意借助other=中,将圆盘从from=左挪动到to=右杆上 * * @author Java和算法学习:周一 * * @param n     总共的圆盘数量 * @param from  起始地位 * @param to    指标地位 * @param other 残余杆子 */public static void function(int n, String from, String to, String other) {    if (n == 1) {        System.out.println("Move 1 from " + from + " to " + to);        return;    }    // 1.将下面n-1个圆盘从左移到中杆上,    // 即起始地位为左,以后from=左;指标地位中,以后other=中    function(n - 1, from, other, to);    // 2.将最大的圆盘从左移到右杆上    System.out.println("Move " + n + " from " + from + " to " + to);    // 3.将下面n-1个圆盘从中移到右杆上    // 即起始地位为中,以后other=中;指标地位右,以后to=右    function(n - 1, other, to, from);}这时候,咱们就学会了一个技巧,一个递归函数能够通过减少参数的形式表白更多的可能性,听着跟废话一样,然而当初你再品品。 然而,若没有后面启发性的过程,间接看这个是不是有点难懂;有了启发性的过程,再看是不是恍然大悟。 是不是发现上课时听老师讲汉诺塔时一头雾水,要是老师过后能这么讲相对听的明明白白。此处应有掌声(和点赞)。 零打碎敲,再来看看几个递归过程。 二、打印一个字符串的全副子序列1、子序列定义对于字符串"12345",任意取其中0个、1个、2个、3个、4个、5个都是它的子序列,同时绝对程序不能扭转。 对于字符串“123”,咱们能够很容易剖析出以下递归过程 2、代码/** * @author Java和算法学习:周一 */public static List<String> getAllSubSequences(String s) {    char[] str = s.toCharArray();    List<String> answer = new ArrayList<>();    String path = "";    process1(str, 0, answer, path);    return answer;}/** * 以后来到了str[index]字符 * str[0..index-1]曾经走过了,之前的抉择都在path上,之前的抉择曾经不能扭转了,就是path。 * 然而str[index....]还能自由选择,把str[index....]所有生成的子序列,放入到answer里 * * @param str    指定的字符串(固定) * @param index  以后所处的地位 * @param answer 之前决策依据产生的答案 * @param path   之前曾经做的抉择 */public static void process1(char[] str, int index, List<String> answer, String path) {    // 以后来到了字符串的最初地位,曾经不能再做决策了,answer只能放入之前的决策    if (index == str.length) {        answer.add(path);        return;    }    // 以后没有要index地位的字符    process1(str, index + 1, answer, path);    // 以后要index地位的字符    process1(str, index + 1, answer, path + str[index]);}process1办法就是下面剖析进去的递归过程。 三、打印一个字符串的全副子序列,没有反复值打印一个字符串的全副子序列,要求没有反复字面值的子序列,间接将下面的List换成Set即可去重。 /** * 打印一个字符串的全副子序列,要求没有反复字面值的子序列 * * @author Java和算法学习:周一 */public static Set<String> getAllSubSequencesNoRepeat(String s) {    char[] str = s.toCharArray();    Set<String> answer = new HashSet<>();    String path = "";    process2(str, 0, answer, path);    return answer;}public static void process2(char[] str, int index, Set<String> answer, String path) {    if (index == str.length) {        answer.add(path);        return;    }    process2(str, index + 1, answer, path);    process2(str, index + 1, answer, path + str[index]);}四、打印一个字符串的全副全排列1、全排列定义所有字符都要,只是程序不同。 2、采纳舍弃增加的形式(1)递归过程如下 在第一大列抉择a时,造成了一些后果,当我进行第二大列递归时,得把a增加回去,放弃最开始的abc,在第二大列抉择b时进行递归失去的后果才是正确的,对于每一列的每一位抉择都是如此,递归完结后要复原现场。 (2)代码/** * 1.增加删除的形式 * * @author Java和算法学习:周一 */public static List<String> permutation1(String s) {    List<String> answer = new ArrayList<>();    if (s == null || s.length() == 0) {        return answer;    }    ArrayList<Character> strList = new ArrayList<>();    for (char c : s.toCharArray()) {        strList.add(c);    }    String path = "";    process1(strList, path, answer);    return answer;}/** * 递归获取全排列 * * @param strList 以后参加抉择的所有字符 * @param path 之前所做的抉择 * @param answer 最终后果 */private static void process1(ArrayList<Character> strList, String path, List<String> answer) {    // 以后没有能够抉择的字符了,answer只能放入之前的抉择    if (strList.isEmpty()) {        answer.add(path);        return;    }    for (int i = 0; i < strList.size(); i++) {        // 以后抉择的字符        char cur = strList.get(i);        // 舍弃曾经抉择的字符        strList.remove(i);        // 残余字符再进行抉择        process1(strList, path + cur, answer);        // 复原现场        strList.add(i, cur);    }}3、始终在原始字符串上以替换的形式进行递归在第一大列造成后果acb时,如果不复原现场,当我进行第二大列递归时,是从acb开始进行0、1位替换造成cab,和前面的反复了,所以每一步替换递归完结后要复原现场。 (1)递归过程如下 (2)代码/** * 2.替换的形式 * * @author Java和算法学习:周一 */public static List<String> permutation2(String s) {    List<String> answer = new ArrayList<>();    if (s == null || s.length() == 0) {        return answer;    }    char[] str = s.toCharArray();    process2(str, 0, answer);    return answer;}/** * 递归获取全排列 * * @param str 以后经验过替换后的字符 * @param index 以后替换到哪个地位了 * @param answer 后果 */private static void process2(char[] str, int index, List<String> answer) {    // 以后来到了字符串的最初地位,曾经不能再替换了,answer只能放入之前替换后的字符    if (index == str.length) {        answer.add(String.valueOf(str));        return;    }    // index之前的曾经替换过不能再变了,所以从index往后还能够再替换    for (int i = index; i < str.length; i++) {        // index、i地位替换        swap(str, index, i);        // index前面的持续替换        process2(str, index + 1, answer);        // index、i地位 复原现场        swap(str, index, i);    }}五、打印一个字符串的全副全排列,没有反复值1、代码/** * 替换的形式,去重 * * @author Java和算法学习:周一 */public static List<String> permutation3(String s) {    List<String> answer = new ArrayList<>();    if (s == null || s.length() == 0) {        return answer;    }    char[] str = s.toCharArray();    process3(str, 0, answer);    return answer;}/** * 递归获取全排列,没有反复的字符串 * * @param str 以后经验过替换后的字符 * @param index 以后替换到哪个地位了 * @param answer 后果 */private static void process3(char[] str, int index, List<String> answer) {    // 以后来到了字符串的最初地位,曾经不能再替换了,answer只能放入之前替换后的字符    if (index == str.length) {        answer.add(String.valueOf(str));        return;    }    boolean[] visited = new boolean[256];    // index之前的曾经替换过不能再变了,所以从index往后还能够再替换    for (int i = index; i < str.length; i++) {        // str[i]地位对应字符没有呈现过才递归替换,否则疏忽        if (!visited[str[i]]) {            visited[str[i]] = true;            // index、i地位替换            swap(str, index, i);            // index前面的持续替换            process3(str, index + 1, answer);            // index、i地位 复原现场            swap(str, index, i);        }    }}2、为啥咱们不采纳Set的形式来去重?认真看以上代码,发现没有再用Set的办法来去重,为啥? 因为采纳Set去重,程序会反复的做很多雷同字符的递归操作,将产生的雷同字符串放到Set中由Set去重;而采纳以上形式,对于雷同的字符就不会再反复的递归了,无效缩小了反复分支的递归操作,俗称剪枝。 相当于Set是从后果中过滤去重,而以上形式是在中途的过程就曾经去重了。 六、栈的逆序给你一个栈,请你逆序这个栈,不能申请额定的数据结构,只能应用递归函数。如何实现? 1、失去栈底元素(1)代码/** * 失去栈底元素,残余元素间接下沉 * * 例如,从栈顶到栈底元素为1、2、3、4、5 * 此办法返回5,残余从栈顶到栈底元素为1、2、3、4 * * @author Java和算法学习:周一 */private static int getDown(Stack<Integer> stack) {    int result = stack.pop();    if (stack.isEmpty()) {        return result;    } else {        int last = getDown(stack);        stack.push(result);        return last;    }}(2)过程 2、递归逆序(1)代码/** * @author Java和算法学习:周一 */public static void reverse(Stack<Integer> stack) {    if (stack.isEmpty()) {        return;    }    int down = getDown(stack);    reverse(stack);    stack.push(down);}(2)过程 本文所有代码 Github地址:https://github.com/monday-pro/algorithm-study/tree/master/src/basic/dynamicprogramming/recursion Gitee地址:https://gitee.com/monday-pro/algorithm-study/tree/master/src/basic/dynamicprogramming/recursion 怎么样,是不是如沐春风般醍醐灌顶。

January 28, 2022 · 1 min · jiezi

关于算法:图的关键算法

一、概念图(Graph)是用于示意物体与物体之间存在某种关系的构造。数学形象后的“物体”称作节点或顶点(Vertex,node或point),节点间的相干关系则称作边。在描述一张图的时候,通常用一组点或小圆圈示意节点,其间的边则应用直线或曲线。 1、有向图和无向图图中的边能够是有方向或没有方向的。 例如在一张图中,如果节点示意团聚上的人,而边示意两人已经握手,则该图就是没有方向的,因为甲和乙握过手也意味着乙肯定和甲握过手。相同,如果一条从甲到乙的边示意甲欠乙的钱,则该图就是有方向的,因为“已经欠钱”这个关系不肯定是双向的。前一种图称为无向图,后一种称为有向图。 同时,无向图也能够认为是有向图,即能够设想成两个节点之间有从A到B的边,也有B到A的边,所以从宽泛的角度能够认为所有图都是有向图。 二、图的示意教材上的表示法:邻接表、邻接矩阵 1、邻接表 2、邻接矩阵如果图G有n个节点,则邻接矩阵是一个 n*n 的矩阵,定义为: G[ i ][ j ] = 1(或权重值),若<Vi, Vj>是G中的边;否则G[ i ][ j ] = 无穷大。对于对角线的设置,视状况具体设置。 3、常见的表示法以上两种表示法在理论刷题的过程中简直不会遇到。 更多的是给你一个 n*3 的矩阵[ [weight, fromNode, toNode] ],例如[ [3, A, B], [2, B, M], [5, A, R] ],第一个值示意权重,第二个值示意from节点,第三个值示意to节点。也就是一条边一条边的间接示意。 三、图的解决思路图的算法都不算难,只不过coding的代价比拟高 (1)先用本人最纯熟的形式,实现图构造的表白 (2)在本人相熟的构造上,实现所有罕用的图算法作为模板 (3)把面试题提供的图构造转化为本人相熟的图构造,再调用模板或改写即可 图的示意办法这么多种,并且每次给你的模式还可能不同,所以就有必要形象一个本人的示意办法,当前对于不同的模式,写一个能转换为本人定义模式的办法即可(有种适配器的感觉),这样能力以不变应万变,把不相熟的示意办法转换为本人相熟的办法 /** * 自定义图的信息 * * @author Java和算法学习:周一 */public class Graph {    /**     * 点集,Key:用户给的点,Value:自定义点信息     */    public HashMap<Integer, Node> nodes;    /**     * 边集     */    public HashSet<Edge> edges;    public Graph() {        this.nodes = new HashMap<>();        this.edges = new HashSet<>();    }    /**     * 将用户输出的示意边的 N*3 的矩阵转换为自定义的图     *     * @param matrix N*3 的矩阵,[3, 0, 5], [2, 2, 5]     */    public static Graph createGraph(int[][] matrix) {        Graph graph = new Graph();        for (int[] m : matrix) {            // 拿到用户给的边的权重信息、边的from、to节点            int weight = m[0];            int from = m[1];            int to = m[2];            // 增加图的点集信息            if (!graph.nodes.containsKey(from)) {                graph.nodes.put(from, new Node(from));            }            if (!graph.nodes.containsKey(to)) {                graph.nodes.put(to, new Node(to));            }            // 依据点生成边的信息            Node fromNode = graph.nodes.get(from);            Node toNode = graph.nodes.get(to);            Edge edge = new Edge(weight, fromNode, toNode);            // 节点信息处理            // 增加 从以后节点登程间接连贯的节点、从以后节点登程间接连贯的边            fromNode.nexts.add(toNode);            fromNode.edges.add(edge);            // 入度、出度批改            fromNode.out++;            toNode.in++;            // 增加图的边集信息            graph.edges.add(edge);        }        return graph;    }}四、图的宽度优先和深度优先遍历1、宽度优先遍历(1)筹备一个队列,一个Set(寄存遍历过的节点,登记表),登程节点为A,把A放到队列和Set中 (2)弹出队列的顶点M,打印M的值。获取M的所有街坊节点next,查看Set中有没有这些next节点,无则放到Set和队列中,有则跳过此next节点 (3)始终执行第2步,直到队列为空 /** * 图的宽度优先遍历 * * @author Java和算法学习:周一 */public static void bfs(Node node) {    if (node == null) {        return;    }    Node current = node;    Queue<Node> queue = new LinkedList<>();    HashSet<Node> set = new HashSet<>();    queue.add(current);    set.add(current);    while (!queue.isEmpty()) {        current = queue.poll();        System.out.println(current.value);        for (Node next : current.nexts) {            if (!set.contains(next)) {                queue.add(next);                set.add(next);            }        }    }}2、深度优先遍历一条路没走完就始终走,走完了就往回走,看哪些岔路还没有走。(不能走出环路,走过的中央就不能再走了) (1)筹备一个栈(寄存目前的整条门路),一个Set(寄存遍历过的节点,登记表),登程节点为A,把A放到栈和Set中,同时打印A的值(入栈就打印) (2)弹出栈顶元素M,遍历M的所有街坊节点next,查看Set中有没有这些next节点,无则将M和此时的next节点入栈、next放到Set中,打印next的值(入栈就打印),终止遍历next节点(即只入栈一个Set中不蕴含的节点) (3)始终执行第2步,直到栈为空 /** * 图的深度优先遍历 * * @author Java和算法学习:周一 */public static void dfs(Node node) {    if (node == null) {        return;    }    Stack<Node> stack = new Stack<>();    HashSet<Node> set = new HashSet<>();    Node current = node;    stack.add(current);    set.add(current);    // 入栈就打印    System.out.println(current.value);    while (!stack.isEmpty()) {        current = stack.pop();        for (Node next : current.nexts) {            if (!set.contains(next)) {                stack.add(current);                stack.add(next);                set.add(next);                System.out.println(next.value);                // 只入栈一个Set中不蕴含的节点                break;            }        }    }}3、图的拓扑排序有向无环图才有拓扑排序 (1)打印以后图中入度为0的节点(多个为0,先打印谁均可) (2)从图中移除曾经打印的节点(天然,这些节点间接连贯的边也移除) (3)始终执行1、2步,直到图的节点为空 /** * 图的拓扑排序 * * @author Java和算法学习:周一 */public static List<Node> topologySort(Graph graph) {    // Key:节点,Value:残余入度    HashMap<Node, Integer> inMap = new HashMap<>();    // 寄存入度为0的节点    Queue<Node> zeroInQueue = new LinkedList<>();    for (Node node : graph.nodes.values()) {        // 将最后给定的图中所有节点放到inMap中        inMap.put(node, node.in);        if (node.in == 0) {            // 最后入度为0的节点            zeroInQueue.add(node);        }    }    List<Node> result = new ArrayList<>();    while (!zeroInQueue.isEmpty()) {        Node current = zeroInQueue.poll();        result.add(current);        for (Node next : current.nexts) {            // 将曾经遍历过的节点的街坊节点的入度减一(能够了解为从图中移除current节点)            inMap.put(next, inMap.get(next) - 1);            if (inMap.get(next) == 0) {                // 批改后的节点入度为0,放到zeroInQueue队列中                zeroInQueue.add(next);            }        }    }    return result;}五、最小生成树算法要求是无向图,在所有点都连通的状况下,所有权重值加起来最小的边造成的树。 1、Kruskal算法应用并查集 (1)总是从权值最小的边开始找,顺次找权值顺次变大的边(权值相等任选其一) (2)如果以后的边进入最小生成树的汇合中不会造成环,就要以后边;否则舍弃 (3)找完所有边之后,最小生成树的汇合也就失去了 /** * Kruskal算法——应用并查集 * * @author Java和算法学习:周一 */public static Set<Edge> kruskal(Graph graph) {    UnionFind unionFind = new UnionFind(graph.nodes.values());    // 以权重值为规范的小根堆    PriorityQueue<Edge> smallEdgeQueue = new PriorityQueue<>((a, b) -> a.weight - b.weight);    // 小根堆放入所有的边    for (Edge edge : graph.edges) {        smallEdgeQueue.offer(edge);    }    Set<Edge> result = new HashSet<>();    while (!smallEdgeQueue.isEmpty()) {        Edge edge = smallEdgeQueue.poll();        // 小根堆堆顶的边对应的节点不会造成环(即两个点不在同一个汇合中),才往后果集中增加,否则舍弃        if (!unionFind.isSameSet(edge.from, edge.to)) {            result.add(edge);            unionFind.union(edge.from, edge.to);        }    }    return result;}2、Prim算法(1)能够从任意节点登程来寻找最小生成树 (2)某个点退出到被选取的点中后,解锁这个点登程的所有新边 (3)在所有解锁的边当选最小的边,而后看这个边退出到被解锁的点中后会不会造成环 (4)如果会,舍弃以后边,返回第3步;如果不会,保留以后边,将该边的指向点解锁,此边退出到后果中,返回第2步 (5)当所有点都被解锁时,最小生成树就失去了 ...

January 27, 2022 · 1 min · jiezi

关于算法:机器学习算法系列十四硬间隔支持向量机算法Hardmargin-Support-Vector-Machine

浏览本文须要的背景知识点:拉格朗日乘子法、KKT条件、一丢丢编程常识 一、引言 后面一节咱们介绍了一种分类算法——奢侈贝叶斯分类器算法,从概率分布的角度进行分类。上面咱们会花几节来介绍另一种在分类问题中有着重要位置的算法——反对向量机1 (Support Vector Machine/SVM)。 SVM从根底到简单能够分成三种别离为线性可分反对向量机(也就是硬距离反对向量机)、线性反对向量机(软距离反对向量机)、非线性反对向量机(核函数反对向量机),这一节先来介绍第一种最根底的算法——硬距离反对向量机算法(Hard-margin Support Vector Machine)。 二、模型介绍原始模型 先来看下图,展现了一组线性可分的数据集,其中红点示意 -1、蓝叉示意 1 ,能够看到将该数据集离开的直线有有限多条,那么如何抉择一条绝对适合的直线呢?如下图中的两条直线 A、B,直观上仿佛直线 A 比直线 B 更适宜作为决策边界,因为对于直线 B,离某些样本点过于近,尽管仍然能正确分类样本点,但当在该样本点左近预测时,会失去齐全不同的后果,仿佛不合乎直觉,其泛化能力更差一些,而反观直线 A,其更具备鲁棒性。 <center>图2-1</center> 依据下面的推断,咱们的指标为找到一条直线(多维时为超平面),使得任意样本点到该超平面的间隔的最小值最大。超平面表达式如下: $$w^Tx + b = 0$$ <center>式2-1</center> 同时使得每个样本点都在正确的分类上面,即满足下式: $$\left\{\begin{array}{c}w^{T} x_{i}+b>0 & y_{i}=+1 \\w^{T} x_{i}+b<0 & y_{i}=-1\end{array} \quad \Rightarrow \quad y_{i}\left(w^{T} x_{i}+b\right)>0\right.$$ <center>式2-2</center> 察看下图,能够将问题转化为找到两个超平面 A、C,使得两个超平面之间的间隔最大,同时每个样本点分类正确。 <center>图2-2</center> 无妨假如超平面 A 为 wx + b = 1,超平面 B 为 wx + b = -1(因为 w、b 都能够成比例缩放,所以必然能够找到对应的值使得上式成立),同时分类正确的条件如下: ...

January 27, 2022 · 10 min · jiezi

关于算法:YOLO-V2

原文:https://zhuanlan.zhihu.com/p/... YOLO V2 概述先解释概念:Yolov2和Yolo9000算法内核雷同,区别是训练形式不同:Yolov2用coco数据集训练后,能够辨认80个品种。而Yolo9000能够应用coco数据集 + ImageNet数据集联结训练,能够辨认9000多个品种。图一为Yolo9000的检测效果图,能够看到图片中的人,被分为了leader、American、skin-diver、athlete。 预测更精确 1. batch normalization(批归一化)

January 26, 2022 · 1 min · jiezi

关于算法:并查集练习LeetCode200-岛屿数量

岛屿数量1、题目形容LeetCode200:  https://leetcode-cn.com/probl... 给你一个由 '1'(海洋)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水突围,并且每座岛屿只能由程度方向和竖直方向上相邻的海洋连贯造成。 此外,你能够假如该网格的四条边均被水突围。 2、示例输出:grid = [   ["1","1","1","1","0"],   ["1","1","0","1","0"],   ["1","1","0","0","0"],   ["0","0","0","0","0"] ] 输入:1 3、思路(1)应用感化的办法1)从左往右、从上往下挨个遍历这个二维数组,当值为 '1' 时,将其左近上下左右一片的 '1' 批改为2 2)每批改一次,就将岛的数量 +1,最初返回的即是岛屿数量 (2)应用并查集1)将每个点初始化为只有本人的汇合 2)从左往右、从上往下挨个遍历二维数组,如果是‘1’则与右边的‘1’、上边的‘1’合并 3)最初汇合的数量就是岛的数量 有个问题:不同的‘1’示意不同的海洋,如何辨别不同的‘1’。包一层。这种办法工夫复杂度的常数工夫比拟大。 (3)应用优化后的并查集为了解决,不同的‘1’示意不同的海洋,如何辨别不同的‘1’这个问题,应用一维数组重新处理,将原来(i,j)地位的数映射到数组(i * 列数 + j)的地位上 4、代码(1)应用感化的办法/** * 1、应用染色办法 *  * 工夫复杂度O(m*n) *  * @author Java和算法学习:周一 */public static int numIslands(char[][] grid) {    int result = 0;    // 挨个遍历整个二维数组    for (int i = 0; i < grid.length; i++) {        for (int j = 0; j < grid[0].length; j++) {            // 此时地位上是‘1’,则批改四周一片的‘1’,同时岛的数量加1            if (grid[i][j] == '1') {                result++;                infect(grid, i, j);            }        }    }    return result;}/** * 从(i,j)地位开始,将四周连成一片的‘1’字符批改为2的ASCII */private static void infect(char[][] grid, int i, int j) {    if (i < 0 || i == grid.length || j < 0 || j == grid[0].length || grid[i][j] != '1') {        return;    }    grid[i][j] = 2;    infect(grid, i - 1, j);    infect(grid, i + 1, j);    infect(grid, i, j - 1);    infect(grid, i, j + 1);}(2)应用原始并查集/** * 2、应用最原始的并查集 * * @author Java和算法学习:周一 */public static int numIslands1(char[][] board) {    int row = board.length;    int col = board[0].length;    // 为了辨别不同的'1',应用Dot包一层    Dot[][] dots = new Dot[row][col];    List<Dot> dotList = new ArrayList<>();    for (int i = 0; i < row; i++) {        for (int j = 0; j < col; j++) {            if (board[i][j] == '1') {                // dots非空示意海洋,空示意水                dots[i][j] = new Dot();                dotList.add(dots[i][j]);            }        }    }    UnionFind1<Dot> uf = new UnionFind1<>(dotList);    // 独自合并第一行    for (int j = 1; j < col; j++) {        if (board[0][j - 1] == '1' && board[0][j] == '1') {            uf.union(dots[0][j - 1], dots[0][j]);        }    }    // 独自合并第一列    for (int i = 1; i < row; i++) {        if (board[i - 1][0] == '1' && board[i][0] == '1') {            uf.union(dots[i - 1][0], dots[i][0]);        }    }    // 通过后面两个循环后,就不须要判断是否越界了    for (int i = 1; i < row; i++) {        for (int j = 1; j < col; j++) {            if (board[i][j] == '1') {                // 和上边的‘1’合并                if (board[i][j - 1] == '1') {                    uf.union(dots[i][j - 1], dots[i][j]);                }                // 和右边的‘1’合并                if (board[i - 1][j] == '1') {                    uf.union(dots[i - 1][j], dots[i][j]);                }            }        }    }    // 最初汇合的大小就是岛的数量    return uf.size();}(3)应用优化后的并查集   /** * 3、应用优化后的并查集 * 同时将原来(i,j)地位的数映射到数组(i * 列数 + j)的地位上 * * @author Java和算法学习:周一 */public static int numIslands2(char[][] board) {    int row = board.length;    int col = board[0].length;    UnionFind2 uf2 = new UnionFind2(board);    // 合并第一行    for (int i = 1; i < row; i++) {        if (board[i - 1][0] == '1' && board[i][0] == '1') {            uf2.union(i - 1, 0, i, 0);        }    }    // 合并第一列    for (int j = 1; j < col; j++) {        if (board[0][j - 1] == '1' && board[0][j] == '1') {            uf2.union(0, j - 1, 0, j);        }    }    // 合并其余行列数据    for (int i = 1; i < row; i++) {        for (int j = 1; j < col; j++) {            if (board[i][j] == '1') {                // 合并右边的                if (board[i - 1][j] == '1') {                    uf2.union(i, j, i - 1, j);                }                // 合并上边的                if (board[i][j - 1] == '1') {                    uf2.union(i, j, i, j - 1);                }            }        }    }    return uf2.set;}5、测试(1)应用染色的办法 (2)应用原始并查集 (3)应用优化后的并查集 6、所有代码限于文章篇幅,以及进步浏览体验,下面代码只列出了最外围的局部,所有代码 Github地址:https://github.com/monday-pro/algorithm-study/blob/master/src/basic/unionfind/NumIslands.java Gitee地址:https://gitee.com/monday-pro/algorithm-study/blob/master/src/basic/unionfind/NumIslands.java

January 26, 2022 · 1 min · jiezi

关于算法:力扣刷题笔记

LeetCode自用笔记数组27.移除元素给你一个数组 nums 和一个值 val,你须要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要应用额定的数组空间,你必须仅应用 O(1) 额定空间并 原地 批改输出数组。元素的程序能够扭转。你不须要思考数组中超出新长度前面的元素。暴力算法C 剖析:外层循环管制数组判断,内层循环用于笼罩数组元素int removeElement(int* nums, int numsSize, int val) { int i, j; int len = numsSize; for (i = 0; i < len; i++) { if (nums[i] == val) { j = i+1; while (j < len) { nums[j-1] = nums[j];//j-1是避免下标越界 j++; } len--; i--;//len--的状况下i肯定要-- } } return len;}JAVA /*工夫复杂度:O(n^2)空间复杂度:O(1)*/public int removeElement(int[] nums, int val) { int n = nums.length; for(int i=0;i<n;i++){ if(nums[i]==val){ for(int j=i+1;j<n;j++){ nums[j-1] = nums[j]; // 小心越界 } i--;// 因为下标i当前的数值都向前挪动了一位,所以i也向前挪动一位 n--; } } return n; }双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下实现两个for循环的工作C ...

January 25, 2022 · 17 min · jiezi

关于算法:MindSpore网络实战系列使用ResNet50实现图像分类任务

摘要: 承接上一篇LeNet网络模型的图像分类实际,本次咱们再来意识一个新的网络模型:ResNet-50。不同网络模型之间的次要区别是神经网络层的深度和层与层之间的连贯形式,注释内容咱们就剖析下应用ResNet-50进行图像分类有什么神奇之处,以下操作应用MindSpore框架实现。 1.网络:ResNet-50 对于相似LeNet网络模型深度较小并且参数也较少,训练起来会绝对简略,也很难会呈现梯度隐没或爆炸的状况。但ResNet-50的深度较大,训练起来就会比拟艰难,所以在加深网络深度的同时提出残差学习的构造来加重深层网络训练的难度。从新构建了网络以便学习蕴含推理的残差函数,而不是学习未通过推理的函数。试验结果显示,残差网络更容易优化,并且加深网络层数有助于进步正确率。 深度模型的限度深度卷积网络在图像分类工作上有十分优良的体现。深度网络依赖于多层端到端的形式,集成了低中高三个档次的特色和分类器,并且这些特色的数量还能够通过重叠层数来减少。这也展现出了网络深度十分重要。 然而随着网络层数的减少,训练时就会遇到梯度隐没或爆炸的状况,这会在一开始就影响收敛。收敛的问题能够通过正则化来失去局部的解决,但也不是通用的办法。并且在深层网络可能收敛的前提下,随着网络深度的减少,正确率开始饱和甚至降落,称之为网络的进化。 图1:56层和20层网络效果图 通过上图1能够发现在不扭转网络结构的状况下,仅加深网络深度的56层网络相较于20层在误差上体现都更大。 ResNet-50的残差构造对于网络进化景象并不是过拟合造成的。在给定的网络上减少层数就会增大训练误差。这阐明不是所有的零碎都很容易优化。咱们能够先剖析一个浅层的网络架构和在它根底上构建的深层网络,如果减少的所有层都是前一层的间接复制(即y=x),这种状况下深层网络的训练误差应该和浅层网络相等。因而,网络进化的根本原因还是优化问题。为了解决优化的难题,大佬们提出了残差网络,在ResNet-50中残差网络结构可分为Identity Block和Conv Block,上面别离介绍下。 Identity Block:在残差网络中,不是让网络间接拟合原先的映射,而是拟合残差映射。意味着前面的特色层的内容会有一部分由后面的某一层线性奉献。假如原始的映射为 H(x),残差网络拟合的映射为:F(x):=H(x)。输出和输入的维度(通道数和Size)是一样的,所以能够串联,它的次要用途是加深网络的深度。 图2:Identity Block构造 如图2中所示,identity mapping会间接跳过两头一些网络层,建设了一些快捷链接,间接恒等映射过来。这样的快捷链接不会减少模型的复杂度和参数。 Conv Block:在Identity Block的残差构造根底上,又减少了Conv的过程。输出和输入的维度(通道数和Size)是不一样的,所以不能进行间断的串联,它的作用是扭转网络的维度,所以残差边上新增了卷积。 图3:Conv Block构造 如图3中所示,Conv Block将在残差的通道上通过一轮卷积解决。再将卷积解决后的后果给到前面的网络层中。 Conv Block的具体设置须要看Block的输出和输入,对照通道数和Size的变动,设定合乎需要的Conv。 ResNet-50的整体构造下面理解完了残差构造和用处,当初咱们再带入到ResNet-50中看下整体的构造 图4:ResNet结构图 从左到右顺次的剖析,图4最右边是ResNet-50的步骤图,前面是将每个步骤再拆解Input stem是失常的输出和解决。Stage1->Stage4就是蕴含了加深网络深度的Identity Block和Conc Block的模块,同时防止了计算训练艰难和网络的进化的问题。 ResNet-50的调用MindSpore已上线反对该模型,咱们能够间接调用该模型的接口,所以咱们在应用过程中传入定义好的超参数和数据即可。 如果想要理解下更底层的参数设置,能够查看https://gitee.com/mindspore/m...。 论文链接:https://arxiv.org/pdf/1512.03... 2.数据集:CIFAR-10 数据集CIFAR-10由10个类的60000个32x32彩**像组成,每个类有6000个图像。有50000个训练图像和10000个测试图像。 数据集构造CIFAR-10数据集的原文连贯中蕴含三种类型的数据集,这里能够依据本人的需要进行下载。这里咱们应用python版本数据集。 Version                                               Size CIFAR-10 python version                                     163 MB ...

January 25, 2022 · 1 min · jiezi

关于算法:集成学习的偏差和方差

简介: 咱们常常用过拟合、欠拟合来定性地形容模型是否很好地解决了特定的问 题。从定量的角度来说,能够用模型的偏差(Bias)与方差(Variance)来形容模型的性能。集成学习往往可能“神奇”地晋升弱分类器的性能。 一、 偏差和方差怎么来的 如果咱们用训练数据集去训练一个模型,通常的做法是须要定义一个误差函数,接着是将这个误差的最小化过程,来进步模型的性能。不过单纯地将训练数据集的损失最小化,并不能保障在解决更个别的问题时模型依然是最优,甚至不能保障模型是可用的。这个训练数据集的损失与一般化的数据集的损失之间的差别就叫做泛化误差(generalization error)。泛化误差咱们也能够合成为偏差(Biase)和(Variance)两局部。 泛化误差(generalization error)=偏差(Biase)+方差(Variance) 二、 什么是偏差和方差 什么是模型的偏差和方差,Boosting和Bagging办法与偏差和方差的关系是什么,如何依据偏差和方差这两个指标来领导模型的优化和改良。 在有监督学习中,模型的泛化误差来源于两个方面——偏差和方差,具体来 讲偏差和方差的定义如下: 偏差指的是由大小为m的训练数据集训练出的模型的输入的平均值和实在模型输入之间的偏差。偏差通常是因为咱们对学习算法做了谬误的假如所导致的,比方实在模型是某个二次函数,但咱们假如模型是一次函数。由偏差带来的误差通常在训练误差上就能体现进去。 偏差的计算方法:image.png 方差指的是由大小为m的训练数据集训练出的所有模型的输入的方差。方差通常是因为模型的复杂度绝对于训练样本数m过高导致的,比方一共有100个训练样本,而咱们假如模型是阶数不大于200的多项式函数。由方差带来的误差通常体现在测试误差绝对于训练误差的增量上。 方差的计算方法:image.png 通过下面的定义咱们可能很难直观的了解很精确,为了更清晰的了解偏差和方差,咱们用一个投靶游戏的例子来进一步形容这二者的区别和分割。假如一次投靶就是一个机器学习模型对一个样本进行预测。射中靶心地位代表预测精确,偏离靶心越远代表预测误差越大。咱们通过n次采样失去n个大小为m的训练样本汇合,训练出n个模型,对同一个样本做预测,相当于咱们做了n次投靶,投靶后果如图1所示。咱们最冀望的后果就是左上角的后果,投靶后果又精确又集中,阐明模型的偏差和方差都很小;右上图尽管投靶后果的核心在靶心四周,但散布比拟扩散,阐明模型的偏差较小但方差较大;同理,左下图阐明模型方差较小,偏差较大;右下图阐明模型方差较大,偏差也较大。 image.png 图1:偏差与方差示意图 三、 如何减小偏差和方差 咱们通过Boosting和Bagging进行剖析,简略答复这个问题就是:Bagging可能进步弱分类器性能的起因是升高了方差,Boosting可能晋升弱分类器性能的起因是升高了偏差。为什么这么讲呢? 首先,Bagging是Bootstrap Aggregating的简称,意思就是再抽样,而后在每个样本上训练进去的模型取均匀。 假如有n个随机变量,方差记为2,两两变量之间的相关性为,则n个随机变量的均值image.png的方差为image.png。在随机变量齐全独立的状况下,n个随机变量的方差为2/n,也就是说方差减小到了原来的1/n。 再从模型的角度了解这个问题,对n个独立不相干的模型的预测后果取均匀,方差是原来单个模型的1/n。当然,模型之间不可能齐全独立。为了谋求模型的独立性,诸多Bagging的办法做了不同的改良。比方在随机森林算法中,每次选取节点决裂属性时,会随机抽取一个属性子集,而不是从所有属性中选取最优属性,这就是为了防止弱分类器之间过强的相关性。通过训练集的重采样也可能带来弱分类器之间的肯定独立性,从而升高Bagging后模型的方差。 再看Boosting,在训练好一个弱分类器后,咱们须要计算弱分类器的谬误或者残差,作为下一个分类器的输出。这个过程自身就是在一直减小损失函数,来使模型一直迫近“靶心”,使得模型偏差一直升高。但Boosting的过程并不会显著升高方差。这是因为Boosting的训练过程使得各弱分类器之间是强相干的,不足独立性,所以并不会对升高方差有作用。 四、 偏差和方差的互相关系 对于泛化误差、偏差、方差和模型复杂度的关系如图2所示。不难看出,方 差和偏差是相辅相成,矛盾又对立的,二者并不能齐全独立的存在。对于给定的 学习工作和训练数据集,咱们须要对模型的复杂度做正当的假如。如果模型简单 度过低,尽管方差很小,然而偏差会很高;如果模型简单度过高,尽管偏差升高 了,然而方差会很高。所以须要综合思考偏差和方差抉择适合复杂度的模型进行 训练。一般来说,简略的模型会有一个较大的偏差和较小的方差,简单的模型偏差较小方差较大。 image.png 五、 总结 本次分享咱们次要理解了泛化误差的两个组成部分偏差和方差,以及形象的形容了它们在模型预测中的特色景象。并且剖析了在集成学习中Bagging办法有减小方差、Boosting有减小偏差的起因。偏差和方差是有互相关系的,设置模型比较复杂的时候可能有偏差小方差大的景象,模型简略的时候会有偏差大方差小的景象。所以须要依据数据的状况抉择正当的模型,才可能防止遇到以上状况。

January 25, 2022 · 1 min · jiezi

关于算法:集成学习的基本步骤

简述: 尽管集成学习的具体要应用的算法和策略有所雷同,但在实现过程中都共享同样的操作步骤。本次分享联合具体的集成学习算法,剖析下集成学习的具体过程。 一. 根本步骤 集成学习大抵能够概括为以下3个大的步骤。 (1)找到误差相互独立的基分类器。 (2)训练基分类器。 (3)合并基分类器的后果。 合并基分类器的办法有voting和stacking两种。前者是用投票的形式,将取得最多选票的后果作为最终的后果。后者是用串行的形式,把前一个基分类器的后果输入到下一个分类器,将所有基分类器的输入后果相加(或者用更简单的算法交融,比方把各基分类器的输入作为特色,应用逻辑回归作为交融模型进行最初的后果预测)作为最终的输入。 image.png 二. Adaboost 以Adaboost为例,基分类器的合并办法是投票,其基分类器的训练和合并的根本步骤如下。 (1)确定基分类器:这里能够选取ID3决策树作为基分类器。事实上,任何分类模型都能够作为基分类器,但树形模型因为构造简略且较易产生随机性所以比拟罕用。 (2)训练基分类器:假如训练集为{xi,yi},i=1,...,N,其中yi{-1,1},并且有T个基分类器,则能够依照如下过程来训练基分类器。 初始化采样散布D1(i)=1/N; 令 t = 1, 2,..., T 循环: 从训练集中,依照Dt散布,采样出子集image.png; 用St训练出基分类器ht; 计算ht的错误率:image.png,其中I[]为判别函数; 计算基分类器ht权重image.png; 设置下一次采样 image.png 并将它归一化为一个概率分布函数。 (3)合并基分类器:给定一个未知样本z,输入分类后果为加权投票的后果image.png。 三. GBDT GBDT的全称是Gradient Boosting Decision Tree(梯度晋升树)。它的基分类器的是通过串行的形式合并起来的,本次咱们只是介绍下基分类器的合并办法,所以在GBDT的原理上先不过多介绍。咱们的目标:用较弱的树模型组合出一个强模型image.png,来进行样本的预测。 (1)确定基模型:尽管树形模型既能够用于分类训练也能够回归训练,但值得注意的是GBDT只能选取回归决策树作为基模型。但能够满足大多的场景。本次应用的样本集示意为image.png,损失函数:image.png,每个基模型表示为image.png。 (2)训练基模型:初始化image.png,先找到最合适的参数image.png,使得image.png最小,模型初始化image.png。 如果这里的损失函数是均方误差,咱们通过image.png能计算失去各样本点预测的残差,咱们要拟合的样本集就变成了image.png,依照第一次拟合的套路找最合适的image.png来拟合这个汇合。 (3)合并基模型:最初模型合并降级为image.png。 以上就是简略的GBDT串行合并的办法。 四. 总结 本次的分享内容次要是通过Adaboost和GBDT两种算法剖析的集成学习的通用步骤,Adaboost和GBDT的次要区别是基模型的不同和合并基分类器的形式不同。Adaboost应用分类树为基模型+voting的合并办法;GBDT应用回归树为基模型+stacking的合并办法。

January 25, 2022 · 1 min · jiezi

关于算法:浅析集成学习的策略

一. 简述 面对一个机器学习问题,通常有两种策略。一种是开发人员尝试各种模型,抉择其中体现最好的模型做重点调参优化。这种策略相似于奥运会较量,通过强强竞争来提拔最优的运动员,并逐步提高问题。另一种重要的策略是集各家之长,如同贤明的君主宽泛地听取泛滥谋臣的倡议,而后综合思考,失去最终决策。后一种策略的外围,是将多个分类器的后果对立成一个最终的决策。应用这类策略的机器学习办法统称为集成学习。其中的每个独自的分类器称为基分类器。 俗语说“三个臭皮匠,顶一个诸葛亮”,基分类器就相似于“臭皮匠”,而之前介绍的很多简单模型能够认为是“诸葛亮”。即便繁多一个“臭皮匠”的决策能力不强,咱们无效地把多个“臭皮匠”组织联合起来,其决策能力很有可能超过“诸葛亮”。而如何将这些基分类器集成起来。 集成学习不仅在学界的钻研热度不减,在业界和泛滥机器学习比赛中也有十分胜利的利用。例如在Kaggle比赛中所向无敌的XGBoost,就是胜利利用集成学习思维的一个例子。 二. Bossting Boosting办法训练基分类器时采纳串行的形式,各个基分类器之间有依赖。它的基本思路是将基分类器层层叠加,每一层在训练的时候,对前一层基分类器分错的样本,给予更高的权重。测试时,依据各层分类器的后果的加权失去最终后果。Boosting的过程很相似于人类学习的过程,咱们学习新常识的过程往往是迭代式的,第一遍学习的时候,咱们会记住一部分常识,但往往也会犯一些谬误,对于这些谬误,咱们的印象会很深。第二遍学习的时候,就会针对犯过谬误的常识增强学习,以缩小相似的谬误产生。一直周而复始,直到犯错误的次数缩小到很低的水平。 image.png 三. Bagging Bagging与Boosting的串行训练形式不同,Bagging办法在训练过程中,各基分类器之间无强依赖,能够进行并行训练。其中很驰名的算法之一是基于决策树基分类器的随机森林(Random Forest)。为了让基分类器之间相互独立,将训练集分为若干子集(当训练样本数量较少时,子集之间可能有交叠)。Bagging办法更像是一个个体决策的过程,每个个体都进行独自学习,学习的内容能够雷同,也能够不同,也能够局部重叠。但因为个体之间存在差异性,最终做出的判断不会完全一致。在最终做决策时,每个个体独自作出判断,再通过投票的形式做出最初的个体决策。 image.png 咱们再从打消基分类器的偏差和方差的角度来了解Boosting和Bagging办法的差别。基分类器,有时又被称为弱分类器,因为基分类器的错误率要大于集成分类器。基分类器的谬误,是偏差和方差两种谬误之和。偏差次要是因为分类器的表达能力无限导致的系统性谬误,体现在训练误差不收敛。方差是因为分类器对于样本分布过于敏感,导致在训练样本数较少时,产生过拟合。 Boosting办法是通过逐渐聚焦于基分类器分错的样本,减小集成分类器的偏差。Bagging办法则是采取分而治之的策略,通过对训练样本屡次采样,并别离训练出多个不同模型,而后做综合,来减小集成分类器的方差。假如所有基分类器出错的概率是独立的,在某个测试样本上,用简略少数投票办法来集成后果,超过半数基分类器出错的概率会随着基分类器的数量减少而降落。 图是Bagging算法的示意图,Model 1、Model 2、Model 3都是用训练集的一个子集训练进去的,独自来看,它们的决策边界都很波折,有过拟合的偏向。集成之后的模型(红线所示)的决策边界就比各个独立的模型平滑了,这是因为集成的加权投票办法,减小了方差。 image.png 四. 总结 Boosting是一种框架算法,次要是通过对样本集的操作取得样本子集,而后用弱分类算法在样本子集上训练生成一系列的基分类器。他能够用来进步其余弱分类算法的识别率,也就是将其余的弱分类算法作为基分类算法放于Boosting 框架中,通过Boosting框架对训练样本集的操作,失去不同的训练样本子集,用该样本子集去训练生成基分类器;每失去一个样本集就用该基分类算法在该样本集上产生一个基分类器,这样在给定训练轮数 n 后,就可产生 n 个基分类器,而后Boosting框架算法将这 n个基分类器进行加权交融,产生一个最初的后果分类器,在这 n个基分类器中,每个单个的分类器的识别率不肯定很高,但他们联结后的后果有很高的识别率,这样便进步了该弱分类算法的识别率。

January 25, 2022 · 1 min · jiezi

关于算法:反向传播算法

一. 概述 多层网络的学习拟合能力比单层网络要弱小很多。所以想要训练多层网络,后面的简略感知机学习办法显然有些有余,须要拟合能力更加弱小的算法。反向流传算法( Back Propagation,BP)是其中的经典办法,它能够说是现今最胜利的神经网络算法,事实当中应用到神经网络时,大多是应用BP算法训练的。BP算法不仅能够用于多层前馈神经网络,还能够用于其余类型神经网络,例如LSTM模型,通常所说的BP网络,个别是用BP算法训练的多层前馈网络。 二. BP算法 咱们能够先通过BP网络的走向图大抵把握以下反向流传算法的次要用途,从输出层开始,数据进入到网络中通过每一层的计算变动,最终得出理论输入。而后和冀望输入做比拟计算损失值,此时的损失值将依照反方向逐步向前流传计算,通过梯度降落的形式优化网络中的参数,求取出符合要求的网络模型。如图1中所示: image.png 图1:BP网络结构图 接下来咱们将通过公式计算逐渐的展现BP网络的根本构造。最开始要假如咱们有一个固定训练汇合{(x1,y1),…,(xm,ym)},它的样本总数为m。这样咱们就能够利用批量梯度降落法来求解参数,也属于有监督学习办法。具体到每个样本(x,y),其代价函数为下式: image.png 对于给定有m个样本的数据集,咱们能够定义整体的代价函数为: image.png 上式中的第一项J(w,b)是均方差项。而第二项则是规则化项,是用来束缚解以达到构造危险最小化( Structural risk minimization,SRM),目标是避免模型呈现过拟合( over fitting)。 咱们利用梯度降落法,每一次迭代都依照上面的公式对参数W和b进行更新: image.png 其中是学习速率。关键步骤在于计算偏导数。咱们当初开始反向流传算法的介绍,它是计算偏导数的一种无效办法。 首先理解一下如何应用反向流传算法来计算image.png和image.png,这两项是单个样例(x,y)的代价函数J(W,b;x,y)的偏导数。只有咱们求出该偏导数,前面才能够推导出整体代价函数J(W,b)的偏导数: image.png 以上两行公式稍有不同,第一行比第二行多出一项,因为权重衰减是作用于W而不是b。 BP算法的总体流程:首先对每个样本数据,进行前向流传计算,顺次计算出每层每个单元的激活值。接着计算出第l层的每个节点i的“残差”值,该值间接体现了这个单元对最终的输入有多大的影响力。最初一层输入层则能够间接取得最终后果和输入后果的差值,咱们定义为(,而对于两头的暗藏层的残差,咱们则通过加权均匀上层(l+1层)残差来计算。 BP算法的具体推导过程如下: 1)前馈网络传导的计算,逐层算出L2到最初一层的每层节点的激活值。 2)计算各节点的残差值,对于输入层,应用如下公式: image.png 上式子中的推导过程如下: image.png 3)从最初一层顺次向前推导到第2层,第l层的残差为: image.png 推导可得出: image.png image.png 按照下面只需将nl替换为l就能够推导到中间层l与l=1的残差关系。能够更新所需的偏导数: image.png 最初得出BP算法的形容: 在上面的伪代码中,W0是一个与矩阵W维度雷同的矩阵,△b0是一个与b0维度雷同的向量。留神这里“W”是一个矩阵。上面,咱们实现批量梯度降落法中的一次迭代: 1)对于所有l,令△W0:=0,b0:=0(设置为全零矩阵或全零向量)。 2)对于i=1到m, a)应用反向流传算法计算image.png和image.png。 b)计算image.png。 c)计算image.png。 3)更新权重参数: image.png 当初,咱们能够反复梯度降落法的迭代步骤来减小代价函数J(w,b)的值,进而求解咱们的神经网络。 三. 总结 整体来说BP网络就是一种具备自我更新参数能力,还具备肯定的容错性和抗干扰性。反向流传算法的根本思维:学习过程由数据集信号的正向流传和误差的反向流传两个过程组成,数据集从输出层输出,经隐层解决当前,传向输入层。如果输入层的理论输入和冀望输入不合乎,就进入误差的反向流传阶段。反向流传阶段接管损失值逐渐前向求偏导,进行梯度降落更新参数,最初使得输入的后果合乎咱们的要求,模型训练实现。

January 25, 2022 · 1 min · jiezi

关于算法:自然语言处理文本向量化二

一. 摘要 本次分享内容是基于上篇文本向量办法的持续,上次内容中,次要分享了文本向量化的两种办法:词袋模型表示办法和基于深度学习词向量办法。词袋模型尽管可能很简略的将词示意为向量,但会造成维度劫难,并且不可能利用到文本中词程序等信息。NNLM模型的指标是构建一个语言概率模型,然而在nnlm模型求解的过程中,从暗藏层到输入层的权重计算是十分费时的一步。上面咱们将理解下C&W模型、CBOW模型和Skip-gram模型。 二. C&W模型 C&W模型是一个以生成词向量为指标的模型。在之前的NNLM模型中咱们理解到了他那难于计算的权重是一个十分大的阻碍。这里的C&W模型没有采纳语言模型的形式去求解词语上下文的条件概率,而是间接对n元短语打分。采纳的是一种更为疾速高效的获取词向量的形式。C&W模型的核心思想是:如果n元短语在语料库中呈现过,那么模型就会给该短语打出较高的分数;对于在语料库中未呈现过或呈现次数很少的短语则会失去较低的分数。C&W模型结构图如下: image.png 图1:C&W模型结构图 绝对于整个语料库来说,C&W模型须要优化的指标函数为: image.png 图2:C&W模型指标函数 其中,(w,c)为从语料中抽取的n元短语,为保障上下文词数量的一致性,所以n为奇数;w是指标词;c示意指标词的上下文语境;w’是从词典中随机抽取出的一个词语。C&W模型采纳的是成对词语的形式对指标函数进行优化。通过图2中的表达式可知,指标函数冀望正样本的得分比负样本至多高1分。这里的(w,c)示意正样本,这些样本来自语料库;(w’,c)示意的负样本,负样本是将正样本序列的两头词替换成其它词失去的。通常状况是,用一个随机的词语替换正确文本序列的两头词,由此得出的新的文本序列根本就是不合乎语法习惯的序列,因而这种结构负样本的办法是正当的。并且负样本是仅仅批改了正样本序列中某一个两头词失去的,所以整体的语境是没有扭转的,因而也不会对分类成果造成很大成果。 与NNLM模型的指标词在输入层不同,C&W模型的输入层就蕴含了指标词,其输入层也变成一个节点,并且该节点的输入值大小代表着元短语的打分高下。相应的C&W模型的最初一层的运算次数为|h|,远低于NNLM模型中的|V|×|h|次。在权重计算量方面,相较NNLM模型,C&W模型可大大降低运算量。 三. CBOW模型和Skip-gram模型 为了可能进步获取词向量的效率,通过一直地尝试总结,在NNLM和C&W模型的根底上,得出了CBOW(Continuous Bag of-Words)模型和Skip-gram模型。 CBOW模型是应用一段文本的两头词当作指标词,并且在结构上,去掉了暗藏层,这样能够使运行的速率大幅度的晋升,节俭掉很多的权重矩阵计算。此外CBOW模型应用上下文各词的词向量平均值代替NNLM模型各个拼接的词向量。因为CBOW模型去除掉了暗藏层,所以其输出层就是语义上下文的示意。 image.png 图3:CBOW模型结构图 CBOW模型对指标词的条件概率计算表达式为: image.png 图4:CBOW概率计算表达式 CBOW模型基于神经网络的个别模式: image.png 图5:CBOW模型个别模式 CBOW模型的指标函数与NNLM模型相似,具体为最大化式: image.png 图6:模型最大化局部 Skip-gram模型的构造同样也是没有暗藏层。和CBOW模型不同的是输出上下文的均匀词向量。Skip-gram模型是从指标词w的上下文中抉择一个词,将其词向量组成上下文的示意。 image.png 图7:Skip-gram模型结构图 Skip-gram模型基于神经网络的个别模式: image.png 图8:Skip-gram模型个别模式 对于整个语料库来说,Skip-gram模型的指标函数表达式为: image.png 图9:Skip-gram模型指标函数表达式 Skip-gram模型和CBOW模型实际上属于word2vec两种不同策略的实现办法:其中的CBOW的策略是依据上下文输出来预测以后词语的概率,并且上下文中的所有的词对以后词呈现概率的影响的权重是雷同的,因而也叫continuous bag-of-words模型。就相似从一个袋子中取词,取出数量足够的词就能够了,而对于取出的程序是没有要求的。Skip-gram模型则刚好相同,它的策略和目标是将以后词当作输出,用来预测上下文概率。 总结 本次内容中的两个模型思维都属于word2vec范畴。在NLP中,如过将x看作一个句子中的一个词语,y是这个词语的上下文,那么咱们须要一个语言模型f(),这个模型的使命就是判断(x,y)这个样本是否合乎自然语言的规定。Word2vec并不重视将这个语言模型训练的如许准确,而是关怀模型训练后失去的模型参数,并将这些参数作为x的向量化示意,这便是词向量的造成。基于此,便衍生了下面CBOW模型和Skip-gram模型。

January 25, 2022 · 1 min · jiezi

关于算法:并查集

一、啥是并查集1、解释看下维基百科的解释 啥?在说啥,看不懂?那说人话吧 艰深的说,并查集是一种数据结构,指在一些有N个元素的汇合利用问题中,通常在开始时让每个元素形成一个单元素的汇合,而后按肯定程序将属于同一组的元素所在的汇合合并,其间要重复查找一个元素在哪个汇合中。用于解决一些不相交汇合的合并及查问问题。 2、有啥劣势在足够多的合并和查问操作后,均摊下来单次的查问工夫复杂度是O(1)。 3、作用解决相似图的连通性问题大量应用并查集。 二、次要操作1、初始化:把每个点所在汇合初始化为其本身 通常来说,这个步骤在每次应用该数据结构时只须要执行一次,无论何种实现形式,工夫复杂度均为O(N)。 2、查找:查找元素所在的汇合,即此汇合的代表节点——根节点 3、合并:将两个元素所在的汇合合并为一个汇合。汇合小的连到汇合大的 通常来说,合并之前,应先判断两个元素是否属于同一汇合,这可用下面的“查找”操作实现。 三、门路优化压缩1、思维:每次查找的时候,如果门路较长,则批改信息,以便下次查找的时候速度更快。 2、实现:第一步,找到根结点;第二步,批改查找门路上的所有节点,将它们都指向根结点。 为啥最初均摊的工夫复杂度是O(1)? 门路优化压缩是要害 因为每次在查找时,都会把此门路上所有的节点从新全副间接连到根节点上,当前再查找时都是一步到位,一步就找到了根节点,除了查找根节点以外的操作自身就是O(1),而一个门路上从新调整的操作只会执行一次,所以最初均摊下来的工夫复杂度是O(1)。 对于工夫复杂度O(1)的证实 并查集最早由Bernard A. Galler和Michael J. Fischer于1964年提出,然而直到Fredman 和 Saks 在 1989 年才证实了任何并查集都须要O(1)的均摊工夫来实现每次操作,25年才证实实现。 四、外围办法/** * @author Java和算法学习:周一 */public static class UnionFind<V> {    // 用户输出的V对应外部的Node<V>    public HashMap<V, Node<V>> nodes;    // Node<V>的父亲是谁    public HashMap<Node<V>, Node<V>> parents;    // Node<V>所在汇合的大小(只有汇合的代表节点<能够了解为头节点>才会放到sizeMap中)    public HashMap<Node<V>, Integer> sizeMap;    // 初始化时把用户给定的数据全副放到各个Map中    public UnionFind(List<V> values) {        nodes = new HashMap<>();        parents = new HashMap<>();        sizeMap = new HashMap<>();        for (V current : values) {            Node<V> node = new Node<>(current);            nodes.put(current, node);            // 初始化时node的父亲是本人            parents.put(node, node);            // 初始化时node的size是1            sizeMap.put(node, 1);        }    }}1、查找节点所在汇合的代表节点/** * 找到指定节点所在的代表节点 * * @author Java和算法学习:周一 */public Node<V> findHead(Node<V> node) {    Node<V> current = node;    Stack<Node<V>> stack = new Stack<>();    // 以后节点的父节点不是本人,阐明还没找到最顶    while (current != parents.get(current)) {        stack.push(current);        current = parents.get(current);    }    // 优化:批改查找门路上的所有节点,将它们都指向根结点    while (!stack.isEmpty()) {        parents.put(stack.pop(), current);    }    return current;}2、isSameSet(V a, V b)判断a、b所代表的两个汇合是否在同一个汇合中 /** * 判断两个节点所在汇合是不是同一个汇合 * * @author Java和算法学习:周一 */public boolean isSameSet(V a, V b) {    return findHead(nodes.get(a)) == findHead(nodes.get(b));}3、union(V a, V b)将a、b所代表的两个汇合合并为一个汇合 /** * 将两个节点所在汇合合并为一个汇合 * * @author Java和算法学习:周一 */public void union(V a, V b) {    Node<V> aHead = findHead(nodes.get(a));    Node<V> bHead = findHead(nodes.get(b));    if (aHead != bHead) { // 阐明a、b所在汇合不是同一个汇合        int aSize = sizeMap.get(aHead);        int bSize = sizeMap.get(bHead);        // 找到size更大的汇合        Node<V> big = aSize >= bSize ? aHead : bHead;        Node<V> small = big == aHead ? bHead : aHead;        // 小的连到大的下面(这也是一个优化)        parents.put(small, big);        // 从新调整big所在汇合的size        sizeMap.put(big, aSize + bSize);        // small所在汇合曾经连到big上,从sizeMap中移除        sizeMap.remove(small);    }}所有代码地址:https://github.com/monday-pro/algorithm-study/blob/master/src/basic/unionfind/TheUnionFind.java 五、省份数量问题1、题目形容LeetCode547 https://leetcode-cn.com/probl... 有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 间接相连,且城市 b 与城市 c 间接相连,那么城市 a 与城市 c 间接相连。 省份 是一组间接或间接相连的城市,组内不含其余没有相连的城市。 给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 示意第 i 个城市和第 j 个城市间接相连,而 isConnected[i][j] = 0 示意二者不间接相连。 ...

January 24, 2022 · 1 min · jiezi

关于算法:贪心算法2金条切割问题点灯问题IPO问题

明天再讲一篇对于利用贪婪算法解决的题目。 一、金条切割问题1、题目形容一块金条切成两半,是须要破费和长度数值一样的铜板的。比方长度为20的金条,不管怎么切,都要花费20个铜板。一群人想整分整块金条,怎么分最省铜板?输出一个数组,返回宰割的最小代价。 例如: 给定数组{10,20,30},代表一共三个人, 整块金条长度为10 + 20 + 30 = 60,金条要分成10, 20, 30三个局部(不思考程序)。 如果先把长度60的金条分成10和50,破费60;再把长度50的金条分成20和30,破费50;一共破费110铜板。 但如果先把长度60的金条分成30和30,破费60;再把长度30金条分成10和20,破费30;一共破费90铜板。 2、思路(1)筹备一个小根堆。将数组放到这个小根堆里。 (2)每次弹出堆顶的两个数求和为A,将A再放回小根堆里。 (3)始终执行第2步,直到堆只剩一个数。最初,每一次第二步A的累加和即是最初的后果。 例如给定的金条长度为150,要分成10、20、30、40、50的块,最初破费的铜板数量即是上图中蓝色圆圈的和,即150+60+90+30=330。 也就是咱们代码求解的时候是从叶子往根求的,求完后再从根往叶子即是金条的切割程序,最初所有的叶子即是须要切成的块的大小。 3、代码/** * @author Java和算法学习:周一 */public static int lessMoneySplitGold(int[] arr) {    if (arr == null || arr.length == 0) {        return 0;    }    // 筹备一个小根堆    Queue<Integer> queue = new PriorityQueue<>();    // 将所有数放到小根堆中    for (Integer s : arr) {        queue.offer(s);    }    int result = 0;    int current;    while (queue.size() > 1) {        // 每次弹出堆顶两个数求和        current = queue.poll() + queue.poll();        result += current;        queue.offer(current);    }    return result;}蕴含对数器的所有代码地址:https://github.com/monday-pro/algorithm-study/blob/master/src/basic/greedy/LessMoneySplitGold.java 二、点灯问题1、题目形容给定一个字符串str,只由 'X' 和 '.' 两种字符形成。'X’ 示意墙,不能放灯,点亮不点亮都可;'.' 示意居民点,能够放灯,须要点亮。如果灯放在i地位,能够让 i-1,i 和 i+1 三个地位被点亮。返回如果点亮str中所有须要点亮的地位,至多须要几盏灯。 2、思路(1)i 地位是 'X’,不论,来到 i + 1地位 (2)i 地位是 '.' ,i + 1是 'X’,i 地位须要放灯,来到 i + 2地位 (3)i 地位是 '.' ,i + 1是 '.',i + 2是 '.',i + 1 地位须要放灯,来到 i + 3地位(此步即是贪婪) (4)i 地位是 '.' ,i + 1是 '.',i + 2是 'X’,i 或 i + 1 地位须要放灯,来到 i + 3地位 ...

January 23, 2022 · 1 min · jiezi

关于算法:机器学习算法系列十二二次判别分析算法Quadratic-Discriminant-Analysis-Algorithm

浏览本文须要的背景知识点:线性判别分析、一丢丢编程常识 一、引言 后面两节介绍了线性判别分析在不同角度下的实现形式,一种是依据费舍尔“类内小、类间大”的角度,另一种则是从概率分布的角度。本节来介绍另一种判别分析——二次判别分析算法1(Quadratic Discriminant Analysis Algorithm/QDA) 二、模型介绍 同线性判别分析一样,从概率分布的角度来失去二次判别分析,区别在于线性判别分析假如每一种分类的协方差矩阵雷同,而二次判别分析中每一种分类的协方差矩阵不同。(1)同线性判别分析一样,咱们的目标就是求在输出为x的状况下分类为k的概率最大的分类,所以咱们能够写出假如函数如下图(1)式(2)对其概率取对数,不影响函数的最初后果(3)带入下面的P(k|x)的表达式,因为P(x)对最初后果也没有影响,也能够间接去掉(4)带入多元正态分布的概率密度函数表达式,留神这里与线性判别分析的不同,协方差矩阵在每一种类型下是不同的(5)将(4)式中的对数化简失去(6)这时就不能和线性判别分析一样去掉第二项了,而是要保留其中协方差矩阵行列式的局部,失去最初的后果 $$\begin{aligned}h(x) &=\underset{k}{\operatorname{argmax}} P(k \mid x) & (1)\\&=\underset{k}{\operatorname{argmax}} \ln P(k \mid x) & (2)\\&=\underset{k}{\operatorname{argmax}} \ln f_{k}(x)+\ln P(k) & (3) \\&=\underset{k}{\operatorname{argmax}} \ln \left(\frac{e^{-\frac{\left(x-\mu_{k}\right)^{T}{\Sigma_{k}^{-1}\left(x-\mu_{k}\right)}}{2}}}{\left|\Sigma_{k}\right|^{\frac{1}{2}}(2 \pi)^{\frac{p}{2}}}\right)+\ln P(k) & (4) \\&=\underset{k}{\operatorname{argmax}} -\frac{1}{2}\left(x-\mu_{k}\right)^{T} \Sigma_{k}^{-1}\left(x-\mu_{k}\right)-\ln \left(\left|\Sigma_{k}\right|^{\frac{1}{2}}(2 \pi)^{\frac{p}{2}}\right)+\ln P(k) & (5) \\&=\underset{k}{\operatorname{argmax}} -\frac{1}{2}\left(x-\mu_{k}\right)^{T} \Sigma_{k}^{-1}\left(x-\mu_{k}\right)-\frac{1}{2} \ln \left(\left|\Sigma_{k}\right|\right)+\ln P(k) & (6)\end{aligned}$$ 察看下面的(6)式,可知是对于x的二次函数,所以这也是该算法被称为二次判别分析算法的起因。 三、代码实现应用 Python 实现二次判别分析(QDA): def qda(X, y): """ 二次判别分析(QDA) args: X - 训练数据集 y - 指标标签值 return: y_classes - 标签类别 priors - 每类先验概率 means - 每类均值向量 sigmags - 每类协方差矩阵 dets - 每类协方差矩阵行列式 """ # 标签值 y_classes = np.unique(y) # 每类先验概率 priors = [] # 每类均值向量 means = [] # 每类协方差矩阵 sigmags = [] # 每类协方差矩阵行列式 dets = [] for idx in range(len(y_classes)): c = X[y==y_classes[idx]][:] # 先验概率 prior = c.shape[0] / X.shape[0] priors.append(prior) # 均值向量 mu = np.mean(c, axis=0) means.append(mu) # 协方差矩阵 sigma = c - mu sigma = sigma.T.dot(sigma) / c.shape[0] sigmags.append(np.linalg.pinv(sigma)) # 协方差矩阵行列式 dets.append(np.linalg.det(sigma)) return y_classes, priors, means, sigmags, detsdef discriminant(X, y_classes, priors, means, sigmags, dets): """ 判断新样本点 args: X - 数据集 y_classes - 标签类别 priors - 每类先验概率 means - 每类均值向量 sigmags - 每类协方差矩阵 dets - 每类协方差矩阵行列式 return: 分类后果 """ ps = [] for idx in range(len(y_classes)): x = X - means[idx] p = - 0.5 * (np.sum(np.multiply(x.dot(sigmags[idx]), x), axis=1) + np.log(dets[idx])) + priors[idx] ps.append(p) return y_classes.take(np.array(ps).T.argmax(1))四、第三方库实现scikit-learn2 实现线性判别分析: ...

January 22, 2022 · 2 min · jiezi

关于算法:贪心算法

二叉树的递归套路临时先告一段落了,明天来聊聊贪婪算法。 一、什么是贪婪算法1、最具天然智慧的算法 用最一般的思维就能想到的解决办法。 2、用一种部分最功利的规范,总是做出在以后看来是最好的抉择 3、难点在于证实部分最功利的规范能够失去全局最优解 4、对于贪婪算法的学习次要以减少经历和教训为主 对于每一个利用贪婪算法求解的题目,理论采取的贪婪策略都是不同的,也就是说以后的贪婪策略并不能帮忙你解决另外的贪婪题目,然而可能减少你的教训,让你学会如何尝试。 5、只有可能应用对数器校验策略是对的即可 对于每一个贪婪策略,在提出之初,不能举出显著的反例,咱们就能够尝试按此写出代码来,而后用最暴力的形式写出对数器来校验,校验通过则阐明咱们的贪婪策略是对的,否则就须要换一个贪婪策略了。 至于如何去证实验证通过的贪婪策略真的就是对的,这不是咱们须要关怀的事件,把证实留给做学术研究的就能够了。 二、从头到尾讲一道贪婪算法的题目1、题目形容给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有拼接后果中,字典序最小的后果。 字典序定义:Java中字符串的排序形式,比方 “abc” 和 “bce”相比,“abc” 第一位a的ASCII码小于 “bce” 第一位b的ASCII码,所以 “abc” < “bce”,所以“abc”的字典序更小。对于位数不等的字符串,“abc” 和 “be”,从各自的第一位开始比拟,“abc”的a小于“be”的b,所以“abc” < "be"。 2、思路(1)谬误的可能最直观的解法就是,所有字符串按字典序先排序,将排序后的字符串顺次拼接起来就是最初的后果。 反例:["b", "ba"],各字符串按字典序先排序的后果是["b", "ba"],最初拼接的字符串是"bba",然而本例的最终后果是"bab",因为"bab" < "bba"。所以这样的贪婪策略是错的。 (2)正确的对于任意两个字符串 A和B,如果 A与B 的拼接后果小于 B与A 的拼接后果则A排在后面,否则B排在后面,依照这样的策略将整个字符串数组先排序一遍,再将排序后的数组挨个拼接起来失去的后果就是最终的后果。 这时候就存在一个问题了,对于任意的应用贪婪策略求解的题,贪婪策略的提出是比拟容易的,然而如何证实它是正确的就比拟难了。 不要忘了,咱们有对数器啊,咱们能够应用最暴力的解法获取正确答案,再和咱们贪婪策略取得的后果进行比拟,不等则阐明咱们的贪婪策略存在问题,那么,连忙换另外的贪婪策略。 总结:任何贪婪策略都是先提出再证实,既然咱们有对数器,咱们何必再花大力量去用证实的形式来确定贪婪策略的正确性呢?证实还是留给做学术研究的人来做吧。 3、口试面试中呈现的概率贪婪算法在口试中呈现的概率更高,在和面试官间接面试时,呈现的概率反而不高。为啥? 因为贪婪策略的代码都很简略,定义好比拟的规范,也就是定义好比拟器,依照此规范排序或应用堆,最初就失去后果了。也就是说 (1)起不到考查Coding的作用,只有定义好规范,而后应用排序或堆就能失去后果了; (2)贪婪策略的区分度不够,想对了策略就是满分,没有想对就是0分,分不出各种档次来; 4、代码/** * @author Java和算法学习:周一 */public static class MyComparator implements Comparator<String> {    @Override    public int compare(String o1, String o2) {        return (o1 + o2).compareTo(o2 + o1);    }}public static String lowestDictionary(String[] str) {    if (str == null || str.length < 1) {        return null;    }    Arrays.sort(str, new MyComparator());    StringBuilder result = new StringBuilder();    for (String s : str) {        result.append(s);    }    return result.toString();}是不是发现只有贪婪策略想好了,代码是及其的简略。 蕴含对数器的所有代码地址:https://github.com/monday-pro/algorithm-study/blob/master/src/basic/greedy/LowestDictionary.java 三、会议室问题1、题目形容一些会议要占用一个会议室宣讲,会议室不能同时包容两个会议的宣讲。给你每个我的项目的开始工夫和完结工夫,你来安顿宣讲的日程,要求会议室进行宣讲的场次最多。返回最多的宣讲场次数量。 2、贪婪策略可能咱们会有以下的一些贪婪想法: (1)哪个会议开始工夫早,我就安顿这个会议。那这个想法对不对呢? 反例:[8, 21],[9, 10],[10, 12],[15, 20],很显著开始工夫最早的会议是[8, 21],然而安顿了这个会议后,其余的会议就安顿不了了,然而此时的最优解是安顿[9, 10],[10, 12],[15, 20]三个会议,所以这个想法不成立。 (2)哪个会议持续时间短,我就安顿这个会议。那这个想法对不对呢? 反例:[8, 15],[14, 18],[17, 24],很显著会议持续时间最短的是[14, 18],然而选了这个会议其余两个就不能选了,然而此时的最优解是安顿[8, 15],[17, 24]两个会议,所以这个想法不成立。 (3)哪个会议完结工夫早,我就安顿这个会议。那这个想法对不对呢? 对(至多目前看来是对的)。因为以后不能显著举出反例来,然而咱们还得拿对数器来校验是否真的对。至于证实,留给做学术研究的来做吧。 3、思路所有会议先依据完结工夫按从小到大排序。 ...

January 21, 2022 · 1 min · jiezi

关于算法:2130链表最大孪生和-算法leetode附思维导图-全部解法300题

零 题目:算法(leetode,附思维导图 + 全副解法)300题之(2130)链表最大孪生和一 题目形容 二 解法总览(思维导图) 三 全副解法1 计划11)代码: // 计划1 “化归法(即 把不相熟的变成相熟的、简单的变成简略的,如 这里先将链表 转换成 数组)”。// 技巧:原输出为链表能够思考将其转换成数组,因为链表的增、删操作便捷,但按索引地位查问(数组便捷)操作不便捷!// 思路:// 1)状态初始化: resList = [], resMax = Number.NEGATIVE_INFINITY 。// 2)外围1:遍历 链表 ,将每个节点值 顺次 存入数组 resList 中。// 3)外围2:遍历 resList 的前半部分,求得每个 孪生和(即 tempSum ) 。// 3.1)更新 resMax ,resMax = Math.max(resMax, tempSum) 。// 4)返回后果 resMax 。var pairSum = function(head) { // 1)状态初始化: resList = [], resMax = Number.NEGATIVE_INFINITY 。 let resList = [], resMax = Number.NEGATIVE_INFINITY; // 2)外围1:遍历 链表 ,将每个节点值 顺次 存入数组 resList 中。 while (head) { resList.push(head.val); head = head.next; } // 3)外围2:遍历 resList 的前半部分,求得每个 孪生和(即 tempSum ) 。 const l = resList.length; for (let i = 0; i < Math.floor(l / 2); i++) { const tempSum = resList[i] + resList[l - i - 1]; // 3.1)更新 resMax ,resMax = Math.max(resMax, tempSum) 。 resMax = Math.max(resMax, tempSum); } // 4)返回后果 resMax 。 return resMax;};2 计划21)代码: ...

January 20, 2022 · 2 min · jiezi

关于算法:二叉树递归套路4最低公共祖先派对的最大快乐值

明天持续二叉树的递归套路。 一、最低公共先人给定一个二叉树的头节点,和另外两个节点a、b,返回a、b的最低公共先人。 最低公共先人定义:a、b往上找,第一个雷同的先人(这个公共先人也可能是a或b本人) 1、递归套路思路对于二叉树中的任意一个节点X,以及两个节点a、b,a和b的最低公共先人分为两种状况。 (1)与X无关,即最低公共先人不是X a、b在左树中某个点汇聚了 a、b在右树中某个点汇聚了 a、b在左树和右树中不全 (2)与X无关,即最低公共先人是X 左树中找到a、b中的一个,右树找到另一个 X是a,在左树或右树中找到b X是b,在左树或右树中找到a 也就是每次从左树和右树中咱们都须要 是否有a,是否有b,a和b汇聚的最低先人。所以,能够定义如下的Info类 /** * @author Java和算法学习:周一 */public static class Info{    public boolean findA;    public boolean findB;    public Node answer;    public Info(boolean findA, boolean findB, Node answer) {        this.findA = findA;        this.findB = findB;        this.answer = answer;    }}2、递归套路代码(1)首先判断为空时好不好设置,此时是好设置的,节点为空时new Info(false, false, null),即认为空节点不含有a、不含有b、最低公共先人为null。 (2)而后依据列出的所有可能性,编写递归套路的代码,因为要整个造成递归,所以每一步都要返回Info类。(无脑拿到左右子树的Info、拼凑本人的Info、返回本人的Info) /** * @author Java和算法学习:周一 */public static Info process(Node x, Node a, Node b) {    if (x == null) {        return new Info(false, false, null);    }    // 获取左右子树的信息    Info leftInfo = process(x.left, a, b);    Info rightInfo = process(x.right, a, b);    // 拼凑本人的信息    // 不要疏忽了本人是a或b的状况    boolean findA = leftInfo.findA || rightInfo.findA || x == a;    boolean findB = leftInfo.findB || rightInfo.findB || x == b;    Node answer = null;    if (leftInfo.answer != null) {        // 左树中有答案,则此答案就是最终的答案        answer = leftInfo.answer;    } else if (rightInfo.answer != null) {        // 右树中有答案,则此答案就是最终的答案        answer = rightInfo.answer;    } else {        // 左树和右树都没有答案,然而找到了a和b,则答案就是以后节点X        if (findA && findB) {            answer = x;        }    }    return new Info(findA, findB, answer);}(3)主函数调用递归办法获取后果 /** * @author Java和算法学习:周一 */public static Node lowestAncestor(Node head, Node a, Node b) {    if (head == null) {        return null;    }    return process(head, a, b).answer;}所有代码地址:https://github.com/monday-pro/algorithm-study/blob/master/src/basic/binarytree/LowestAncestor.java 二、派对的最大高兴值员工的信息定义如下: public static class Employee {    //这名员工能够带来的高兴值    public int happy;    //这名员工有哪些间接上级    List<Employee> next;}一个员工只有一个间接下级。也就是这个公司员工的层级构造就是一个多叉树。 当初公司邀请员工加入派对,要求不能同时邀请员工和员工的任一上级(即间接上下级不能同时邀请),如何邀请员工,能力使得加入派对的员工的高兴值是所有状况中最大的。最初返回最大的高兴值。 1、递归套路思路对于任意一个以X为头,含有a、b、c三个子节点的多叉树,最大高兴值分为两种: (1)X来加入派对 最大高兴值 = X.happy                     + a不来的max(happy)                     + b不来的max(happy)                     + c不来的max(happy) (2)X不来加入派对 最大高兴值 = max( a来的max(happy), a不来的max(happy) )  ...

January 20, 2022 · 1 min · jiezi

关于算法:AI-收藏夹-Vol004Waifu-Lab-火了AI-是如何创作的

文章 0 1 AI 如何画出虚构老婆的? 最近大火的 Waifu Labs 我的项目应用生成反抗网络办法,训练 AI 创作「虚构老婆」。 这篇文章[1]解剖 AI 学习的步骤,咱们能够看到一张二次元脸孔是如何在一片混沌中生成的。生成反抗网络简称 GAN,是非监督式学习的一种办法,你能够把它设想成一对为了学习而互相博弈的 AI:一个 AI 学习如何绘画;另一个 AI 学习如何辨别由人工智能制作的画和由人类艺术家制作的画作。 通过隔离管制某些特征向量,对这些坐标进行编目,还能够在人物之间实现乏味的变形 。 0 2 当 AI 遇见美食 索尼自 2018 年开始摸索人工智能与烹饪之间的连结。日前,索尼开发的 AI 零碎已反对将大量的食物数据整合解决后交付到厨师手中,帮助厨师在灵便地搭配食材。此外,索尼还在开发可能乖巧疾速地操作各种食品和烹饪用具的机器人,以辅助厨师烹饪和装盘。为了实现这些指标,索尼与整个行业的组织单干,从厨师、餐馆到大学、科技公司和食品供应商。咱们能够在索尼官网[2]上进一步浏览相干论文并观看概念视频。 0 3 Meta AI 让儿童手绘「活」起来 儿童会画出千奇百怪的身材形态,有时候没有残缺的头,有时候手臂又会从眼睛的中央伸出来……不同的孩子又会画出不一样的世界。AI 如何克服重重挑战,辨认儿童绘画?Meta 通过四个步骤来实现从绘画到动画的转变:指标检测辨认人形;应用角色 mask 从场景中提取人形;通过 rigging 为动画做筹备;应用 3D 动作捕获制作 3D 人形动画[3.1]。你也能够在这里线上试玩[3.2]。 0 4 AI 软件辅助辨认结直肠病变 字节跳动旗下医疗品牌「小荷衰弱」研发了一款结肠镜 AI 辅助诊断软件,可利用人工智能技术,辅助临床医生实时发现、甄别结直肠癌症病变。 与其余癌症相比,结直肠癌绝对可防可控。而可防可控的关键在于早预防、早筛检、早医治,结肠镜查看便是最次要的早筛检伎俩之一。 0 5 Jeff Dean:机器学习 2021 年度总结与钻研趋势 谷歌 AI 掌门人 Jeff Dean 发表万字长文年度总结。在总结中,重点介绍机器学习五大趋势: ...

January 20, 2022 · 1 min · jiezi

关于算法:二叉树递归套路3判断是否是满二叉树最大子搜索二叉树的节点数

明天持续二叉树的递归套路。 一、判断是否是满二叉树满二叉树定义:对于高度为h的二叉树,节点数为(2^h - 1) 1、递归套路思路依据满二叉树的定义能够晓得,咱们每次只须要获取高度、节点数即可。 也就是每次从左子树和右子树中咱们都须要 高度、节点数 两个数据,最初再依据高度和节点数的关系判断是否是满二叉树。所以能够定义如下的Info类 /** * @author Java和算法学习:周一 */public static class Info {    public int height;    public int nodes;    public Info(int height, int nodes) {        this.height = height;        this.nodes = nodes;    }}2、递归套路代码(1)首先判断为空时好不好设置,此时是好设置的,节点为空时new Info(0, 0),即认为空节点高度为0、节点数为0。 (2)而后依据列出的所有可能性,编写递归套路的代码,因为要整个造成递归,所以每一步都要返回Info类。(无脑拿到左右子树的Info、拼凑本人的Info、返回本人的Info) /** * @author Java和算法学习:周一 */public static Info process(Node x) {    if (x == null) {        return new Info(0, 0);    }    // 获取左右子树的信息    Info leftInfo = process(x.left);    Info rightInfo = process(x.right);    // 拼凑本人的信息    int height = Math.max(leftInfo.height, rightInfo.height) + 1;    int nodes = leftInfo.nodes + rightInfo.nodes + 1;    return new Info(height, nodes);}(3)主函数调用递归办法获取后果 /** * @author Java和算法学习:周一 */public static boolean isFull(Node head) {    if (head == null) {        return true;    }    Info process = process(head);    return (1 << process.height) - 1 == process.nodes;}所有代码地址:https://github.com/monday-pro/algorithm-study/blob/master/src/basic/binarytree/IsFullBinaryTree.java 二、求二叉树中最大子搜寻二叉树的节点数给定一个二叉树,整体可能是、也可能不是搜寻二叉树,然而它的某几个子树是搜寻二叉树,要找到节点数最多的子搜寻二叉树的节点数。 1、递归套路思路求最大子搜寻二叉树,分为两种可能性,蕴含二叉树头节点,不蕴含二叉树头节点。 (1)不蕴含头节点:需要求左树的最大搜寻二叉树的节点数,需要求右树的最大搜寻二叉树的节点数 (2)蕴含头节点:须要判断左树是不是搜寻二叉树,右树是不是搜寻二叉树,左树的最大值是否小于头节点,右树的最小值是否大于头节点,同时还须要左树和右树的节点数。 也就是每次从左树和右树中咱们都须要 最大搜寻二叉树的节点数、是否搜寻二叉树、max、min、节点数,然而还能化简,如果最大搜寻二叉树的节点数和节点数相等就意味着整个子树是搜寻二叉树,所以能够化简为 最大搜寻二叉树的节点数、max、min、节点数。只管咱们最初只返回节点数,然而咱们须要是否搜寻二叉树、max、min来辅助求解节点数。最初,能够定义如下的Info类 /** * @author Java和算法学习:周一 */public static class Info {    // 最大满足搜寻二叉树条件的子树大小    public int maxSubSize;    public int max;    public int min;    // 整个子树的节点数    public int allSize;    public Info(int maxSubSize, int max, int min, int allSize) {        this.maxSubSize = maxSubSize;        this.max = max;        this.min = min;        this.allSize = allSize;    }} 2、递归套路代码(1)首先判断为空时好不好设置,此时是不好设置的,节点为空时max和min不好指定,所以节点为空时间接返回null,前面递归时再解决这个null即可。 (2)而后依据列出的所有可能性,编写递归套路的代码,因为要整个造成递归,所以每一步都要返回Info类。(无脑拿到左右子树的Info、拼凑本人的Info、返回本人的Info) /** * @author Java和算法学习:周一 */public static Info process(Node x) {    if (x == null) {        return null;    }    // 获取左右子树信息    Info leftInfo = process(x.left);    Info rightInfo = process(x.right);    // 拼凑本人的信息    int max = x.value;    int min = x.value;    int allSize = 1;    if (leftInfo != null) {        max = Math.max(leftInfo.max, max);        min = Math.min(leftInfo.min, min);        allSize += leftInfo.allSize;    }    if ((rightInfo != null)) {        max = Math.max(rightInfo.max, max);        min = Math.min(rightInfo.min, min);        allSize += rightInfo.allSize;    }    // 左树 最大搜寻二叉树大小    int p1 = -1;    if (leftInfo != null) {        p1 = leftInfo.maxSubSize;    }    // 右树 最大搜寻二叉树大小    int p2 = -1;    if (rightInfo != null) {        p2 = rightInfo.maxSubSize;    }    // 最大子树蕴含头节点    int p3 = -1;    // 左树是否是搜寻二叉树    boolean leftSearch = leftInfo == null || leftInfo.maxSubSize == leftInfo.allSize;    // 右树是否是搜寻二叉树    boolean rightSearch = rightInfo == null || rightInfo.maxSubSize == rightInfo.allSize;    if (leftSearch && rightSearch) {        // 左树最大值是否比以后节点值小(空也认为比以后节点小)        boolean lessMaxLessX = leftInfo == null || leftInfo.max < x.value;        // 右树最小值是否比以后节点值大(空也认为比以后节点大)        boolean rightMinMoreX = rightInfo == null || rightInfo.min > x.value;        // 都满足,能力批改p3的值        if (lessMaxLessX && rightMinMoreX) {            int leftSize = leftInfo == null ? 0 : leftInfo.allSize;            int rightSize = rightInfo == null ? 0 : rightInfo.allSize;            p3 = leftSize + rightSize + 1;        }    }    // 最初批改,以后子树最大搜寻二叉子树的大小    int maxSubSize = Math.max(p1, Math.max(p2, p3));    return new Info(maxSubSize, max, min, allSize);}(3)主函数调用递归办法获取后果 /** * @author Java和算法学习:周一 */public static int maxSubSearchBinaryTreeSize(Node head) {    if (head == null) {        return 0;    }    return process(head).maxSubSize;}所有代码地址:https://github.com/monday-pro/algorithm-study/blob/master/src/basic/binarytree/MaxSubSearchBinaryTreeSize.java 三、二叉树递归套路总结是不是感觉对二叉树的递归套路有点感觉了,是时候总结一下二叉树的递归套路了。 1、假如以X节点为头,假如能够向X左树和X右树要任何信息 2、在上一步的假如下,探讨以X为头节点的树,列出失去答案的可能性(最重要) 3、列出所有可能性后,确定到底须要向左树和右树要什么样的信息 4、把左树信息和右树信息求选集,就是任何一棵子树都须要返回的信息Info 5、递归函数都返回Info,每一棵子树都这么要求 6、写代码,在代码中思考如何把左树的信息和右树信息整合出整棵树的信息 当看完了前几篇的二叉树递归套路,再看这个总结,是不是信手拈来。

January 19, 2022 · 1 min · jiezi

关于算法:PaddleVideo升级发布顶会算法重磅开源

全文5352字,预计浏览工夫14分钟随着短视频的疾速倒退以及平安治理的需要一直增多,视频畛域的相干技术利用包含视频智能标签、智能教练、智能剪辑、智能平安治理、文本视频检索、视频精彩片段提取、视频智能封面正逐步成为人们生存中的重要局部。 以视频相干业务为例,短视频网站心愿能迅速给每个新作品打上标签并推送给适合的用户,剪辑人员心愿从较量视频中便捷地提取精彩较量片段集锦,教练员心愿系统分析运动员的动作并进行技术统计和剖析,平安治理部门也心愿能精准地进行视频内容审核比方实时辨认违规行为,编辑人员心愿通过文本检索相干的视频片段作为新闻素材,广告或举荐网站心愿为视频生成更加好看的封面晋升转化率。这些业务对传统的人工解决形式是很大的挑战。 视频了解是通过AI技术让机器了解视频内容,现在在短视频、举荐、搜寻、广告,平安治理等畛域有着宽泛的利用和钻研价值,像动作定位与辨认、视频打标签、文本视频检索、视频内容分析之类的工作都能够通过视频了解技术搞定。 PaddleVideo是百度自主研发的产业级深度学习开源开放平台飞桨的视频开发套件,蕴含视频畛域泛滥模型算法和产业案例,本次开源次要降级点如下: 公布10个视频畛域产业级利用案例,涵盖体育、互联网、医疗、媒体和平安等行业。首次开源5个冠军/顶会/产业级算法,蕴含视频-文本学习、视频宰割、深度预计、视频-文本检索、动作辨认/视频分类等技术方向。配套丰盛的文档和教程,更有直播课程和用户交换群,能够与百度资深研发工程师一起探讨交换。一、十大视频场景化利用-工具详解飞桨PaddleVideo基于体育行业中足球/篮球/乒乓球/花样滑冰等场景,开源出一套通用的体育类动作辨认框架;针对互联网和媒体场景开源了基于常识加强的大规模多模态分类打标签、智能剪辑和视频拆条等解决方案;针对平安、教育、医疗等场景开源了多种检测辨认案例。百度智能云联合飞桨深度学习技术也造成了一系列深度打磨的产业级多场景动作辨认、视频智能剖析和生产以及医疗剖析等解决方案。 1. 足球场景:开源FootballAction精彩片段智能剪辑解决方案FootballAction基于行为辨认PP-TSM模型、视频动作定位BMN模型和序列模型AttentionLSTM组合失去,不仅能精确辨认出动作的类型,而且能精确定位出该动作产生的起止工夫。目前能辨认的动作类别有8个,蕴含:背景、进球、角球、任意球、黄牌、红牌、换人、界外球。准确率超过90%。 2. 篮球场景:开源BasketballAction精彩片段智能剪辑解决方案篮球案例BasketballAction整体框架与FootballAction相似,共蕴含7个动作类别,别离为:背景、进球-三分球、进球-两分球、进球-扣篮、罚球、跳球。准确率超过90%。 3. 乒乓球场景:开源大规模数据训练的动作分类模型在百度Create 2021(百度AI开发者大会)上,PaddleVideo联结北京大学一起公布的乒乓球动作进行辨认模型,基于超过500G的较量视频构建了规范的训练数据集,标签涵盖发球、拉、摆短等8个大类动作。其中起止回合准确率达到了97%以上,动作辨认也达到了80%以上。 4. 花样滑冰动作辨认应用姿势预计算法提取关节点数据,最初将关节点数据输出时空图卷积网络ST-GCN模型中进行动作分类,能够实现30种动作的分类。飞桨联结CCF(中国计算机学会)举办了花样滑冰动作辨认大赛,吸引了300家高校与200家企业超过3800人参赛,冠军计划比基线计划精度晋升了12个点,较量top3计划曾经开源。 <section style="line-height: 1.75em;margin-left: 8px;margin-right: 8px;"><img class="rich_pages wxw-img img_loading __bg_gif" data-ratio="0.6818181818181818" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_gif/sKia1FKFiafgiaX1R7zzZ8VEK4KUr1d1wu6r9NoGCS34WwxtxJk3lSLpL0yTWzE1BTydrDYibSGZMdd0onZQ9XG22Q/640?wx_fmt=gif" data-type="gif" data-w="352" style="white-space: normal; width: 252px !important; height: 172.667px !important;" _width="268px" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/25dde51c3b8645e2908578423e5899cb~tplv-k3u1fbpfcp-zoom-1.image" data-order="3" alt="图片"></section><section style="line-height: 1.75em;margin-left: 8px;margin-right: 8px;"><img class="rich_pages wxw-img img_loading __bg_gif" data-ratio="0.6818181818181818" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_gif/sKia1FKFiafgiaX1R7zzZ8VEK4KUr1d1wu6xTHuFR2gOeyaOkmTdiayoyy4TibyoKicwAenEO0U0iaDXAIBfzdbDeJgdg/640?wx_fmt=gif" data-type="gif" data-w="352" style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, Arial, sans-serif; white-space: normal; text-align: center; width: 252px !important; height: 172.667px !important;" _width="268px" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fcd066d6da8b4f06b1422921cf9f6876~tplv-k3u1fbpfcp-zoom-1.image" data-order="4" alt="图片"></section>5. 常识加强的视频大规模/多模态分类打标签---------------------------在视频内容分析方向,飞桨开源了根底的VideoTag和多模态的MultimodalVideoTag。VideoTag反对3000个源于产业实际的实用标签,具备良好的泛化能力,十分实用于国内大规模短视频分类场景的利用,标签准确率达到89%。 MultimodalVideoTag模型基于实在短视频业务数据,交融文本、视频图像、音频三种模态进行视频多模标签分类,相比纯视频图像特色,能显著晋升高层语义标签成果。模型提供一级标签25个,二级标签200+个,标签准确率超过85%。 <section style="text-align: center;line-height: 1.75em;margin-left: 8px;margin-right: 8px;"><span style="display: none;line-height: 0px;letter-spacing: 1px;"></span><img class="rich_pages wxw-img img_loading __bg_gif" data-backh="147" data-backw="262" data-ratio="0.5625" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_gif/sKia1FKFiafgiaX1R7zzZ8VEK4KUr1d1wu6JBmFRbukrIPGGb2eN6d4S6ECZ31bzDL2v38aVLGuLTwpfFP4aibUz1Q/640?wx_fmt=gif" data-type="gif" data-w="640" style="width: 252px !important; height: 142.917px !important;" _width="100%" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a20742f3cea84ac08d2c920c5f31122b~tplv-k3u1fbpfcp-zoom-1.image" data-order="5" alt="图片"><span style="display: none;line-height: 0px;letter-spacing: 1px;"></span></section><section style="line-height: 1.75em;margin-left: 8px;margin-right: 8px;"><img class="rich_pages wxw-img img_loading __bg_gif" data-backh="150" data-backw="267" data-ratio="0.5627198124267292" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_gif/sKia1FKFiafgiaX1R7zzZ8VEK4KUr1d1wu6iaxtjm7ialEqplticW399heoX3EpSyWyiaSmB3xUhqDNibNz9noAD1hfQtw/640?wx_fmt=gif" data-type="gif" data-w="853" style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, Arial, sans-serif; white-space: normal; text-align: center; width: 252px !important; height: 142.971px !important;" _width="100%" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fa466c5cae9b4b639ccdb7668d3a55d2~tplv-k3u1fbpfcp-zoom-1.image" data-order="6" alt="图片"></section>6. 视频内容智能生产----------------在视频智能生产方向,次要指标是辅助内容创作者对视频进行二次编辑。飞桨开源了基于PP-TSM的视频品质分析模型,能够实现新闻视频拆条和视频智能封面两大生产利用解决方案,其中新闻拆条是广电媒体行业的编辑们的重要素材起源;智能封面在直播、互娱等泛互联网行业的点击率和举荐成果方面施展重要作用。 7. 视频交互式标注工具开源-------------------飞桨开源了基于MA-Net的交互式视频宰割(interactive VOS)工具,提供大量的人工监督信号来实现较好的宰割后果,能够仅靠标注简略几帧实现全视频标注,之后可通过屡次和视频交互而一直晋升视频宰割品质,直至对宰割品质称心。 8. 基于时空动作检测单模型实现87类通用行为辨认-----------------------------飞桨基于时空动作检测模型实现了辨认多种人类行为的计划,利用视频多帧时序信息解决传统检测单帧成果差的问题,从数据处理、模型训练、模型测试到模型推理,能够实现AVA数据集中80个动作和自研的7个异样行为(挥棍、打架、踢货色、追赶、争吵、疾速奔跑、摔倒)的辨认。模型的成果远超指标检测计划。 <section style="line-height: 1.75em;margin-left: 8px;margin-right: 8px;"><img class="rich_pages wxw-img __bg_gif" data-ratio="1.0186915887850467" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_gif/sKia1FKFiafgiaX1R7zzZ8VEK4KUr1d1wu6p5tDibOT1L2Jk1ibLiab4w0jPBeJBB5WZxJw3X4yBVTibx6iba98DYONVZA/640?wx_fmt=gif" data-type="gif" data-w="214" style="white-space: normal; width: 207px !important; height: auto !important; visibility: visible !important;" _width="207px" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/898b2089761247539f3bedd98b55aa49~tplv-k3u1fbpfcp-zoom-1.image" data-order="9" alt="图片" data-fail="0"><span style="display: none;line-height: 0px;letter-spacing: 1px;"></span></section><section style="line-height: 1.75em;margin-left: 8px;margin-right: 8px;"><img class="rich_pages wxw-img __bg_gif" data-galleryid="" data-ratio="0.7686567164179104" data-src="https://mmbiz.qpic.cn/mmbiz_gif/sKia1FKFiafgiaX1R7zzZ8VEK4KUr1d1wu6dMwxsdptlH90RN7BZzCbdyuwwJB9xfVzwSjrZWybPYiaHAXVYNbyWGA/640?wx_fmt=gif" data-type="gif" data-w="536" style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, Arial, sans-serif; white-space: normal; text-align: center; width: 268px !important; height: auto !important; visibility: visible !important;" _width="268px" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/510f01b52b5d46b2aedae5debbe85eee~tplv-k3u1fbpfcp-zoom-1.image" data-order="10" alt="图片" data-fail="0"></section>9. 无人机检测------------禁飞畛域无人机检测有如下挑战:(1)无人机指标渺小,观测艰难。(2)无人机挪动速度多变。(3)无人机航行环境简单,可能被修建、树木遮挡。 针对以上挑战,飞桨开源了无人机检测模型,以实现在泛滥简单环境中对无人机进行检测。 <section style="line-height: 1.75em;margin-left: 8px;margin-right: 8px;"><img class="rich_pages wxw-img img_loading __bg_gif" data-ratio="0.8" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_gif/sKia1FKFiafgiaX1R7zzZ8VEK4KUr1d1wu6uVaicongxDosZR9AqFcE4tG3u80fibIvvGMHLE9XlibaH3zPV1m261iasQ/640?wx_fmt=gif" data-type="gif" data-w="640" style="white-space: normal; width: 252px !important; height: 202.133px !important;" _width="268px" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/abb864ca0fd84ca7a6d7b89ab3cba3d7~tplv-k3u1fbpfcp-zoom-1.image" data-order="11" alt="图片"></section><section style="line-height: 1.75em;margin-left: 8px;margin-right: 8px;"><img class="rich_pages wxw-img img_loading __bg_gif" data-ratio="0.8" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_gif/sKia1FKFiafgiaX1R7zzZ8VEK4KUr1d1wu6Hfd8SpFpyYBwtmjeEL5lYw79v7TIXjQsu87gXiagn736vjFEwaibLrqQ/640?wx_fmt=gif" data-type="gif" data-w="640" style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, Arial, sans-serif; white-space: normal; text-align: center; width: 252px !important; height: 202.133px !important;" _width="268px" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/14611978c5044f379294b27a3b173879~tplv-k3u1fbpfcp-zoom-1.image" data-order="12" alt="图片"></section>10. 医疗影像的分类甄别------------------基于公开的3D-MRI脑影像数据库,浙江大学医学院从属第二医院和百度研究院开源了帕金森3D-MRI脑影像的分类甄别我的项目,数据集包含neurocon, taowu, PPMI和OASIS-1等公开数据集,囊括帕金森患者(PD)与失常(Con)共378个case。提供2D及3D基线模型和4种分类模型以及3D-MRI 脑影像的预训练模型。其中PP-TSN和PP-TSM获得了超过91%的准确度和超过97.5%的AUC,而TimeSformer实现了最高准确度也超过92.3% # 二、五大冠军、顶会算法开源 百度研究院首次开源自研冠军、顶会算法 1. CVPR 2020 顶会论文:-----------------------多模态预训练模型ActBERT首次开源-----------------------ActBERT是交融了视频、图像和文本的多模态预训练模型,它应用一种全新的纠缠编码模块从三个起源进行多模态特色学习,以加强两个视觉输出和语言之间的互动性能。该纠缠编码模块,在全局动作信息的领导下,对语言模型注入了视觉信息,并将语言信息整合到视觉模型中。纠缠编码器动静抉择适合的上下文以促成指标预测。简略来说,纠缠编码器利用动作信息催化部分区域与文字的互相关联。在文本视频检索、视频形容、视频问答等5个上游工作上,ActBERT均显著优于其余办法。下表展现了ActBERT模型在文本视频检索数据集MSR-VTT上的性能体现。 2. CVPR 2021 顶会论文:--------------------------文本视频检索模型T2VLAD首次开源----------------------随着各种互联网视频尤其是短视频的炽热,文本视频检索在近段时间取得了学术界和工业界的宽泛关注。特地是在引入多模态视频信息后,如何精细化地配准部分视频特色和自然语言特色成为一大难点。T2VLAD采纳一种高效的全局-部分的对齐办法,主动学习文本和视频信息共享的语义核心,并对聚类后的部分特色做对应匹配,防止了简单的计算,同时赋予了模型精细化了解语言和视频部分信息的能力。 此外,T2VLAD间接将多模态的视频信息(声音、动作、场景、speech、OCR、人脸等)映射到同一空间,利用同一组语义核心来做聚类交融,计算同一核心的视频和文本特色的部分类似度,这在肯定水平上解决了多模态信息难以综合利用的问题。T2VLAD在三个规范的Text-Video Retrieval Dataset上均获得了优异的性能。 3. CVPR2020视频宰割模型MA-Net首次开源-------------------------------视频指标宰割(VOS)是计算机视觉畛域的一个根底工作,有很多重要的利用场景,如视频编辑、场景了解及主动驾驶等。交互式视频指标宰割由用户在视频的某一帧中给指标物体简略的标注(比方在指标物体上画几条简略的线),就可能通过算法取得整个视频中该指标物体的宰割后果,用户能够通过屡次和视频交互而一直晋升视频宰割品质,直到用户对宰割品质称心。 因为交互式视频宰割须要用户屡次和视频交互,因而,须要兼顾算法的时效性和准确性。MA-Net 应用一个对立的框架进行交互和流传来生成宰割后果,保障了算法的时效性。另外, MA-Net 通过记忆存储的形式,将用户多轮交互的信息存储并更新,晋升了视频宰割的准确性。下表展现了模型在DAVIS2017数据集上性能体现。 4. 首次开源ECCV 2020 Spotlight视频宰割模型CFBI、CVPR2021视频指标宰割国内比赛中,基于 CFBI设计的解决方案在两项工作上夺得了冠军--------------------------------------------------------------------------------------在视频指标宰割畛域中,半监督畛域在往年来备受关注。给定视频中第一帧或多个参考帧中的指标标定,半监督办法须要准确跟踪并宰割出指标物体在整个视频中的掩模。以往的视频指标宰割办法都专一于提取给定的前景指标的鲁棒特色,但这在遮挡、尺度变动以及背景中存在类似物体的等等简单场景下是十分困难的。基于此,咱们从新思考了背景特色的重要性,并提出了前背景整合式的视频指标宰割办法(CFBI)。 CFBI以对偶的模式同时提取指标的前景与背景特色,并通过隐式学习的办法晋升前背景特色之间的对比度,以进步宰割精度。基于CFBI,咱们进一步将多尺度匹配和空洞匹配的策略引入视频指标中,并设计了更为鲁棒且高效的框架,CFBI+。 CFBI系列办法在视频指标宰割畛域上放弃着单模型最高精度的记录。特地地,百度研究院的单模型性能优于旷视清华团队在CVPR2020视频指标宰割国内比赛上交融三个强力模型的后果。在往年刚刚完结的CVPR2021视频指标宰割国内比赛中,基于 CFBI设计的解决方案在两项工作上夺得了冠军。下表展现了CFBI模型在DAVIS-2017数据集上的体现。 5. ICCV 2021无监督单目深度预计模型ADDS首次开源-----------------------------------ADDS是基于白天和夜晚图像的自监督单目深度预计模型,其利用了白天和夜晚的图像数据互补性质,减缓了昼夜图像较大的域偏移以及照明变动对深度预计的精度带来的影响,在具备挑战性的牛津RobotCar数据集上实现了全天图像的最先进的深度预计后果。下表展现了ADDS模型在白天和夜间数据集上的测试性能体现。 是不是干货满满,心动不如口头,大家能够间接返回Github地址取得残缺开源我的项目代码,记得Star珍藏反对一下哦:https://github.com/PaddlePadd...---------- END ----------百度 Geek 说百度官网技术公众号上线啦!技术干货 · 行业资讯 · 线上沙龙 · 行业大会招聘信息 · 内推信息 · 技术书籍 · 百度周边

January 19, 2022 · 2 min · jiezi

关于算法:低代码发展专访系列之七低代码的火爆需要不一样的声音么

前言:2019年开始,低代码爆火。有人认为它是第四代编程语言,有人认为它是开发模式的颠覆,也有人认为是企业管理模式的改革……有很多声音,社区探讨很热烈。CSDN随后开展低代码平台产品系列流动,包含低代码开发者认知度与利用线上调研,市场洞察报告,专家专访专辑,研讨会等。邀请低代码平台产品的各个角色独特研究,力求为大家出现一个平面的、透光的低代码倒退脉络和将来趋势。 本期访谈嘉宾:肖培明 用友网络YonBuilder产品经理 专一平台级产品布局和研发,22年过程中经验财务会计(4年)、业务参谋(5年)、平台开发(3年)、(10年)产品设计四个低代码开发体系中的要害岗位。致力于打造同时为一线用户、行业专家、业务开发服务的低代码开发平台,帮忙企业实现数字化转型及商业翻新。 嘉宾照片: CSDN:在您看来,低代码火爆的起因是什么? 肖培明:我认为低代码是开发能力的一次变动或者说改革。就像八九十年代要写代码的时候,都要在纸上先写好思路,而后在专门的上机时间里编码和调试机器。起初PC,小型机和个人电脑的老本升高,咱们就会间接在个人电脑上边设计边写代码,就不会在纸上再去写代码了。这就是开发能力的第一次改革,是硬件技术和能力疏导的改革。 第二次改革是很多平台厂商提供了开发工具和开发语言,比方Basic,Java,C++, 让代码开发变得更加便当,因为硬件软件技术提高带来的晋升还有很屡次。 直到现在当初低代码的呈现,并且疾速取得很多人的认可,是因为越来越多的业务场景都依赖于信息系统,而低代码平台能够撑持更多行业的人群,甚至不须要把握开发常识,编程语言就能够实现零碎的搭建。这次是业务需要和商业翻新疏导的一次重要的改革。 CSDN:一个好的开发平台须要有什么特质? 肖培明:第一个就是适合的设计能力,无代码的形式可能全副实现利用交互和业务逻辑的定义业务对象之间的数据流转(按条件、从新分组、汇总合并),能让企业通过流程设计的形式和规定引擎,让不同角色的人退出我的项目当中,施展本人的能量,晋升开发的产能。设计能力代表能把更多的角色,拉到开发者的这个圈子外面来。这个特质在市场上是比拟吸引眼球的,只有有一个切入点,咱们就能够为客户提供一个具体的,或者说在一个特定方向的业务场景,提供一个高交互操作的设计器,来实现这部分的业务逻辑或者页面,或者数据模型的开发工作。 第二个就是开发治理能力。从企业的角度来看,单个性能的利用,无奈在企业的整体运作里施展很大的作用,所以开发成绩和资源的治理就会比拟难。比方开发成绩怎么治理,业务解决的逻辑是否依照标准,比方音讯,事务,API的标准,都是须要束缚。如果仅仅是提供快捷的设计能力,当团队规模变大的时候,开发成绩的治理和零碎间的互联互通都会付出很大的老本,低代码的意义就升高了。 第三个局部是继续优化开发平台的能力和开发成绩复用,比方某个业务在雷同业务场景下可复制,那么这个成绩复制的能力就很要害了,因为成绩复制能力决定了咱们能不能继续上来。一方面低代码是利用已有的平台和各种撑持服务为开发者提供便当,另一方面低代码的成绩是否可能丰盛和裁减撑持服务,造成良性循环。最初怎么把它造成商品也是比拟重要的环节,这代表低代码的开发团队具备可能生存上来并发展壮大基本要素。 CSDN:用友的低代码开发平台外围设计理念是什么? 肖培明:回顾企业信息化的过程中,第一阶段是从最具备共性的企业需要中,提炼出规范的性能,包装成标准化的产品。随着企业不同的倒退阶段,关注的内容和形式也在发生变化,有不同的要求,不同的治理力度,不同业务执行的形式,信息化的第二阶段,就会须要像ERP这样零碎平台。像洽购这样的业务也在发生变化,比方一种是要洽购,接管订单,而后再入库,那也有另外一个企业是做直销的,洽购完不须要入库,间接送到客户那里。所以ERP实际上解决了客户化配置:咱们把大部分的业务场景都放进零碎中,这个时候通过开关的设置,能够依据你企业外面的业务执行的状况关上开关或者关上,以便适应的企业的须要。在ERP的根底上客户化开发,就是咱们常说的二次开发,须要在零碎上留下足够的接口和扩大,就能基本上满足客户的需要了。 当初用友提出的商业翻新能在云端和线下的撑持能力,能基于一套平台上创立和治理业务,就须要低代码平台的这种能力来保障。咱们当初的低代码开发团队,也是从咱们以前的各个团队外面抽调进去,而后独立造成的。将咱们在畛域、行业、我的项目的积攒,各种场景下的设计能力,具体反映到咱们低代码平台的各种设计器和撑持服务上。 其实,低代码的能力会成为整个零碎的底座,开发成绩能够插到用友的底座下面。简略的说,咱们面对一个场景,设计一个产品,而后推广应用的时候,就须要把这个产品插到整个零碎的底座上。比方OCR辨认的场景,OCR辨认用友可能不善于,然而如果OCR提供方把OCR辨认之后的成绩放到整个底座下面,成为商业运行体系的一部分会具备更大的商业价值。 用友平台的包含了大部分企业的信息化基础设施。咱们要施展这个劣势,容许成绩复用或者容许实现某一个场景的低代码搭建,使咱们的平台更加生态化倒退。用友最外围的力量,用来建设和优化好咱们的底座,而后让企业和搭档通过低代码平台,去拓展和翻新业务。如果咱们在底座上翻新出一些利用,而后插入到整个体系外面,那么咱们就在实现了生态的共赢。 CSDN:从用友的角度如何对待数字化和信息化的区别和分割? 肖培明:信息化是基于工作或者基于流程来驱动的,举个例子,我用一个信息化零碎去治理多人工作,一个人在信息化零碎上会收到一个工作,当这个人实现了该工作环节后,下一个环节的人可能会收到一个流程驱动的工作,这个人实现本人的工作环节后又把流程推动给下一个人,直至整个工作实现。但如果有一天,某个环节的数据量忽然大量减少,那么咱们的工作中就会有更多的入库量和测验量,可能导致人工无奈执行,须要依据数据的变动和适当的规定算法调整整个体系,比方主动实现大部分的数据处理,保留须要人工判断的解决提交给适合的角色或岗位,这是数字化的特点。数字化跟信息化的区别是:信息化依照业务过程来驱动,但数字化能够通过数据和规定取得反馈建设新的过程,更加灵便低分配资源。 低代码平台成为热点其实是一个生产力工具的降级带来的后果,它突破了信息化零碎既定的流程,减速了数字化过程。近几年国家也在鼎力推动数字化,为低代码的倒退发明了很好的机会。将来的财税业余,可能会变成财税大数据利用这门学科。可能只有1/3的内容为传统课程,有2/3的内容都是数据分析和低代码平台的应用。低代码开发平台可能放慢治理等学科的数字化过程,进步治理的效率,在将来四年内,会计、物流或治理人才都有可能会具备低代码平台的开发能力。会计、物流和治理业余,须要数字化平台跟业务相结合,在不同的业务场景里进行单干,所以肯定会呈现大的改革。低代码便捷开发的能力,一方面通过新的技术手段,让企业不同的业务可能更快捷的实现数字化。另一方面,让企业可能实现商业翻新,把积攒的教训放到产品里,发明出更多新场景。 肖培明:咱们的低代码平台,针对不同人群的开发能力。提供了两种状态的低代码模式,用户模式和专家模式。用户模式就是针对使用者没有深厚的技术积攒,不理解数据模型,不会写脚本,就照着设计器既定的配置去设计产品。行业专家模式就是针对有很扎实行业背景,同时对大数据、脚本有粗浅的了解,这时用户模式的配置就成为这些人设计产品的解放。咱们的专家模式通过一个开关可能开启,让有技术背景的使用者通过撰写脚本进行二次开发,实现本人的产品,这也是通过市场验证的两套模式。

January 19, 2022 · 1 min · jiezi

关于算法:二叉树递归套路2判断二叉树是否是搜索二叉树二叉树的最大距离

本篇持续来聊聊二叉树的递归套路。 一、判断二叉树是否是搜寻二叉树搜寻二叉树定义:二叉树中的任意一个以X为头的子树,左子树都比X小,右子树都比X大。(经典的搜寻二叉树是没有反复值的) 1、经典做法中序遍历,后果是递增的,阐明这是搜寻二叉树。 2、递归套路思路剖析任意一个以X为头的子树,满足以X为头的子树是搜寻二叉树的条件(列出所有可能性) 1)左子树是搜寻二叉树 2)右子树是搜寻二叉树 3)左子树的最大值 小于 X 4)右子树的最小值 大于 X 满足这四个条件能力说以X为头的子树是均衡二叉树。 问题来了:此时发现我须要从左子树和右子树中获取的后果不统一(一个是要最小值、一个是要最大值),不好拼凑出递归。咋办?好说,咱们间接求选集(小孩子才做抉择,成年人不做抉择,都要),左子树咱们求最大值和最小值,右子树也是。 也就是每次从左子树和右子树中咱们都须要 是否搜寻二叉树、最大值、最小值 三个数据,只管咱们最初只返回是否搜寻二叉树,然而咱们须要最大值和最小值来辅助咱们判断是否搜寻,所以能够定义如下的Info类 /** * @author Java和算法学习:周一 */public static class Info {    public boolean isSearch;    public int max;    public int min;    public Info(boolean isSearch, int max, int min) {        this.isSearch = isSearch;        this.max = max;        this.min = min;    }}3、递归套路代码(1)首先判断为空时好不好设置,此时不好设置,节点为空时max和min不好指定,所以节点为空时间接返回null,前面递归时再解决这个null即可。 (2)而后依据列出的所有可能性,编写递归套路的代码,因为要整个造成递归,所以每一步都要返回Info类。(无脑拿到左右子树的Info、拼凑本人的Info、返回本人的Info) /** * 判断是否是搜寻二叉树的递归套路写法 * * @author Java和算法学习:周一 */public static Info process(Node x) {    // 为空时,max和min无奈赋值,所以此处返回null    if (x == null) {        return null;    }    // 获取左右子树的数据    Info leftInfo = process(x.left);    Info rightInfo = process(x.right);    // 拼凑本人的数据    boolean isSearch = true;    // 以后节点不是搜寻二叉树的状况    // 1.左子树不是搜寻二叉树    // 2.右子树不是搜寻二叉树    // 3.左子树最大值大于以后节点    // 4.右子树最小值小于以后节点    if (leftInfo != null && (!leftInfo.isSearch || leftInfo.max >= x.value)) {        isSearch = false;    }    if (rightInfo != null && (!rightInfo.isSearch || rightInfo.min <= x.value)) {        isSearch = false;    }    int max = x.value;    int min = x.value;    if (leftInfo != null) {        max = Math.max(leftInfo.max, max);        min = Math.min(leftInfo.min, min);    }    if (rightInfo != null) {        max = Math.max(rightInfo.max, max);        min = Math.min(rightInfo.min, min);    }    return new Info(isSearch, max, min);}(3)主函数调用递归办法获取后果 /** * @author Java和算法学习:周一 */public static boolean isSearchBinaryTree(Node head) {    if (head == null) {        return true;    }    return process(head).isSearch;}所有代码地址: https://github.com/monday-pro... 二、二叉树的最大间隔给定一个二叉树,任何两个节点之间都存在间隔,返回整个二叉树的最大间隔。两个节点的间隔示意从一个节点到另一个节点最短门路上的节点数(蕴含两个节点本人) 1、递归套路思路首先剖析以X为头的二叉树,它的最大间隔的可能性有两类,不通过X、通过X。 不通过X:须要获取左子树和右子树各自的最大间隔 通过X:(左树高度 + 右树高度 + 1)即是最大间隔 也就是每次从左子树和右子树中咱们都须要 最大间隔、高度 两个数据,最初再取 左子树最大间隔、右子树最大间隔、(左树高度 + 右树高度 + 1) 的最大值即是整个树的最大间隔。只管咱们最初只返回最大间隔,然而咱们须要高度来辅助咱们计算最大间隔,所以能够定义如下的Info类 /** * @author Java和算法学习:周一 */public static class Info {    public int height;    public int maxDistance;    public Info(int height, int maxDistance) {        this.height = height;        this.maxDistance = maxDistance;    }}2、递归套路代码(1)首先判断为空时好不好设置,此时是好设置的,节点为空时new Info(0, 0),即认为空节点高度为0、最大间隔为0。 (2)而后依据列出的所有可能性,编写递归套路的代码,因为要整个造成递归,所以每一步都要返回Info类。(无脑拿到左右子树的Info、拼凑本人的Info、返回本人的Info) /** * 求二叉树的最大间隔的递归套路写法 *  * @author Java和算法学习:周一 */public static Info process(Node x) {    if (x == null) {        return new Info(0, 0);    }    // 获取左右子树的信息    Info leftInfo = process(x.left);    Info rightInfo = process(x.right);    // 拼凑解决本人的信息    // 最大高度是 左右子树最大高度 + 1    int height = Math.max(leftInfo.height, rightInfo.height) + 1;    // 最大间隔是 左子树最大间隔、右子树最大间隔、(左树高度 + 右树高度 + 1) 三个的最大值    int maxDistance = Math.max((leftInfo.height + rightInfo.height + 1),            Math.max(leftInfo.maxDistance, rightInfo.maxDistance));    return new Info(height, maxDistance);}(3)主函数调用递归办法获取后果 /** * @author Java和算法学习:周一 */public static int maxDistance(Node head) {    if (head == null) {        return 0;    }    return process(head).maxDistance;}所有代码地址: https://github.com/monday-pro... 这是二叉树递归套路解法的第二篇,联合上一篇是不是发现又有了新的播种呢。这次咱们又学会了左右子树须要获取的值不同时如何解决、在节点为空时不好设置值时如何解决等。

January 18, 2022 · 1 min · jiezi

关于算法:常见排序算法实现TS-版

1. 公共办法封装Comparator 实现见前文前端比拟办法的优雅封装MinHeap 实现见前文数据结构之 Heap 实现(TS 版)1.1 排序 Class 实现// utils/sort/Sort.tsimport Comparator, { TypeCompareParam } from '../comparator/Comparator'import type { TypeCompareFun } from '../comparator/Comparator'export interface ICallbacks { // If provided then all elements comparisons will be done through this callback. compareCallback?: TypeCompareFun // If provided it will be called each time the sorting function is visiting the next element. visitingCallback?: (a?: any) => void}export default class Sort { protected callbacks: ICallbacks protected comparator: Comparator constructor(originalCallbacks?: ICallbacks) { this.callbacks = Sort.initSortingCallbacks(originalCallbacks) this.comparator = new Comparator(this.callbacks.compareCallback) } static initSortingCallbacks(originalCallbacks: ICallbacks): ICallbacks { const callbacks = originalCallbacks || {} const stubCallback = () => {} callbacks.compareCallback = callbacks.compareCallback || undefined callbacks.visitingCallback = callbacks.visitingCallback || stubCallback return callbacks } public sort(array?: TypeCompareParam[]) { throw new Error('sort method must be implemented') }}1.2 数据交换// utils/swap/swap.tsimport { TypeCompareParam } from '../comparator/Comparator'// 通过解构运算符进行数据交换// 本我的项目中采纳此形式export function swap(arr: TypeCompareParam[], i: number, j: number) { ;[arr[j], arr[i]] = [arr[i], arr[j]]}// 依据数组下标进行数据交换// 此形式为传统实现形式export function swap2(arr: TypeCompareParam[], i: number, j: number) { if (i === j) { return } const temp = arr[i] arr[i] = arr[j] arr[j] = temp}/** * 用异或运算符实现替换 * * 因为是二进制操作,所以仅反对数字替换,这里用二进制示意其值 * 如:A: 4(100), B: 2(010),那么: * 第一次:A = A(100) ^ B(010) = 001 * 第二次:B = A(001) ^ B(010) = 100 * 第三次:A = A(001) ^ B(100) = 010 * * 留神:此办法要求 i !== j,因为没有两头变量保留值,会导致如果是雷同索引的话,信息会失落 */export function swap3(arr: number[], i: number, j: number) { if (i === j) { return } arr[i] = arr[i] ^ arr[j] arr[j] = arr[i] ^ arr[j] arr[i] = arr[i] ^ arr[j]}2. 排序实现2.1 冒泡排序(Bubble Sort)冒泡排序,有时也称为下沉排序,是一种简略的排序算法,它重复遍历列表,比拟相邻元素并在它们的程序谬误时替换它们,直到列表被排序。该算法是一种比拟排序,以较小或较大元素“冒泡”到列表顶部的形式命名。这个算法,不是一种实用的排序算法,它在事实世界的应用中体现不佳,次要用作教育工具。动画演示: ...

January 18, 2022 · 13 min · jiezi