关于算法:ACTSC-625-数学解题

ACTSC 625: Casualty and Health Insurance MathematicsWinter 2022, Assignment 2Consider the collective aggregate risk modeli=1 is a sequence of iid copies of X, which are all independent of N. The primary distributionN BIN(m; q) with m = 15 and q = 0:3 The secondary distribution X EXP() with = 15.(1). Find an exact formula for the cdf of S.(2). Discretize X with span h > 0, and denote the discretized random variable as Xb. be the corresponding discretized aggregate risk. Use Panjerís recursion to compute the cdf FSb(x) atx = nh for n = 0; 1; : : : ;300h. For h = 10; h = 5, h = 1, and h = 0:1, draw the absolute di§erence functionfor x 2 f0; h; 2h; : : : ; 300g, respectively.(3). For the discretized aggregate risk Sb, use the pmf method to compute the cdf FSb(x) at x = nhfor n = 0; 1; : : : ;300h. Again, for h = 10; h = 5, h = 1, and h = 0:1, draw the absolute di§erence functionfor x 2 f0; h; 2h; : : : ; 300g, respectively. Note: the pmf method involves the calculation ofinÖnite sum, which can be approximated by Önite sum, that is, you can impose some stopping rules.(4). Draw some conclusion about the di§erences between these two approaches (Panjerís recursion andpmf method) in terms of precision and computation time. ...

October 13, 2022 · 2 min · jiezi

关于算法:ACS61012-视觉算法与解答

ACS61012 “Machine Vision” Lab AssignmentThe purpose of the lab sessions is to give you practical skills in machine vision andespecially in image enhancement, image understanding and video processing. Machinevision is essential for a number of areas - autonomous systems, including robotics,Unmanned Aerial Vehicles (UAVs), intelligent transportation systems, medical diagnostics,surveillance, augmented reality and virtual reality systems.The first labs focus on performing operations on images such as reading, writing calculatingimage histograms, flipping images and extracting the important colour and edges imagefeatures. You will become familiar how to use these features for the purposes of objectsegmentation (separation of static and moving objects) and for the next high-level tasks ofstereo vision, object detection, classification, tracking and behaviour analysis. These areinherent steps of semi-supervised and unsupervised systems where the involvement of thehuman operators reduces to minimum or is excluded.Your assignment consists of several subtasks listed below and described detail in the labsession parts. This is a brief description of all your tasks:Task 1: Introduction to machine vision:The aim of this task is for you to learn how to read images in different formats convert themfrom one format to another and analyse image histograms Part I of this task: Understanding different image formats, analysis of imagehistogram, You can use Images from the fileFile: Lab 1 - Part I - Introduction to Images and Videos.zip or your own image). Part II of this task: Different types of image noise/ image denoising, static objectsegmentation based on edge detection.For the report from Task 1, you need to present results with:● The Red, Green, Blue (RGB) image histogram of your own picture and analysis thehistogram. The original picture should be shown as well (Lab session 1 – Part I)● Results with different edge detection algorithms, e.g. Sobel, Prewitt and commenton their accuracy with different parameters. Visualise the results and drawconclusions (Lab session 1 – Part II). [10 marks equally distributed betweenpart I and part II ]Task 2: Optical flow estimation algorithm:● Find corner points and apply the optical flow estimation algorithm.(file Lab 2.zip – image Gingerbread Man). [5 marks]● Track a single point with the optical flow approach (file: Lab 2.zip – the red squareimage). [9 marks]For the report, you need to:● Presents results for the ‘Gingerbread Man’ tasks and visualise the results● Visualise the track on the last frame and the ground truth track of ‘Red Square’ tasks2● Compute and visualise the root mean square error of the estimated track by the opticalflow algorithm in comparison with the groundtruth values (the red square).Task 3: Automatic detection of moving objects in a sequence of video framesYou are designing algorithms for automatic vehicular traffic surveillance. As part of thistask, you need to apply two types of approaches: the basic frame differencing approachand the Gaussian mixture approach to detect moving objects.Part I: with the frame differencing approach:● Apply the frame differencing approach (Lab 3.zip file)For the report, you need to present results with:● Image results of the accomplished tasks● Analyse the algorithms performance when you vary the detection threshold.[10 marks]Part II: with the Gaussian mixture approach:● Apply the Gaussian mixture model (file Lab 5.zip)For the report, you need to present results showing:● The algorithm performance when you vary parameters such as number of Gaussiancomponents, initialisation parameters and the threshold for decision making● Detection results of the moving objects, show snapshots of images.[10 marks]Task 4: Treasure hunting:● Application of the basic image processing techniques for finding “a treasure” in animage (Lab 4.zip file). There are three types of images – with easy (10 marks),medium (10 marks) and high level of difficulty (there are two treasures: the sunand the clove). In the third case you need to find both treasures.For the report, you need to present results with:● The three different images showing the path of finding “the treasure”● Explain your solution, present your algorithm and the related MATLAB code[35 marks]Task 5. Study and compare capsule Convolutional Neural Networks (CNNs) withthe Siamese CNNs and YOLO CNN with respect to: their architecture,principle of operation, advantages, disadvantages and applications – withrespect to tasks such as detection, classification and segmentation.[21 marks]A Well-written Report Contains:● A title page, including your ID number, course name, etc., followed by a content page.● The main part: description of the tasks and how they are performed, including resultsfrom all subtasks. For instance: “This report presents results on reading and writingimages in MATLAB. Next, the study of different edge detection algorithms is presentedand their sensitivity to different parameters…” You are requested to present inAppendices the MATLAB code that you have written to obtain these results. A veryimportant part of your report is the analysis of the results. For instance, what does theimage histogram tell you? How can you characterise the results? Are they accurate? Isthere a lot of noise? 3● Conclusions describe briefly what has been done, with a summary of the mainresults.● Appendix: Present and describe briefly in an Appendix the code only for tasks 2- ...

October 13, 2022 · 34 min · jiezi

关于算法:720S1树的算法解析

Computer Science 720S1C – (2022)Assignment 2 (Trees and Treewidth)Due: Saturday, April 16RequirementsThis assignment deals with trees and graphs of bounded treewidth. The first part tests your under-standing of rooted tree isomorphism and the second part has you develop a linear-time algorithm (forgraphs of bounded treewidth) for a known NP-hard graph optimization problem.You will submit your source code to https://www.automarker.cs.auc... If you have notused the automarker before, please read the help/FAQ page.Determine Tree GroupsWe want to group together the same rooted trees from a collection of rooted trees. In general we havethe following constraints: The root node always remains in this position, i.e., as root. Each other node remains connected to its original parent node. Each node (root or not) branches out to the same set of nodes but the order of outgoing branchesmay change in an arbitrary way.Thus, in the following diagram, the trees (a) and (b) could represent the same tree, but the treesrepresented in (c) and (d) are certainly different. The roots are labeled by 0 in this example.1We want to write a program that will identify matching trees (rooted tree isomorphism) under thesereshuffling rule, i.e., trees that could represent the same tree. This matching is an equivalence relationand the problem can be solved by annotating each tree with the number of its equivalence class. Yourtask is to determine which trees are equivalent.Input FormatInput (from stdin) consists of a number of scenarios, with each scenario consisting of a number of trees.Each scenario starts with a line containing a single number, n (1 ≤ n ≤ 100) specifying the number oftrees in the scenario, followed by n descriptions. Each description consists of a number k (1 ≤ k ≤ 1000)specifying the number of nodes in the tree, followed by k numbers specifying the parent of each node inturn (using ?1 for the root node, which has no parent). Each tree is implicitly numbered by its positionin this list. The sequence of scenarios is terminated by an empty scenario, i.e., a line containing only azero (‘0’).Output FormatOutput (to stdout) consists of one line for each scenario, starting with a scenario sequence number (0based), a colon (‘:’), a space, and followed by a succession of class numbers, one for each tree, in inputorder, and separated by single spaces. All trees in a matching class are annotated by the same classnumber. Class numbers are allocated successively in input tree order, starting with 0, and increased by1 at the first occurrence of an tree not matching any of the previous.Sample Input and OutputInput OutputChromatic SumFor this part, you will do some basic programming regarding the t-parse representation of graphs.We use the following t-parse input format for graphs of bounded treewidth. The first token will be aninteger 0 ≤ t ≤ 9 denoting the pathwidth/treewidth of the graph (i.e., it indicates a t-parse will follow).The interpretation for the remaining tokens are given in the next table.token semantic meaningi a vertex operator i, represented as an integer, where 0 ≤ i ≤ t ≤ 9ij an edge operator (i, j) where t ≥ i > j ≥ 0 (note: no space between i and j)( a begin marker for a pathwidth t-parse (can be nested for treewidth t-parses)) an end marker for a pathwidth/treewidth t-parseThus, if you read/encounter the two tokens ‘)’ and ‘(’ in sequence then this denotes a circle plus ⊕operator. Note that it is guaranteed that each right token ‘(’ will have a matched left token ‘)’. Each’(’ except first token must be preceded by a parenthesis and ’)’ may be succeeded “up the parse tree”by pathwidth operators. We assume boundary vertices 0, 1, . . . , t precede the first token of a pathwidtht-parse (and these empty boundaried graph axioms are not given in the input format). Assume left-associativity for all operators and at least one space between each of them, including the parentheses.Input will consist of several test cases, each on its own line. The input is terminated by a t = 0 case,which is also processed.For this part of the assignment you will learn how to exploit the structure of bounded pathwidth/treewidthfor a known NP-hard graph problem: 3-ChromaticSum. For input graph of bounded pathwidth ortreewidth in t-parse representation as described above, decide if it can be colored with at most 3 colorsand if so output its chromatic sum, otherwise output ‘None’ .A graph G = (V,E) is 3-colorable if there is a function (e.g. proper coloring) f : V → {1, 2, 3} suchthat for all (u, v) ∈ E we have f(u) 6= f(v). The chromatic sum of a graph G is the minimum sumv∈V f(v) of a proper coloring f of G. Note the minimum number of colors needed (chromatic number)may not necessarily correspond with its minimum chromatic sum as shown in the following example.The 2-coloring on the left has a sum of 12 while the 3-coloring on the right has a smaller sum of 11.3Sample Input/OutputTypical input instances and expected output of the two problems are shown below. Note that you canassume that each input graph fits on one line.Sample input2 ( 10 21 1 10 21 0 10 20 2 20 21 )2 ( ( 10 21 1 10 21 1 21 10 ) ( 21 2 21 20 ) ( 10 ) )4 ( ( 10 20 30 41 4 41 31 ) ( ( 40 21 32 42 ) ( 10 0 43 10 20 ) ) )0 ( ( 0 ) ( 0 0 ) )Sample outputSubmission and MarksAll input should be taken from the keyboard (stdin) and output to the console (stdout). This assignmentis worth 10% of your final grade. Marks (out of a total 10) for each part’s test cases are specified onthe automarker scoreboard. Note that your final grade may be marked with more difficult test casesthan what is provided to the automarker. If you exceed 8 submissions per any problem test case thena 20% deduction will occur (on that case) if you eventually get it correct. Partial marks may be givenlater so try to submit something even if you know it is not 100% correct. ...

October 13, 2022 · 5 min · jiezi

关于算法:COMP2406社区开发

COMP2406 Assignment 4 – Communityfridge web application with MongoDBThis assignment mostly focuses on content from Weeks 10-12 of class.In the past three assignments, we have been building various parts of a communityfridge web application. In Assignment 1, we built the client-side functionality of theapplication, to allow users to browse the list of fridges, browse items in a fridge, andpickup items from a fridge. In Assignment 2, we built the server-side component ofthe web application. Specifically, we created a Node.js server to serve all theresources associated with the application (e.g., HTML, CSS, JavaScript, CSS, andJSON). In addition to this, we also added persistence in our application. InAssignment 3, we further built the assignment in Express, specifically focusing onbuilding a REST API.In this assignment, we will connect our Express application to a MongoDB database.This involves moving all of the data from our JSON files into the MongoDBdatabase and performing queries on this data.This assignment should be completed individually. It must be completed usingNode.js, Express, and MongoDB/Mongoose.Starting codeWe have provided the solution for Part 1 of assignment 3 as starting code for thisassignment. If you were unable to fully complete assignment 3, you can use theprovided solution as a starting point for this assignment. We made some slightchanges to the Express routes from A3, so if you would like to use your ownAssignment 3, please make the required changes. These changes are highlighted inthe specification by the marker [*updated].All of the application resources should be placed on the Node.js web server. Youshould not save any resources on the client-side. With regards to resources, wemean all assets associated with the application such as HTML files, CSS files,JavaScript files, images, and any other such assets used by your web application.All data associated with the application should be stored in a MongoDB databaseas specified in the following sections. Questions that are implemented withoututilizing the database will receive a mark of 0. For example, if any of the JSON filesare updated instead of the database, a mark of 0 will be given for that question.Similarly, the solution must be implemented using a REST API created inAssignment 3. This API must be updated with the necessary changes required forthis assignment.RequirementsThe primary requirements of the assignment involve implementing a database forour Express application. All routes will implemented on the server-side and testedusing Post-man. You do not need to implement the client-side HTML/JavaScriptcode associated with the routes. However, there is a bonus question, whichinvolves implementing a client-side component of the "Search feature". As this is abonus, it is optional for the assignment. It is meant for those who would like morepractice working with the client-side code.Part 1: Setting up a databaseBegin by setting up your MongoAtlas cloud database account as explained in thelectures. We also used this account in Tutorial 9. If you did not get a chance tocomplete the tutorial, please watch the "Setting up a MongoDB Cloud account"video from week 10. We recommend you complete this step well in advance ofcompleting the assignment, as not being able to setup the account will hinder yourability to successfully complete the assignment.As shown in the lectures, your code should have a config.js file, which includes theconnection information for your MongoDB database.You must update the following information in the file to correspond to yourassignment setup:• username: update the value in this variable to your MongoDB username• password: update the value in this variable to your MongoDB password• dbname: update the dbname to community-fridge-stdnumber", wherestdnumber is equal to your student number. For example, if your studentnumber is 100978291, then the value of the dbname variable should be"community-fridge-100978291"Failure to update any of these values correctly will result in a mark of 0 for theassignment. The TAs need to be able to execute the code for a large number ofstudents and completing this part incorrectly will affect their ability to mark theassignment in a timely manner.NOTE: when you make changes to the database, you must "refresh" the MongoDBAtlas page to see the new changes. Similarly, you must restart the Node.js serveranytime you make changes to your server-side code.Part 2: Creating database schemas (6-marks)Once the MongoDB database is setup, you need to use Mongoose to create threeschemas for your database. These schemas will be used to add elements into thedatabase. Specifically, the database should have the following three schemas: ...

October 13, 2022 · 14 min · jiezi

关于算法:COMP3065视觉计算

COMP3065 Computer vision Coursework (40% of Module Mark) Submit an electronic copy via Moodle In class we have learned many techniques that help solve computer vision problems. Sometechniques are discussed in details in the lecture or in the labs while some are only brieflydiscussed. In this coursework, you are required to apply these techniques to solve practicalproblems at your interest. You will implement/or use the techniques discussed in class or anycomputer vision algorithm you found through the text books or published papers, dependingon the projects you select to work on. ...

October 13, 2022 · 4 min · jiezi

关于算法:ICS53解决方案

ICS-53 Assignment-1Spring 2022Problem - 1Write a program which prompts the user to enter a string and returns the count of all thecharacters in the string in increasing order of occurrence and lastly, prints the string with thecharacters sorted in ascending order. The program should first print a “>” symbol as a prompt tothe user. The user then enters the string and the program prints the count results. Punctuations,whitespaces and non-printable characters are ignored while processing the input string. Assumethat the length of the string is no longer than 256 characters including the null terminatingcharacter. (‘\0’). The frequency of characters having the same frequency can be printed in anyorder. You can assume that the entered string will not have uppercase characters but it still canhave punctuations, whitespaces.The following shows an example where the user enters the string “hello world”. ...

October 12, 2022 · 6 min · jiezi

关于算法:DSCI553引用

DSCI553 Foundations and Applications of Data MiningSpring 2022Competition ProjectDeadline: May 4th 3:00 PM PST Overview of the AssignmentIn this competition project, you need to improve the performance of your recommendation system fromAssignment 3. You can use any method (like the hybrid recommendation systems) to improve theprediction accuracy and efficiency.Competition Requirements2.1 Programming Language and Library Requirementsa. You must use Python to implement the competition project. You can use external Python libraries aslong as they are available on Vocareum.b. You are required to only use the Spark RDD to understand Spark operations. You will not receive anypoints if you use Spark DataFrame or DataSet.2.2 Programming EnvironmentPython 3.6.4, Scala 2.11, JDK 1.8 and Spark 3.1.2We will use these library versions to compile and test your code. There will be a 20% penalty if wecannot run your code due to the library version inconsistency.2.3 Write your own codeDo not share your code with other students!!We will combine all the code we can find from the Web (e.g., GitHub) as well as other students’ codefrom this and other (previous) sections for plagiarism detection. We will report all the detectedplagiarism.Yelp DataIn this competition, the datasets you are going to use are from:https://drive.google.com/driv...We generated the following two datasets from the original Yelp review dataset with some filters. Werandomly took 60% of the data as the training dataset, 20% of the data as the validation dataset, and20% of the data as the testing dataset.A. yelp_train.csv: the training data, which only include the columns: user_id, business_id, and stars.B. yelp_val.csv: the validation data, which are in the same format as training data.C. We are not sharing the test dataset.D. other datasets: providing additional information (like the average star or location of a business)a. review_train.json: review data only for the training pairs (user, business)b. user.json: all user metadatac. business.json: all business metadata, including locations, attributes, and categoriesd. checkin.json: user checkins for individual businessese. tip.json: tips (short reviews) written by a user about a businessf. photo.json: photo data, including captions and classificationsTask (8 points)In the competition, you need to build a recommendation system to predict the given (user, business)pairs. You can mine interesting and useful information from the datasets provided in the Google Drivefolder to support your recommendation system.You must make an improvement to your recommendation system from homework assignment 3 interms of accuracy. You can utilize the validation dataset (yelp_val.csv) to evaluate the accuracy of yourrecommendation system. There are two options to evaluate your recommendation system:(1) Error Distribution: You can compare your results to the corresponding ground truth and compute theabsolute differences. You can divide the absolute differences into 5 levels and count the number for eachlevel as following: ...

October 12, 2022 · 6 min · jiezi

关于算法:CSE111C讨论

CSE-111 • Spring 2022 • Program 1 • Overloading and operators 1 of 7$Id: asg1-dc-bigint.mm,v 1.267 2022-04-03 12:04:19-07 - - $/afs/cats.ucsc.edu/courses/cse111-wm/Assignments/asg1-dc-biginthttps://www2.ucsc.edu/courses... Using C++11/14/17 (g++ -std=gnu++20)All programming in this course will be done C++ style, not C style.Do not use : Instead, use :char* strings <string>C arrays <vector><stdio.h>, <cstdio> <iostream>, <iomanip>pointers <shared_ptr> or <unique_ptr>union inheritance or <variant><header.h> <cheader>Include only C++ header files and use the declaration using namespace std; Include<cheader> files only when C++ header files do not provide a necessary facility.Include <header.h> files from C only when an appropriate <cheader> file does notexist. Use the script cpplint.py.perl (a wrapper for cpplint.py) to check style.The production system for all work is unix.ucsc.edu using g++. Compile withg++ -std=gnu++20 -g -O0 -Wall -Wextra -Wpedantic -Wshadow -Wold-style-castFollowing is a description of these options :• -std=gnu++20 Gnu dialect of C++20.• -g produces debugging information into object files and the binary executable.This is necessary for gdb and valgrind to use symbolic names.• -O0 reduces compilation time and makes debugging produce more expectedresults. Optimization may rearrange bugs in code in unexpected ways.• -Wall enables all the warnngs about questionable constructions.• -Wextra enables extra warnings that are not enabled with -Wall.• -Wpedantic issues all warnings required by strict ISO C++ and rejects all programsthat do not conform to ISO C++.• -Wshadow warns whenever a local variable or declaration shadows another variable,parameter, or class member.• -Wold-style-cast warns about the use of any old-style (C-style) cast. Instead,use one of : static_cast, dynamic_cast, const_cast, reinterpret_cast. Betteryet, code in suchaway as to not need casts.• -fdiagnostics-color=never prevents the compiler from using those silly annoyingcolors in diagnostics.The particular g++ compiler we will be using is-bash-1$ which g++/opt/rh/devtoolset-11/root/usr/bin/g++-bash-2$ g++ --version | grep -i g++g++ (GCC) 11.2.1 20210728 (Red Hat 11.2.1-1)-bash-3$ uname -npounix1.lt.ucsc.edu x86_64 GNU/LinuxIf you develop on your personal system, be sure to port and test your code on theLinux timeshares. If it compiles and runs on your system, but not on the timeshares,then it does not wor k.CSE-111 • Spring 2022 • Program 1 • Overloading and operators 2 of 7OverviewThis assignment will involve overloading basic integer operators to perform arbitraryprecision integer arithmetic in the style of dc(1). Your class bigint will intermixarbitrarily with simple integer arithmetic.To begin read the man(1) page for the command dc(1) :man -s 1 dcA copy of that page is also in this directory. Your program will use the standard dcas a reference implemention and must produce exactly the same output for thecommands you have to implement :+-*/%^cdfpqIf you have any questions as to the exact format of your output, just run dc(1) andmake sure that, for the operators specified above, your program produces exactlythe same output. A useful program to compare output from your program with thatof dc(1) is diff(1), which compares the contents of two files and prints only the differences.Also look in the subdirectory misc/ for some examples.See also :• dc (computer program)https://en.wikipedia.org/wiki...(computer_program)• dc, an arbitrary precision calculatorhttps://www.gnu.org/software/...Implementation strategyAs before, you have been given starter code.(a) Makefile, debug, and util If you find you need a function which does not properlybelong to a given module, you may add it to util.(b) The module scanner reads in tokens, namely a NUMBER, an OPERATOR, or SCANEOF.Each token returns a token_t, which indicates what kind of token it is (theterminal_symbol symbol), and the string lexinfo associated with the token.Only in the case of a number is there more than one character. Note that oninput, an underscore (_) indicates a negative number. The minus sign (-) isreserved only as a binary operator. The scanner also has defined a couple ofoperator<< for printing out scanner results in debug mode. This is strictly fordebugging.(c) The main program main.cpp, has been implemented for you. For the six binaryarithmetic functions, the right operand is popped from the stack, then the leftoperand, then the result is pushed onto the stack.(d) The module iterstack can not just be the STL stack, since we want to iteratefrom top to bottom, and the STL stack does not have an iterator. A stackdepends on the operations back(), push_back(), and pop_back() in the underlyingcontainer. We could use a vector, a deque, or just a list, as long as the requisiteoperations are available.CSE-111 • Spring 2022 • Program 1 • Overloading and operators 3 of 7Class bigintThen we come to the most complex part of the assignment, namely the class bigint.Operators in this class are heavily overloaded.(a) Most of the functions take a arguments of type const bigint&, i.e., a constantreference, for the sake of efficiency. But they have to return the result byvalue.(b) The operator<< can’t be a member since its left operand is an ostream, so wemake it a friend, so that it can see the innards of a bigint. Note now dc printsreally big numbers. operator<< is used by debugging functions.(c) The function print (suitably modified) is used for actual output.(d) The relational operators == and < are coded individually as member functions.The others, !=, <=, >, and >= are defined in terms of the essential two.(e) All of the functions of bigint only work with the sign, using ubigint to do theactual computations. So bigint::operator+ and bigint::operator- will checkthe signs of the two operands then call ubigint::operator+ or ubigint::operator-,as appropriate, depending on the relative signs and magnitudes. Themultiplication and division operators just call the corresponding ubigint operators,then adjust the resulting sign according to the rule of signs.Class ubigintClass ubigint implements unsigned large integers and is where the computationalwork takes place. Class bigint takes care of the sign. Now we turn to the representationof a ubigint, which will be represented by vector of bytes.(a) Replace the declarationusing ubigvalue_t = unsigned long;withusing ubigvalue_t = vector<uint8_t>;in the header file <ubigint.h>. The type uint8_t is an unsigned 8-bit integerdefined in <cstdint>.(b) In storing the big integer, each digit is kept as an integer in the range 0 to 9 inan element of the vector. Since the arithmetic operators add and subtractwork from least significant digit to most significant digit, store the elements ofthe vector in the same order. That means, for example, that the number 4629would be stored in a vector v as : v[3]==4, v[2]==6, v[1]==2, v[0]==9. In otherwords, if v[k]==d, then the digit’s place value is d*pow(10,k). In mathematicalnotation, the value of a radix 10 (base 10) number v with n digits is :n−1i=0 vi10i= vn−110n−1vn−210n−2... + v2102v1101v0100(c) In order for the comparisons to work correctly, always store numbers in acanonical form : After computing a value from any one of the six arithmeticoperators, always trim the vector by removing all high-order zeros :while (size() > 0 and back() == 0) pop_back();CSE-111 • Spring 2022 • Program 1 • Overloading and operators 4 of 7(d) Canonical form.• Zero is represented as a vector of size zero and a positive sign.• High-order zeros are suppressed.• All digits are stored as uint8_t values in the range 0...9, not as characters inthe range ’0’...’9’.• To print a digit, cast it to an integer : cout << static_cast<int> (digit).• This can be done more easily by : cout << int (digit), which looks like actor call.(e) The scanner will produce numbers as strings, so scan each string from the endof the string, using a const_reverse_iterator (or other means) from the end ofthe string (least significant digit) to the beginning of the string (most signifi-cant digit) using push_back to append them to the vector.Implementation of operators(a) For bigint::operator+, check the signs.(1) If the signs are the same :• Call ubigint::operator+ with the unsigned numbers.• The sign of the result is the sign of either number.(2) If the signs are different :• Call ubigint::operator- with the larger number as its left number.• The sign of the result is the sign of the larger number.(b) The operator bigint::operator-, check the signs.(1) If the signs are different :• Call ubigint::operator+ with the unsigned numbers.• The sign of the result is the sign of the left number.(2) If the signs are the same :• Call ubigint::operator- with the larger number as its left number.• If the left number is larger, the sign of the result is its sign.• Else the the result has the opposite of the sign of the right number.(c) For the above bigint::operator+ and bigint::operator-, to find the ‘‘larger’’number, make use of ubigint::operator<. Since the numbers are kept incanonical form (see above), to compare them :(1) Check the size() of each vector. If different, the larger number has thegreater size.(2) If the sizes are the same, write a loop iterating from the highest-orderdigit toward the lowest-order digit, comparing digit by digit.• As soon as a difference is found, return true or false, as appriate.• If all digits are the same, then return false.(d) To implement ubigint::operator+, create a new ubigint and proceed from thelow order end to the high order end, adding digits pairwise. For any sum >=10, take the remainder and add the carry to the next digit. Use push_back toappend the new digits to the ubigint. When you run out of digits in theshorter number, continue, matching the longer vector with zeros, until it isdone. Make sure the sign of 0 is positive.CSE-111 • Spring 2022 • Program 1 • Overloading and operators 5 of 7(e) To implement ubigint::operator-, also create a new empty vector, startingfrom the low order end and continuing until the high end. If the left digit issmaller than the right digit, the subtraction will be less than zero. In thatcase, add 10 to the digit, and set the borrow to the next digit to −1. After thealgorithm is done, pop_back all high order zeros from the vector before returningit. Make sure the sign of 0 is positive.(f) To implement bigint::operator==, check to see if the signs are the same andubigint::operator== returns true.(g) To implement ubigint::operator==, just use the vector::operator== comparisonfunction.(h) To implement bigint::operator<, remember that a negative number is lessthan a positive number. If the signs are the same, use ubigint::operator< fora comparison. For positive numbers, the smaller one is less. and for negativenubmers, the larger one is less.(i) To implement ubigint::operator<, check the size() of each vector. Theshorter one is less than the longer one. If the size() are the same, scan thevectors in parallel from the most significant digit to the last significant digituntil a difference is found.(j) Implement function bigint::operator*, which uses the rule of signs to determinethe result. The number crunching is delegated to ubigint::operator*,which produces the unsigned result.(k) Multiplication in ubigint::operator* proceeds by allocating a new vectorwhose size is equal to the sum of the sizes of the other two operands. If u is avector of size m and v is a vector of size n, then in O(mn) speed, perform an outerloop over one argument and an inner loop over the other argument, adding thenew partial products to the product p as you would by hand. The algorithmcan be described as follows :p=all zerosfor i in interval [0,m):carry = 0for j in interval [0,n):digit = p[i+j] + u[i] * v[j] + carryp[i+j] = digit % 10carry = digit / 10p[i+n] = carryNote that the interval [a,b) refers to the half-open interval including a butexcluding b. This is the set {x| a<=x && x<b}. In the same way,apair of iteratorsin C++ is used to bound an interval (begin and end pair).(l) Long division is complicated if done correctly. See a paper by P. BrinchHansen, ‘‘Multiple-length division revisited : A tour of the minefield’’, Software— Practice and Experience 24, (June 1994), 579–601. Algorithms 1 to 12 areon pages 13–23, Note that in Pascal, array bounds are part of the type, whichis not true for vectors in C++.CSE-111 • Spring 2022 • Program 1 • Overloading and operators 6 of 7• multiple-length-division.pdf• http://brinch-hansen.net/pape...• http://citeseerx.ist.psu.edu/...(m) The function divide as implemented uses the ancient Egyptian division algorithm,which is slower than Hansen’s Pascal program, but is easier to understand.Replace the long values in it by vector<digit_t>. The logic is shownalso in misc/divisioncpp.cpp. The algorithm is rather slow, but the big-Oanalysis is reasonable.(n) The unsigned division function that is provided depends on two private functions,multiply_by_2 and divide_by_2, which are in-lace non-constant functions.They both perform without creating a new object.(1) To implement multiply_by_2, iterate from the low order digit, and doubleeach digit (remainder 10), carrying to the next higher digit. At the end, ifthe carry is 1, use push_back.(2) To implement divide_by_2, iterate from the low order digit, and divideeach digit by 2. Then, if the next higher digit is odd, add 5 to the currentdigit. Be careful of the end, and pop_back any remaining high orderzeros.(o) Modify operator<<, first just to print out the number all in one line. You willneed this to debug your program.(p) The function print will print numbers in the same way as dc(1) does.(q) The pow function uses other operations to raise a number to a power. If theexponent does not fit into a single long print an error message, otherwise dothe computation. The power function is not a member of either bigint or ubigint,and is just considered a library function that is implemented using moreprimitive operations.Memory leak and other problemsMake sure that you test your program completely so that it does not crash on a SegmentationFault or any other unexpected error. Since you are not using pointers,and all values are inline, there should be no memory leak. Use valgrind(1) to checkfor and eliminate uninitialized variables and memory leak.If your program is producing strange output or segmentation faults, use gdb(1) andthe debug macros in the debug module of the code/ subdirectory.What to submitSubmit source files and only source files : Makefile, README, and all of the headerand implementation files necessary to build the target executable. If gmake does notbuild ydc your program can not be tested and you lose 1/2 of the points for theassignment. Use checksource on your code to verify basic formatting.Look in the grader’s score subdirectory for instructions to graders. Read Syllabus/pair-programming/ and also submit PARTNER if you are doing pair programming.Either way submit the README described therein.CSE-111 • Spring 2022 • Program 1 • Overloading and operators 7 of 7Et cetera ( ‘´).The accuracy of the Unix utility dc(1) can be checked by :echo ’82 43/25 43+65P80P82P73P76P32P70P79P79P76P10P’ | dc

October 12, 2022 · 12 min · jiezi

关于算法:LC729-My-Calendar-I

https://leetcode.com/problems... MediumGoogle, Uber, Amazon, Twitchclass MyCalendar { private List<int[]> events; public MyCalendar() { events = new ArrayList<>(); //题目有输出限度,0 <= start < end <= 10^9 //能够减少左右边界,不便计算 events.add(new int[]{-1, 0}); events.add(new int[]{1000000001, 1000000001}); } public boolean book(int start, int end) { // 应用二分法查找能够插入的地位 int left = 0, right = events.size() - 1; while (left + 1 < right) { int mid = left + (right - left) / 2; int[] event = events.get(mid); if (start == event[0]) return false; // 如果start等于以后event的start,那么必定有抵触,间接返回false if (start < event[0]) right = mid; // 若start小于以后event的start,那么要往左边找 else left = mid; // 若start大于以后event的start,那么往右找 } // 最终要安顿插入的event就是坐落在left和right之间,看是否能插入 if (start >= events.get(left)[1] && end <= events.get(right)[0]) { // 能够插入 events.add(right, new int[]{start, end}); return true; } // 不能插入 return false; }}

October 12, 2022 · 1 min · jiezi

关于算法:LC-2034-Stock-Price-Fluctuation

MediaGooglehttps://leetcode.com/problems... class StockPrice { // key: time, value: price private Map<Integer, Integer> timePrice; // key: price, value: frequency,应用tree map,使得依照price从小到大排序,不便间接获取max / min private TreeMap<Integer, Integer> priceFreq; private int latestTime; // 最新的工夫 public StockPrice() { timePrice = new HashMap<>(); latestTime = 0; priceFreq = new TreeMap<>(); } public void update(int timestamp, int price) { // 更新最新工夫,始终让latestTime放弃为最近的工夫戳,在调用current办法时,间接从map中获取 latestTime = Math.max(latestTime, timestamp); // 如果工夫戳之前保留过,那么对频率表进行更新 if (timePrice.containsKey(timestamp)) { // 依据工夫戳,拿到之前的旧price int oldPrice = timePrice.get(timestamp); // 因为更改了,所以把频率-1 priceFreq.put(oldPrice, priceFreq.get(oldPrice) - 1); // 如果该price频率更改后为0,那么须要移除该price if (priceFreq.get(oldPrice) == 0) priceFreq.remove(oldPrice); } // 别离更新两个map中的新的price timePrice.put(timestamp, price); priceFreq.put(price, priceFreq.getOrDefault(price, 0) + 1); } public int current() { // 依据最新工夫间接获取price return timePrice.get(latestTime); } public int maximum() { // 从priceFreq中间接取最初那个最大price return priceFreq.lastKey(); } public int minimum() { // 从priceFreq中间接取第一个最小的price return priceFreq.firstKey(); }}

October 12, 2022 · 1 min · jiezi

关于算法:LC818-Race-Car

https://leetcode.com/problems... HardGoogle, Amazon第一种解法应用BFS // bfspublic int racecar(int target) { int res = 0; Queue<int[]> q = new LinkedList<>(); // 0: position, 1: speed Set<String> visited = new HashSet<>(); visited.add("0#1"); q.offer(new int[]{0, 1}); while (!q.isEmpty()) { int size = q.size(); for (int i = 0; i < size; i++) { int[] cur = q.poll(); assert cur != null; int pos = cur[0], speed = cur[1]; if (pos == target) return res; // 指标地位,间接返回res // 1. 尝试减速,更新新地位,新速度 int newPos = pos + speed, newSpeed = speed * 2; String key = newPos + "#" + newSpeed; if (!visited.contains(key) && newPos > 0 && newPos < target * 2) { visited.add(key); q.offer(new int[]{newPos, newSpeed}); } // 2. 尝试转向,地位不变,速度依据正负数变成1或者-1 newPos = pos; newSpeed = speed > 0 ? -1 : 1; key = newPos + "#" + newSpeed; if (!visited.contains(key) && newPos > 0 && newPos < target * 2) { visited.add(key); q.offer(new int[]{newPos, newSpeed}); } } res++; } return -1;}第二种解法,DPdp[target] 示意行驶长度为target的间隔须要的最小批示个数。dp[target]有两种可能: ...

October 12, 2022 · 2 min · jiezi

关于算法:融云实践主流叙事之外科技如何助力民生改善

十一长假刚过,在恪守疫情防控相干规定的前提下,置信不少在外奋斗的“漂族”抉择将假期用来陪伴家人,也或多或少又一次意识到,父母老了。关注【融云寰球互联网通信云】理解更多 咱们总是从身边人的变动来感知这个社会,也会在四周越来越多人上年纪的事实下,更深切地感触到“老龄化社会”这个词的真正象征。尽管,它作为一个概念,曾经被咀嚼多时。中国从 1999 年开始进入老龄化社会,且过程十分快。国家统计局数据显示,2021 年我国 60 岁及以上人口 26736 万人,占全国人口的 18.9%。其中,65 岁及以上人口占全国人口的 14.2%。这意味着,我国曾经进入深度老龄社会。 这让咱们的适老化革新需要更加迫切,而其中最为辣手的,是失能老人的护理问题。《中国养老服务蓝皮书(2012—2021)》显示,预计到 2025 年我国失能总人口将回升到 7279.22 万人。 长期护理险就是解决这部分人群需要的针对性计划,以长期处于失能状态的参保人群为保障对象,重点解决失能老人的根本护理需要,目前已笼罩 49 个城市。 上海这座“长命城市”,就是首批试点城市之一。上海老龄办、卫健委、统计局的联结考察显示:截至 2021 年底,上海 60 岁及以上老年人口占总户籍人口的 36.3%。上海从 2018 年开启长护险全市试点,摸索从制度层面解决老年人日常照护这一刚需问题的方法。 当然,这个问题的解决还须要社会、企业等力量的退出。据悉,上海目前已有上千家机构从事长护险服务。国内当先智慧城市解决方案提供商万达信息推出的“家护小助”App,被多家护理服务机构采纳为护工治理平台。 在一直迭代过程中,万达信息与融云达成单干,买通“家护小助”用户端、医护端、治理端和护工挪动端,成为一个领有下单派单、路线指引、签到签退、近程通信、数据分析治理等多功能的业余护工治理平台。目前,单方还在尝试将科技伎俩利用于老年人服务体验的多方面晋升,让更多人体面地面对苍老这个“每个人生命中终将降临的落日”。 近程通信 护理工作“得力助手”刘奶奶就是上海长护险的典型服务对象。她跟老伴儿都年逾七十,属长护险笼罩的“纯老家庭”(家庭人口都在 60 周岁以上)。数据显示,上海去年底“纯老家庭”老年人数达 166.38 万人。家庭规模日趋小型化的古代社会,“纯老家庭”越来越多,也肯定会随同着一些新需要的产生。 刘奶奶老两口行动不便,曾经近乎两年不怎么出门了。每周刘奶奶通过“家护小助”用户端预约护理,护理员则经由护理端失去派单并上门服务,洗澡、洗头、理发、剪指甲……每次服务刘奶奶本人领取 10% 的费用。 对刘奶奶这样的“纯老家庭”来说,护理员就是政策之下,服务机构为家里添的一双帮手。而对“家护小助”零碎来说,融云也是一个让其服务更欠缺的好帮手。 护理员通过“家护小助”,能够不便地进行订单治理、签到签退及路线布局。同时,万达信息还可通过机构 SaaS 服务治理平台,为采纳“家护小助”的服务机构提供数据上报等全闭环系统管理反对。 (家护小助 App 界面) 在集成融云 RTC 实时音视频服务后,服务机构和护工的工作都得以在近程通信的赋能下更加标准无效地推动。 对于受伤卧床人士,护工能够借助融云通信服务与医生近程对话,在医生的领导下对病人进行更加业余的换药和护理工作。 对于独居在家的老人,视频通话性能则能够让护工在后盾工作人员的近程督导下开展工作,并且录像存档,确保护理工作的合规性。 长护险和相干服务机构的无效摸索,大大提高了老人的生存品质,无效缓解了家属的照护累赘。而“家护小助”作为反对护工高效标准发展工作的必备挪动工作台,曾经服务了上海、巨鹿、温州、西安、宁波等地的多家长护险养老及上门护理服务机构,日活 5 万+,累计服务用户近 30 万。 科技普惠 老龄社会“老有所护”咱们的网速越来越快,手机越来越薄,各个厂商在强烈内卷中依附更先进的技术、更大的数据池、更牛的算法抢夺着年轻人寸土寸金的手机内存和愈发扩散的注意力,但眼光不迭之处,还有一片无人之境。而这部分人的需要,却恰好是科技施展效应最好的用武之地,尤其是当咱们身处一个逐步老龄化的社会中时。往年 9 月 20 日,国家卫健委老龄司司长王海东示意,预计“十四五”期间,60 岁及以上老年人口总量将冲破 3 亿。 “占据中国人口近五分之一的老年人,不应被排除在支流叙事之外”曾经在近几年逐步成为共识。而其中,居家养老且口头力缺失那局部老人的生存更应该被关注和关怀。 我国养老模式呈“9073”格局,90% 左右的老年人居家养老,7% 左右的老年人依靠社区反对养老,3% 入住机构养老。也就是说,到 2025 年,将约有 2.7 亿老年人处于居家养老状态。让老人过上有品质的老年生存,须要汇聚政府、社会和市场三方的力量。随着物联网、云计算、大数据、挪动互联网等技术衰亡,不少企业也在退出这个行列,这是商业的温度,也是商业的远见。万达信息将信息技术与养老服务相交融,并在融云通信云服务的助力下,在软件上发力,为老年人提供触手可及的智能化服务。 ...

October 11, 2022 · 1 min · jiezi

关于算法:2022KDD论文解读一种基于动态时空图的取货配送路径预测模型Graph2Route

菜鸟网络2022KDD论文:Graph2Route: A Dynamic Spatial-Temporal Graph Neural Network for Pick-up and Delivery Route Prediction 前文(2021KDD论文解读:外卖配送服务中门路布局与工夫预测的深度学习办法)曾阐明,骑手的门路预测与布局门路举荐之间存在比拟大的差距(前者的指标是预测骑手行为,后者的指标是给骑手举荐最佳门路),间接应用运筹优化等算法求解最优门路作为预测骑手将来拜访门路的后果,是一种十分不合理的形式。因而,并不适宜上游工作持续应用(e.g.送达工夫预测和订单指派)。 本文与前文指标相似,解决解决PDRP(Pick-up and Delivery Route Prediction task)问题,翻新点在于将图网络引入到门路预测中。 1.介绍[3] A Deep Learning Method for Route and Time Prediction in Food Delivery Service.2021. [17] Package Pick-up Route Prediction via Modeling Couriers’ Spatial-Temporal Behaviors.2021. [20] Route prediction for instant delivery.2019.截止目前,解决PDRP问题的论文次要有4篇(含本文)。 OSquare是解决PDRP问题的鼻祖,它将该问题看做next-location prediction问题,应用传统机器学习办法顺次预测下一个location。FDNET提供一种深度学习解决办法,将LSTM作为decoder,Pointer作为decoder,一次性预测出整个拜访序列。(2021KDD论文解读:外卖配送服务中门路布局与工夫预测的深度学习办法)DeepRoute应用Transfermer作为encoder,蕴含attention的RNN作为decoder,预测pickup问题的拜访门路以上办法各有可取之处,但都存在以下问题(figure1 left所示): 仅将未实现工作的PDRP看做序列预测,进而应用一些序列预测算法(e.g.BiLSTM),短少利用时空关系的能力;不可避免的解码出显著不合理的route(figure1 t2,D是最远的工作,不应该呈现在该预测后果)仅应用以后时刻信息,疏忽了不同工夫步问题的相关性为了解决以上问题,提出动静时空图网络模型Graph2Route(Figure1 right所示): 将已实现、未实现工作及其关系展现在图中,以图的视角对问题进行建模,利用节点、边的特色及网络结构进步预测精度(解决问题1)。将图构造退出到decoder中,利用mask机制过滤不合了解,放大解空间。(解决问题2)利用动态图构造对一直变动的图关系进行建模,充沛获取决策上下文,e.g.前几个step的决策环境。(解决问题3)具体内容如下。 2.筹备工作:Graph视角2.1.ST-Graph输出将每个工作看做graph上的一个node(一个订单被分为取餐工作、配送工作两个node),针对骑手w在t时刻的时空图能够形容为 ,其中V示意node的汇合,e示意边的汇合,X示意节点的特色(\( n*d_v \)),E示意边的特色(\( n*n*d_e \)),其中,\( d_v、d_e \)别离示意节点和边的特色维度。 graph中有两种类型的节点,已实现节点(\( V^F \))和未实现节点(\( V^U \)),在模型构建中会充分利用这两类节点,这也是区别于其余模型的中央。 ...

October 11, 2022 · 2 min · jiezi

关于算法:CSIT242安卓算法

CSIT242 Autumn Session 2022Assignment #1Due: 05:00 pm Monday 11 April 2022Marks: 20 marks (20%)The purpose of this assignment is to create an interactive application using differentviews, multiple activities (scenes) and programmatically manipulate UI components.For the purpose of this assignment, one application should be developed – by thestudent’s choice – for the Android or iOS platform.AimsIn this assignment, you will create an application, “My Entertainment”. The applicationshould calculate the charges for using entertainment facilities. The entertainment centre isopen every day (Monday-Sunday) from 6 am to 10 pm. Each session is one hour (startingevery half-hour), and the user can have multiple sessions. For example: Entertainment facility: BowlingDay: Saturday, Start time: 12:30, hours: 3, End time: 15:30Number of lanes: 2Total amount: $120 (discount:$12) = $108Your application should:− Allow the user to choose the entertainment facilities: Bowling, Laser Arena,Internet & Gaming Cafe, Karaoke, Magic Show, Rock Climbing, and Kid Playland.− Allow the user to choose the desired day and time (starting at 6 am / every half-hour– 6:00/6:30/7:00/7:30/…./20:30/21:00). However, the magic show has its schedulefor every two hours starting from 16:00, and the last show ends at 22:00 (only threesessions a day).− Allow user to choose how many hours ( or sessions) will use the facility;− Present the chosen entertainment facilities, day, start and end time, number ofhours, number of participants or lanes(for bowling) and calculated charges(amount in AUD);− Allow the user to insert new/change the preferences and make as many calculationsas possible.Your application must support all popular Android or iOS devices and screen sizes. Youshould record which one you have tested on in your report.Requirements ...

September 30, 2022 · 5 min · jiezi

关于算法:MATH7861数学求解

Semester 1, 2022 MATH7861: Assignment 2Assignment 2 must be submitted by 1 pm on Monday the 11th of April, 2022.Submit your assignment using the TurnItIn link on the MATH1061/7861 Blackboard site.For MATH7861 students this assignment is worth 10% of your final mark. Questions 1 to 6 willbe marked out of 30 and the essay question will be marked out of 15. Giving a total of 45. Notethat when the mark is entered into the blackboard site it will be scaled back to a mark out 30. ...

September 30, 2022 · 3 min · jiezi

关于算法:159352题型解析

159.352 Assignment 1:Weight: 30%Deadline: April 24th 2022In this assignment you will extend the minimalistic HTTP server (server3.py - wedeveloped in the tutorials) to serve a password protected website which enables the userto manage their investment portfolio.The conceptual framework of this web application is shown in Fig. 1. Your HTTP serverwill run in docker container hosted on Heroku (PaaS cloud). To service client requests,your server will use REST API to access data from the Investor Exchange (IEX) cloud.You will need to sign up for free developer accounts on IEX(https://iexcloud.io/cloud-log...) and Heroku (https://www.heroku.com).Fig. 1 Conceptual frameworkThe objective of this assignment is to gain hands on experience with HTTP fundamentals,so strictly do not use any high-level frameworks (e.g. Servlets, flask, node.js, Djangoetc.,) since they abstract the low level HTTP functionality.1) Authentication (6 marks)Implement basic access authentication scheme in your python HTTP server such thatwithout the correct login credentials none of the resources on the server should beaccessible.When the browser sends the initial GET request, the server should check forauthentication credentials in the headers and respond with a suitable HTTP status coderequesting for authentication credentials using the basic access authentication.At this stage the browser would prompt the user to enter username and passwordWhen the browser sends the authentication credentials, the server checks the headers andserves the requested content if the authentication credentials match. Set the authenticationcredentials for your website to be your student ID number:username: <your student ID number>password: <your student ID number>Assume your website is dedicated for only one user, that is you.[Hint: Revisit Part C of week 2 tutorial exercise to see how theauthentication headers are exchanged between client and server]2) Portfolio (10 marks)When the user visits the url /portfolio your HTTP server should respond with a html pageshowing the user’s investment portfolio, along with input boxes and command buttons toupdate the portfolio.Stock Quantity Price Gain/LossTSLA 100 $1000 -20%AAPL 50 $150 12%Stock symbolQuantityPriceThe portfolio will be stored on your HTTP server as either XML or JSON file. For ourassignment, the portfolio is made up of stocks only. For each stock the server needs tostore the ticker symbol, the quantity of shares purchased (i.e. owned by the user), and thepurchase price of a share. Work out a suitable data representation to store the portfolioinformation. You can choose either to work with XML or JSON. Name the file asportfolio.xml or portfolio.json.In updating the portfolio file, the user can add a new stock, or reduce/remove an existingstock using negative quantity. You must validate the user inputs on the server side whenupdating portfolio file. Use HTTP POST method for updating the portfolio file.To help the user input the correct symbol, use the following API endpoint to get the listof symbols. Note the JSON response from this API call contains all types of securities,so you will need to filter symbols for common stock (cs) type.https://cloud.iexapis.com/sta...make sure to substitute your API token in the above URLRefer to API documentation for details; https://iexcloud.io/docs/api/...Compute the gain/loss percentage for each stock in the portfolio on the server side usingthe following API endpoint which fetches the latest quote for the given stock symbol.Gain or loss = (latest quote – price) / price * 100https://cloud.iexapis.com/sta...make sure to put the actual symbol (e.g TSLA) in the above URL 3) Stock research (7 marks)When the user visits the url /research your HTTP server should respond with a html pagecontaining an input boxes to enter the stock symbol. After entering the stock symbol, thepage should show the following data about the stock, and display a graph of the dailyclosing price for five year period (5y)Stock symbolSymbol: BABACompany Name: Alibaba Group Holding LtdPE ratio: 26.84Market Capitalization: 29031174277952 week high: 245.6952 week low: 100.02Use the same API endpoint discussed in the portfolio section to help the user enter thecorrect stock symbol.Use the following Stats API endpoint to get the data about the stock.https://cloud.iexapis.com/sta...Use the following API endpoint to extract the chart data for the given stock symbol.https://cloud.iexapis.com/sta...You must plot the data on the client side (using any javascript library of your choice e.g.canvasJS). 4) Deployment (7 marks)After you have finished developing and testing, deploy your web application in a dockercontainer and host it on Heroku cloud.Useful documentationhttps://iexcloud.io/docs/api/...https://docs.docker.comhttps://devcenter.heroku.comSubmissionComplete and well-documented source files necessary to run your web application indocker. A README file containing instructions needed to run your web application. Inyour README file make sure to put down the URL of your web application hosted onHeroku. Submit it a in zipped file on Stream.Here is a worked example to show how updates to the portfolio is recorded. ...

September 29, 2022 · 5 min · jiezi

关于算法:ECON30130-经济分析

ECON30130 EconometricsR Project – Deadline April 10Dr Benjamin ElsnerRules & GuidelinesGround rules This assignment counts 30% of your final grade. You have to work through a set of tasks using R, and writeup your answers using Word, LaTeX, or R Markdown. The rules are as follows: Below you will find a set of tasks. Please answer all questions and work through all tasks. There is noword or page limit, but please be concise. Deadline is April 10, 2022, at 11:59:59pm For late submissions, UCD’s Late Submission of Coursework policy applies. Papers are to be submitted on Brightspace → Assessment → Assignments Submissions should be in one pdf, and should include: 1) the write-up of the assignment, 2) the R code. Students are allowed to work in groups of up to five. If students work in a group, only one groupmember should submit the paper on Brightspace. On the first page of the paper it should be clearlystated that this was a group project and the names and student numbers of the group members shouldbe given. UCD’s Student Plagiarism Policy will apply. I reserve the right to run plagiarism checks on Brightspace. Questions should be posted on Brightspace. A solution will not be provided after the deadline.GradingStudents will receive a letter grade for this assignment. Grading is based on the following criteria:Correctness of the analysis and interpretations Writing (clear and concise) Exposition: are graphs and tables done well? They don’t need to look fancy, but it has to be clearwhat is shown. For regression tables, please use stargazer or alternative packages that give you nicelyformatted regression tables. Bonus: a higher grade (1 notch, e.g. from B+ to A-) is given if all of the following are done:project written with R Markdown (can be done via RStudio); please indicate on the first page if ...

September 29, 2022 · 8 min · jiezi

关于算法:数组总和III

数组总和III题目找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只应用数字1到9每个数字 最多应用一次 返回 所有可能的无效组合的列表 。该列表不能蕴含雷同的组合两次,组合能够以任何程序返回。 示例1: 输出: k = 3, n = 7输入: [[1,2,4]]解释:1 + 2 + 4 = 7没有其余合乎的组合了。示例: 输出: k = 3, n = 9输入: [[1,2,6], [1,3,5], [2,3,4]]解释:1 + 2 + 6 = 91 + 3 + 5 = 92 + 3 + 4 = 9没有其余合乎的组合了。问题剖析在这道题目当中咱们须要从1-9几个数两头抉择固定数目的数据去组合失去一个指定的后果。很显然这是一个组合问题,个别组合问题咱们都能够应用回溯算法进行求解,在本篇文章当中咱们次要通过介绍两种在回溯问题当中比拟罕用的分析方法,上面咱们应用这两种分析方法去剖析这个题目。 解法剖析解法一:抉择和不抉择首先咱们先升高一下这个数据的要求,咱们要在1-3之间进行抉择,指定数据的个数和相加之和。在这个问题当中对于每一个数据来说咱们都用两种抉择:将这个数据放入求和列表当中或者不将其放入求和列表当中。因而咱们能够画出如下的求解树(对于每一个数据都有选和不选两种状况,每一层是针对一个具体的数据): 如上图所示,第一层示意对数据1进行抉择,第二层示意对数据2进行抉择,第三层示意对数据3进行抉择。每一个节点都会有两个分支,因为对应着抉择和不抉择,因而咱们结构的树是一个齐全二叉树。 当初咱们的问题是,咱们在遍历的时候,在什么条件下应该停下来。 第一种状况是当数据的和等于指定的值而且数据个数相等的必定须要停下来,因为这个曾经满足条件了,咱们也不须要往里面持续退出数据了,因而咱们在这样的节点的时候应该要进行递归。第二种状况是如果咱们在遍历的时候,以后列表当中数据的个数加上前面所的数据的时候,数据个数还有余k的时候咱们也须要听下来,因为持续遍历没有意义,即便把前面的数据全副放入列表也不符合条件了,因而没有持续遍历子树的必要了。第三种状况是,当咱们抉择的数据个数大于k的时候咱们须要进行递归,因为咱们只能抉择k个数据。第四种状况是,当咱们抉择的数据的和曾经大于指定的数据的时候也须要进行递归,因为再往列表当中退出数据的话和只会越来越大。当遍历完1-9的所有数据的时候应该停下来。依据下面的剖析咱们能够写出如下代码: java 代码import java.util.ArrayList;import java.util.List;public class LeetCode216 { private List<List<Integer>> ans = new ArrayList<>(); private List<Integer> path = new ArrayList<>(); public List<List<Integer>> combinationSum3(int k, int n) { backTrace(k, n, 1, 0); return ans; } public void backTrace(int k, int n, int cur, int curSum) { // 当满足条件的时候将失去的后果退出到最终的答案当中 if (curSum == n && path.size() == k) { ans.add(new ArrayList<>(path)); return; } // 在这里判断上文谈到的几个递归进行条件 if ( cur >= 10 || path.size() > k || curSum > n || (path.size() + (10 - cur) + 1) < k) return; // 抉择数据 path.add(cur); curSum += cur; backTrace(k, n, cur + 1, curSum); // 上面两行代码进行回溯过程 curSum -= cur; path.remove(path.size() - 1); // 不抉择数据 backTrace(k, n, cur + 1, curSum); }}解法二:遍历抉择在上一个办法当中咱们的分析方法是每一个数据都有两种抉择方法选和不选。在接下来咱们要探讨的分析方法是应用组合的观点去进行剖析。下图是咱们的剖析过程失去的树。 ...

September 29, 2022 · 2 min · jiezi

关于算法:一文读懂云游戏

随着Google在往年游戏开发者大会(GDC)上公布云游戏平台Stadia以来,云游戏受到了前所未有的关注。然而就像2015年忽然到来的人工智能浪潮其实已是人工智能的第三次暴发一样,云游戏概念的提出至今已有至多近20年历史了。那么,云游戏是什么?它经验了哪些倒退过程?存在哪些技术门槛?它对产业有什么样的影响?一、什么是云游戏对于游戏行业或游戏自身不理解的人来说,首次面对云游戏可能会有一个疑难——除了单机游戏,当初所有游戏不都联网玩么?云游戏和网络游戏有什么区别?实际上,同为“在线游戏”,云游戏与网络游戏的运行形式截然不同。对于传统的网络游戏而言,玩家须要先将游戏客户端当时下载安装贮存在本地硬盘中,运行过程中的运算也是在本地实现的,其运行速度、画面成果取决于本地电脑的硬件配置。通过互联网,本地客户端接管到的是一起进行游戏的其余玩家的信息,如地位、状态以及实时的操作等。在网页游戏和小游戏中,只管外表看起来没有“下载”这一过程,但实际上在游戏关上时也会将游戏所需的资源和运算逻辑“加载”到本地,而后再开始运行。而云游戏则不同,它不须要下载或加载资源到本地设施。云游戏从概念上来说其实非常简略,就是基于云计算技术,把游戏放到服务器上运行,而游戏渲染进去的视频画面,通过网络传送到终端(包含PC、机顶盒、挪动终端等)。如此一来,终端客户不须要下载、装置游戏,只有连贯互联网,哪怕是硬件配置要求高、运算量大的游戏也能顺利运行。用一个艰深的比如,云游戏就像是玩家在应用一台显示器和键鼠连接线特地长的电脑,玩家背后的只有显示器、鼠标和键盘,而显示器、键盘鼠标连贯了一个远在千里之外的计算机。因为本地设施上不须要装置游戏,所以各终端设备都能够运行各类游戏,不再须要游戏对软硬件的适配、终端的性能要求等以往困扰游戏玩家的问题。因而,云游戏最大的劣势在于可能突破各种终端限度的壁垒,在手机上能够玩到电脑、主机游戏,在电脑上也能够玩到主机、手机游戏。而云游戏客户端的作用仅限于数据的发送、承受以及游戏画面的出现,游戏的贮存与运行都是在云端服务器上实现的。在进行游戏时,玩家操作客户端向云端发送数据,云服务器依据操作运行游戏,将游戏画面编码压缩,通过网络返回客户端,最初客户端进行解码并输入游戏画面。云游戏的益处也不言而喻:首先,云游戏不用再依赖于本地硬件(尤其是CPU和显卡),只需具备根底的视频解压能力,以及输出设施(键鼠或者手柄等)和输出设备(显示器)即可;其次,开发平台也不必放心玩家侧硬件性能, 能够开发出更高质量的内容;此外,云游戏还能节俭本地游戏版本更新工夫,久远来看也能节俭硬件迭代降级老本等。二、云游戏的发展史既然云游戏有如此泛滥的益处,那么为什么咱们没有早早地用上云游戏技术呢?事实上,不是不想,而是不能。云游戏从概念提出到此次巨头抢滩登陆之间差了20年,而这20年云游戏的倒退简直随同着计算机、通信和云计算三大行业的发展史。云游戏这一概念,最早来自芬兰的一家名为G-cluster的公司。早在2000年,该公司在美国电子娱乐博览会(Electronic Entertainment Expo,简称E3)展现了云游戏的原始雏形——通过Wi-Fi将PC游戏传输到手持设施。为什么不是手机呢……因为2000年还没有大屏幕手机呢。依据过后的媒体报道,只管展现时游戏PC和客户端屏幕通过本地无线局域网连贯,但这个展现过程依然有显著的提早与卡顿。在过后,这项技术就像是晚期的蒸汽机车——跑得比马车还慢——没有受到业界的关注。2005年,G-cluster通过塞浦路斯电信管理局的IPTV网络进行了首次试商用,但受限与过后的网络环境,以及G-cluster所提供的游戏内容,仍然未能引起足够关注。云游戏第一次进入公众视线,是在2009年旧金山游戏开发者大会(Game Developers Conference,简称GDC)上。过后,成立 6 年无余的云游戏服务商 OnLive 进行了相当胜利的现场展现,成为展会上最大的亮点。2010年6月,OnLive 云游戏服务正式上线,与 G-cluster 最大的区别在于 Onive 在上线之初就解决了游戏内容这个非常重要的问题。平台不仅能够运行孤岛危机这样的 3A 级大作,还拉来了EA、育碧、Take-Two、华纳兄弟等游戏厂商为其提供内容反对。后果你大略也猜到了,只管在本地局域网环境下 OnLive 比 G-cluster 有较大的提高,可能顺畅地运行云游戏。但在过后的美国全国均匀家庭带宽只有 9.54Mbps 的大环境下,OnLive 服务在正式上线后便播种一票差评,最终这款产品因付费用户太少而流产。在OnLive创始商用云游戏的先河之后,支流游戏厂商开始进入云游戏畛域。索尼在先后收买了Gaikai和OnLive两家公司的核心技术之后,于2014年公布了云游戏服务PlayStation Now。但过后的PlayStation Now服务仅供PS4用户应用,并且平台只提供在该主机上不兼容的PS3游戏。因为即便到了 2014 年,世界各地的互联网接入速度也不那么乐观,因而索尼除了推出能够近程(玩家本地不须要 PlayStation 游戏机)的 PlayStation Now 之外,索尼还推出了主打本地进行串流的 Playstation Remote Play 性能——即显示、管制设施与近程运算设施在同一局域网内。简略来说,就是以前的 PlayStation 玩家要想玩游戏,须要把 PlayStation 游戏机接上电视,而后端坐在电视机前用手柄玩游戏。而PlayStation Now则容许玩家躺在床上,用本人的手机作为事实和管制设施与本人的PlayStation游戏机连贯进行游戏。这与 PlayStation Now、Google 和腾讯公布的云游戏在技术上有共通点,但利用形式上并不相同,是云游戏技术在网络环境不好时代的一种次要利用模式。2015年,NVIDIA推出了基于云服务器的游戏流媒体服务GeForce NOW,在公布之初就反对60余款游戏。基于本身弱小的技术能力,GeForce NOW的游戏画面能够达到1080P的分辨率与每秒60帧,相比PlayStation Now的720p和30帧有了微小的晋升,但对网络条件的要求仍极为刻薄——至多须要50Mbps带宽。此外,GeForce NOW依然受到终端的限度,只反对自家的SHIELD系列产品(包含台式、平板掌机3个型号)。在这一时期,游戏大厂尽管拿出了相较早年更为成熟的云游戏服务计划,但尚未突破终端的限度。近一两年来,云游戏的倒退更进了一步。PlayStation Now和GeForece NOW服务先后开始反对PC端,迈出了逾越终端的第一步。2018年10月,谷歌发表推出Project Steam(流媒体打算,往年3月更名为Stadia)。用户甚至不须要下载云游戏的平台,也不受终端限度,只须要通过Chrome浏览器就能够畅玩各类3A级游戏大作。即使更换电脑,游戏体验和存档也能够顺畅继承,宛如将大型主机游戏“页游化”了。同年同月,微软公布了基于Xbox的云游戏服务“Project Cloud”,这项服务将容许Xbox One游戏在电脑、手机以及平板上玩耍,并将于2019年进行公测。2019 年 3月,游戏开发者大会 GDC 上,在 Google 发表其云游戏平台 Stadia 的同时。腾讯也开启了云游戏平台 Start 的内测邀请,向上海和广东的资深玩家凋谢预约体验。以“让好玩触手可及”为愿景,借助腾讯云的海量根底资源,指标给宏大的国内玩家群体提供更便捷的游戏体验。面向B端用户,腾讯还推出了CMatrix云游戏计划,针对Android云游戏提供专业性技术解决方案,为第三方游戏企业提供云游戏平台技术,疾速云游戏利用场景落地。此前,腾讯还联手英特尔推出了腾讯即玩云游戏平台,与外国云游戏厂商主攻大型端游不同,腾讯即玩主打云手游,填补了这一畛域技术与市场的空白。能够说,通过诸多厂商早年不胜利的尝试,随着玩家进行游戏的场景逐步多样化,加之5G的日益成熟,云游戏的倒退正步入正轨。三、放在远处的主机(服务器端)CPU和GPU如果你对计算机行业少有理解,肯定留神到了在上文提到各类云游戏服务中,只有NVIDIA英伟达的“画风最为奇异”。因为在大多数人的认知里,NVIDIA不是一家游戏公司,也不是一个游戏平台,它最被广为人知的是它的显卡业务。但从NVIDIA涉足云游戏业务,就能看出游戏与芯片产业几十年来的耦合关系了。援用NVIDIA官网的一段有些自夸的形容,NVIDIA在1999年在业界提倡 GPU 概念,从新定义了古代计算机显卡,并将计算机与家用游戏分割起来,于 2000 年美国互联网泡沫幻灭之时为家用计算机市场找到了全新的成长空间。后续的故事咱们都晓得了,在整个PC时代的早期,“能玩游戏”是对一台电脑很重要的指标,而“能流畅玩游戏大作”则是对一台个人电脑最好的赞美。这种衡量标准甚至连续到了挪动互联网时代,苹果公司在 iPhone 前几代的发布会时,每次都会请出一款名为《无尽之剑》的3D游戏为其最新的产品性能背书。天然,游戏与硬件性能、老本之间的相互促进与带动作用也会连续到云游戏时代,甚至会比之前有过之而无不及。与过来游戏带动消费者更换新设施不同,云游戏的次要运算放在云服务商的机房里,因而更易于对新芯片的批量换代降级。硬件在性能上的一点晋升与老本的一点降落,对于批量更新的云服务运营商来说都意味着微小的经营老本节俭。就服务器的核心部件处理器(CPU和GPU)芯片而言,刻蚀工艺至今仍是至关重要的一项技术指标,同时关系到芯片的性能与老本。刻蚀尺寸越小,雷同晶体管密度的芯片就越小,一块晶圆(如下图)可能生产的芯片即越多,边角料(彩色局部)节约也越少;同理,雷同尺寸的芯片上的晶体管数量就会越多。目前7nm刻蚀工艺的芯片正逐步进入市场。以AMD的产品为例,7nm相比于上一代14nm能够将晶体管密度进步一倍,等同频率下功耗能够升高一半,而等同功耗下性能晋升能够超过25%。虚拟化对绝大多数云游戏服务商而言,芯片制作技术并未把握在本人手里,那么,虚拟化就是升高服务器老本,晋升服务质量最为无效的伎俩之一了。虚拟化是云服务中的一个专有名词,是指将一台物理计算机切割成多台逻辑计算机供用户应用。用一个艰深的比如来阐明,云游戏与传统游戏的模式,就像是电厂对立发电与每家每户装备发电机的区别。前者理当有更高的效率与更低的老本,但如何实现这个指标,则须要一系列性能治理上的机制,这就是虚拟化的技术要求。作为已经的云游戏服务先驱者,OnLive 非常看重玩家的游戏体验,并为此装备了老本昂扬的服务器。然而,它的一台服务器仅能同时服务于一名用户,但玩家在应用服务时其玩的游戏不肯定能占满一台服务器的性能,所以其性能对于不少玩家来说是过剩的,不足正当无效的调配,无形之中造成了资源节约。为了整合并调配服务器资源,就须要依附虚拟化。它容许多个用户共享同一台物理服务器的资源,同时放弃隔离。目前,CPU、网络接口和存储的虚拟化技术曾经相当成熟,并已广泛应用于云计算等服务当中。不同的是,云游戏对用于图形处理的GPU依赖性更强,其虚拟化技术对游戏画面帧数、响应提早和画面质量均会造成不同水平的影响。在虚拟化技术的反对下,一块物理GPU能够划分为几个乃至十几个虚构GPU,用户能够依据本人的须要抉择一个或者多个作为本人云游戏主机的配置,从而实现了服务器资源的无效利用。然而,因为GPU的构造与技术文档未对外公开、每次技术更新变动较大,GPU虚拟化的施行较为艰难。直到最近几年,随着在工程设计、图形绘制等应用领域的需要减少,GPU虚拟化日益受到关注,技术才日臻完善,但仍有较大的晋升空间。AMD虚拟化GPU解决方案MxGPU——每个物理GPU反对最多16个用户近程工作。就像人工智能的三次浪潮只有第三次才失去了广泛利用,当下咱们无奈判断这一轮云游戏浪潮是否就是云游戏最终得以遍及利用的那一次。但云游戏作为一个电子信息产业全产业链高度集成的复合产品状态,必然对整个链条中的每一项技术都有着较强的依赖与促进作用。兴许,这便是巨头们纷纷进入这一市场的起因吧。 ...

September 28, 2022 · 1 min · jiezi

关于算法:作为前端你是否了解链表这种数据结构

在面试中只有被问到React Hooks就常被问到为什么Hooks不能在循环和条件判断嵌套函数当中应用;置信很多人都晓得标准答案,【因为申明的Hooks保留在链表当中】,然而你真的晓得链表吗? 什么是链表咱们先看来看一个简略的单向链表构造 如上图所示咱们能够剖析出,链表是由多个 node(节点) 组成的,而node(节点) 指向(保留)不同的内存空间,每个node(节点) 由item(数据域) 和next(指针域) (双向链表还包含prev指针域)形成,其中item(数据域) 用于存储数据,next(指针域) 指向下一个节点从而造成一个存储数据的线性链路 总结:链表是一个用于存储数据的无序线性数据结构 而通过指针域指向链路的差别咱们大抵能够分为: 单向链表双向链表环形链表链表与数组的比拟不晓得链表这种数据结构是否让你想起数组,这两种都是用于存储数据的线性数据结构,而不同的是链表是一种无序线性数据结构,而数组是一种有序线性数据结构,咱们都晓得数组是一种援用类型数据结构,当咱们创立一个数组的时候会在内存种开拓一串间断的内存空间用于存储,数组就是依附这串间断的内存空间来维持线性链路,而链表则是有一连串无序的内存保留node(节点) 通过node(节点) 的指针域指向下一个节点来维持线性链路 链表有什么作用?假如当初有一百条客户的数据你须要对这一百条数据进行增、删、插入你会怎么做? 创立一个数组将100条数据存入数组当中,通过数组的push,splice,findIndex,indexOf等办法对数组进行操作,对于大量数据答案是不言而喻的,咱们间接通过数组就能解决;然而如果当初有一百万条数据让你操作呢?咱们曾经提到数组是通过间断内存地址来维持线性链路的一种有序线性构造,如果你在头部插入一条数据的话则前面的一系列元素都要向后挪动一位,一百万条数据则要挪动一百万次,如果你要删除第一万个元素则前面的九十九万个元素要向前挪动一个地位,如果要将第一条数据替换为最初一条数据则要先删除再插入先将第一条数据与最初一条数据取出其余所有数据要向前挪动一个位(除头部数据与尾部数据),而后再替换插入,所有数据再向后挪动一位;在数据量宏大的状况下这相对不是一个理智的计划,因为工夫维度的不容许;然而如果换成链表你只须要操作node(节点) 指针域的指向便能够实现以上工作; 链表的优缺点长处:相较于数组,链表操作更加的灵便,不受存储空间的限度; 毛病: 链表不能通过下标获取值,每次要获取链表当中的node(节点) 都须要通过遍历对于存储根本类型的数据结构因为须要通过指针域的指向则须要多调配一块内存进行存储(双向链表则乘以2)通过JS简略实现一个单向链表而对于链表操作咱们大抵能够分为 新增插入删除查看批改咱们以单项链表为例顺次实现他们 创立Node辅助类咱们曾经晓得链表的大抵概念也就是链表是一种以多个node(节点) 通过指针域连贯的无序线性数据结构,因而首先咱们须要创立辅助类Node用于创立node(节点) //辅助类Node用于创立保留在链表中的nodeclass Node { constructor (item) { //数据域,用于保留数据 this.item = item //指针域,用于指向下一个节点 this.next = null }}而在链表中始终有一个head属性,这个属性是链表的开始,用于寄存整个链表的线性链路;咱们还须要一个size用于保留链表的长度,用于遍历链表; //用于创立一个链表class Linked{ constructor () { //size属性用于保留链表的长度用于遍历 this.size = 0 //用于寄存线性链路 this.head = null }}至此咱们曾经实现了创立一个链表的筹备工作;那么让咱们看看链表的基本操作办法是如何实现的 单向链表新增操作对于单向链表新增如果以后链表为空咱们须要将链表的head属性间接指向创立的node(节点),如果链表不为空则咱们须要将最末端的node(节点)的next(指针域) 指向新创建的 node(节点) class Linked { constructor () { this.size = 0 this.head = null } //新增node办法 add (item) { //创立node let node = new Node (item) //this.head === null则代表链表为空须要将新head指向新创建的node if (this.head === null) { this.head = node } else { //查找须要创立的节点的上一个节点(最末端节点) let prevNode = this.getNode (this.size - 1) //将末端节点的next指向新创建的node prevNode.next = node } //新增胜利则size+1 this.size++ } //节点查找办法传入index相似于数组下标用于标记查找 getNode (index) { //如果index < 0 || index >= this.size则阐明下标越界须要在此限度 if (index < 0 || index >= this.size) { throw new Error ('out range') } //获取第一个节点,从第一个节点进行遍历 let current = this.head; for (let i = 0; i < index; i++) { //顺次将以后节点指向下一个节点,直到获取最初一个节点 current = current.next } return current }}单向链表插入操作对于单向链表插入操作如果须要插入的地位为下标为0的地位(头部),咱们须要将须要插入的node(节点) 的next(指向域),指向未扭转之前的第一个node(节点),也就是head,如果是两头追加则咱们须要将插入node(节点) 的指向域指向插入下标的上一个节点的指向域(插入节点的下一个节点),并将插入node(节点) 的上一个节点的指向域,指向以后节点 ...

September 26, 2022 · 4 min · jiezi

关于算法:一文读懂Jina生态的Dataclass

Jina AI 始终致力于构建简略、易用、全托管的最佳工具,来帮忙开发者疾速搭建多模态、跨模态利用。而作为工程师,咱们始终在致力开发新的性能和 API,以满足用户对多模态数据处理的诸多场景须要。 Jina 现反对的 Dataclass 新个性提供了更丰盛的默认办法反对,大大简化了定义类对象的代码量,代码简洁清晰。本文我将向你介绍 Dataclass 所带来的便利性,为什么要应用它,以及演示如何应用它。 作者介绍Jina AI 机器学习工程师 Johannes Messner Dataclass 是一个数据类,顾名思义,数据类只须要关怀数据,而和具体行为解耦。Dataclass 是对 Document 更高层次的封装,能够更好地示意一个多模态文档。如图所示,你能够利用装璜器 @dataclass,将右边的多模态文档的信息示意为左边代码片段。 dataclass-example 总的来说,这个新个性会更好地晋升开发者的体验,让开发者近乎于应用自然语言般封装本人的数据,并拓展使其成公共可用的服务。缩小了对 DocArray 及其个性的思考,更多地思考本人的数据和工作:你能够依据本人的数据来自定义 Dataclass,疾速地示意本人的数据,实现本人的工作。此外最重要的是,DocArray 和 Jina 都反对了这个新个性。 在这个新个性的开发过程中,为了保障用户的最佳体验,咱们不得不做出一些轻微的设计和改良,以进步其效率、可用性和便携性。因而,让咱们借此机会回顾一下这些决定,咱们做出这些决定的起因,以及咱们认为你会喜爱这个新个性的起因。 过来是怎么做的Document[1] 和 DocumentArray[2] 始终以来都是极其灵便的数据结构,基本上能够包容任何类型的数据。然而在过来,咱们应用的是和其他软件雷同的形式,提供开发者须要的所有工具,并通知开发者如何与这些工具交互,如何让数据去适配这些工具。 举个例子,依照之前的办法,当你想要示意一篇蕴含多种模态信息的论文,外面蕴含注释文本、图片、该图片的形容文本、许多参考文献的超链接、以及一些元数据。在之前,咱们须要这样建模: from docarray import Document modelling your data as a nested Documentimage = Document(uri="myimage.jpg").load_uri_to_image_tensor()description = Document(text="this is my awesome image")references = [ Document(uri="https://arxiv.org/abs/2109.08970"),Document(uri="https://arxiv.org/abs/1706.03762"),] reference_doc = Document(chunks=references) article = Document( text="this is the main text of the article",tags={"author": "you", "release": "today"},chunks=[image, description, reference_doc],) ...

September 21, 2022 · 4 min · jiezi

关于算法:多领域应用带来GPU高景气度

多畛域利用带来 GPU 行业高景气度GPU 最后是为了更好地做图形处理而专门设计的微处理器。20 世纪 80 年代之前,图形处理工作都由 CPU 负责,起初随着对图形显示要求的进步,专门用于图形处理的 微处理器 GPU(Graphics Processing Unit)被设计进去,使显卡缩小了对 CPU 的依赖,计算机的图形显示能力得以晋升。GPU 比 CPU 更善于并行计算。从芯片设计思路看,CPU是以低提早为导向的计算单元,通常由专为串行解决而优化的几个外围组成,而GPU是以吞吐量为导向的计算单元,由数以千计的更小、更高效的外围组成,专为并行多任务设计。高性能计算需要关上 GPU 市场第二增长曲线。GPU本来只是用于图形和图像的相 关运算,受CPU的调配,但随着云计算、AI等技术的倒退,GPU并行计算的劣势被发 掘,在高性能计算畛域取代CPU成为配角。2006年,NVIDIA公布了第一款采纳对立渲染架构的桌面 GPU和CUDA通用计算平台,使开发者可能应用NVIDIA GPU的运算能力进行并行计算,拓展了GPU的应用领域。2011年,NVIDIA公布TESLAGPU计算卡,正式将用于计算的GPU 产品线独立进去,标记着GPU进入高性能计算时代。独立 GPU 和集成 GPU 各有千秋GPU 可分为集成 GPU 和独立 GPU,景嘉微产品属于独立 GPU。GPU 依照接入类 型划分,能够分为集成 GPU 和独立GPU。集成GPU集成在主板上,而独立 GPU 插在 主板的相应接口上。集成 GPU功耗更低、性能较弱、降级更换较难、价格较低,次要用于办公等中低端畛域;独立 GPU 性能更强、降级更换简略、价格较高,次要用于游戏、高性能计算等中高端畛域。将来独立 GPU 市场规模大,集成 GPU 无望向 SoC 方向倒退。随着深度学习、云计算等新技术的倒退,市场对具备高性能计算能力的独立GPU需要一直减少。从独立 GPU巨头 NVIDIA 的营收构造能够看出,2020年高性能计算业务计算和网络支出为 68.41 亿美元,同比增加 109%,营收占比达到 41%。将来随着新兴技术的进一步落地,具备高性能计算能力的独立GPU市场规模将会更大。在中低端市场,集成GPU因其较 高的性价比,仍有很强的竞争力,将来无望向能耗更低、体积更小、性能体现绝对更好的SoC 方向倒退。寰球市场被三大巨头垄断,中国市场前景广大多畛域利用驱动市场规模扩充。随着 GPU 的并行计算劣势被逐渐开掘,GPU 的应用领域从图形处理扩大到高性能计算,市场需求变大。依据Verified Market Research 的数据,2020年寰球GPU市场价值为254.1 亿美元,2027年无望达到1853.1亿美元,年均匀增速高达32.82%。寰球 GPU 市场出现寡头竞争格局,Intel、NVIDIA 和 AMD 三大公司分食寰球市场。集成GPU市场Intel劣势显著,独立GPU市场NVIDIA与 AMD两强割据。依据 Jon Peddie Research 的数据显示,2021年Q1,在寰球 PC 端 GPU市场中,Intel以68% 的市场份额位居榜首,AMD和NVIDIA别离以17%和15%的市场份额名列第二和第三;在PC端独立GPU畛域中,NVIDIA占据 81%的市场份额领有当先劣势,AMD以19% 的市场份额排名第二。寰球独立 GPU 畛域的领导者 NVIDIA。NVIDIA公司成立于1993年,是 GPU(图 状态处理器)的发明者,也是人工智能计算的领导者。NVIDIA的次要业务别离是游戏业 务、数据中心业务、业余视觉业务和主动驾驶业务。NVIDIA 2020年营收 167 亿美元,其中游戏、数据中心、业余视觉、主动驾驶业务别离奉献了营收的 47%、40%、6%、3%, 其业务的丰富性和支出体量再次印证了 GPU 超出原有图形处理畛域,在其余畛域的广泛应用。AMD 是寰球惟一能够同时提供高性能 GPU 和 CPU 的企业。AMD 的显卡来源于 2006 年并购的ATI科技,在这之后的4年中,AMD 持续应用 ATI 作为显卡品牌,直到2010年,AMD才摈弃原 ATI 的品牌命名形式。截至 2020 年,AMD 同时提供独立 GPU 和集成 GPU,其集成 GPU次要使用在 Ryzen APU、嵌入式、半定制平台中;独立 GPU 分为 Radeon 和 Instinct 系列,次要用于游戏、业余视觉、服务器等利用。2016-2020 年, AMD 的计算和图形支出的营收由19.88亿美元回升至64.32亿美元,年复合增速高达 34%。在游戏畛域,NVIDIA和AMD 不分伯仲,但在通用计算畛域,NVIDIA 高瞻远瞩,曾经造成CUDA生态,市场份额远超 AMD。中国大陆独立 GPU2027 年市场规模超过 341 亿美元,国产代替孕育良好机会。因为NVIDIA和AMD根本占据了独立GPU市场的全副份额,所以依据两者 2020 年在中国大陆的独立GPU销售收入,能够估测 2020 年中国大陆 GPU 市场的规模。2020年中国大陆的独立 GPU 市场规模为 47.39 亿美元。激进假如中国GPU市场规模放弃与寰球 GPU 市场规模雷同的增速,预计 2027 年中国大陆GPU市场规模将超过 345.57 亿美元。随着政策端对信息要害基础设施自主可控的器重,国产代替浪潮降临,国内独立 GPU 产商的广大市场空间已被关上。GPU将来倒退方向#图形显示和高性能计算是两大利用方向GPU 将来次要有两大利用倒退方向。从需要端思考,GPU的劣势在于并行计算, 须要大规模使用到并行计算的畛域就是将来GPU的倒退方向。1)更加真切的图形展示。 图形浮现是GPU芯片最后的性能,随着视觉科技和虚拟现实技术的倒退,更加实在的 图形浮现成果会对 GPU 的并行计算能力提出更高的要求,因而,图形浮现是GPU芯片 将来重要的倒退方向。2)高性能计算。高性能计算次要包含通用计算(GPGPU)和人工智能计算(AIGPU)。GPGPU就是用GPU来解决一些本来 CPU能够处 理、然而更适宜领有弱小浮点计算能力的GPU解决的运算,比方人脸识别等。AIGPU 是另一种高性能计算机,不同于传统的基于流处理器的 GPU,用于 AI计算的GPU 大多数状况下浮点计算精度要求较低,但对计算吞吐量要求较高。算力是 GPU 的要害指标。图形处理和高性能计算都对GPU的并行计算能力都有很 高的要求。算力的高下是掂量GPU性能弱小与否的要害指标,为此,业界巨头NVIDIA不断更新本人的硬件架构,以达到更高的并行计算能力,其 2021 年公布的 RTX 3070 Ti 采纳 Ampere 架构,CUDA 外围数量是其 2018 年公布的 RTX 2080 Ti 的两倍多,同时 NVIDIA 正在研发新一代计算能力更强的技术 Hopper 架构。生态是另一个外围竞争因素。软件生态是 GPU 市场除了算力之外的另一个竞争因素, 良好的生态意味着更多的开发者和使用者,从而带来更大的市场份额。在高性能计算领 域,NVIDIA通过升高开发难度、反对学生和老师发论文、反对守业公司应用CUDA、开源相干库等一系列措施建设通用计算平台CUDA的生态,聚拢了少量客户和开发者, 得以称霸高性能计算市场。国产 GPU 的倒退须要兼顾算力与生态。目前国产GPU厂商次要分为两大类,一类 是从图形显示开始做起,将来想像NVIDI一样逐渐转向高性能计算;另一类是专攻于 高性能计算机,其产品不具备图形显示能力。但两者的生态建设指标都比较落后。国产GPU 倒退要做好以下几点:1)进一步提高图形处理能力,保障国产 GPU 的基本功能。高性能计算的利用使得 GPU 市场需求疾速减少,然而图形处理仍旧是 GPU 的根本能 力和利用,NVIDIA2020 图形处理营收占比仍旧高达 59%。2)扩大高性能计算能力, 加强国产 GPU 除图形处理之外的非传统性能。高性能计算机 GPU 将来倒退的新兴方向 项,国产 GPU 须要把握新兴方向,争取占据科技洼地。3)逐渐建设生态系统,进步用户体验。国外 GPU 倒退具备先发劣势,曾经有 CUDA、ROCm 等较为成熟的计算机生态,国产 GPU 刚刚起步,须要器重生态建设,为将来的倒退打下基础。 ...

September 14, 2022 · 2 min · jiezi

关于算法:企业应该如何进行数据标注达到最佳效果并付出最低的成本

[https://markhk.cn/%e4%bc%81%e...](https://markhk.cn/%e4%bc%81%e...)人类间隔AI的实现还有很长的路要走,它并未有咱们设想的那么智能,只管许多AI我的项目大肆宣扬其表现力,但残暴的事实表明,人类依然没有足够的数据来驱动AI的疾速演进。业界有着数据决定AI的共识,它的表现力如何取决于工程师向其输出了怎么的数据。 尽管将原始数据转为AI须要的智能数据充斥了挑战,但有一项技术能够帮忙将数据中的特色结构化地提取进去,否则非结构化的数据对监督学习算法来说只是一堆乐音,它就是数据标注。 什么是数据标注?数据标注在帮忙AI算法学习正确的数据特色施展着至关重要的作用。数据标注为机器学习模型提供了根底能力,通过数据标注,AI算法能够辨别各种输出并得出精确的输入。通过大量的结构化数据进行模型训练,它会变得越来越聪慧。然而对于任何场景,大规模的数据标注都是一项充斥挑战的工作,如何进步数据标注准确率?如何疾速实现一个大型数据标注我的项目?如何升高数据标注的老本? 人类须要标注数据帮忙机器进行辨认和分类信息,如果短少这些标注信息,AI很难找到数据特色,也就无奈进行精确地辨认,在数据标注方面,是不可能齐全脱离人类标注的。 例如,一个网站充斥大量的图片,如果想主动将这些图片进行分类以便用户进行搜寻,那么至多须要一个图像分类的模型,先向其输出大量的带有数据标注的图片,AI算法便能够精确地提取图片特色,以学习到图片的分类技能。 最终,如果没有正确的数据用来“教学”AI,AI也就学不到正确的常识——辨认工作将会以失败告终。但通过大规模的正确数据来训练AI,它就会随着数据量的减少而更智能。然而在数据标注我的项目开始前,您须要思考以下问题: 1.您须要标注什么? 这里有许多不同的数据标注场景,取决于数据的模式和AI工作的利用场景,通常蕴含图像标注、视频标注、音频标注、文本标注,在主动驾驶标注场景下还有LiDAR激光雷达标注,每一种数据标注又领有不同的分支,您须要确定您的业务场景的原始数据和打算实现的AI工作指标。 2.您的AI我的项目须要多少数据? 通常在老本和现实情况的考量下,您能够通过一部分数据查看成果,再决定开始下一批数据标注,具体的数量能够参考相干的学术论文和开源我的项目所应用的数据量。 3.内建团队还是外包? 依据国外钻研机构Cognilytica公布的报告表明,公司在外部数据标注上的破费是他们在第三方破费的五倍,这不仅老本昂扬,而且消耗大量工夫,从我国的人力老本来看,这个老本也至多是二到三倍。 如果应用自建团队,意味着您必须抽出精力来治理简单的数据标注我的项目。更重要的是,第三方数据标注公司领有自研数据标注工具,这会比应用开源的要疾速和平安地多。 4.您很难找到一个全能的数据标注员。 通常企业外部的数据非常繁冗,对于不同品种的数据,须要适合的人员进行标注。第三方数据标注公司能够帮您从人才库中筛选最合适您以后我的项目的人员。 取得数据标注的反对将您的我的项目外包给冰山数据,将失去高质量,低成本的标注数据,咱们领有自动化的数据标注平台,减速数据标注工作流程,并且在国内外领有超过1万名数据标注员,帮忙疾速匹配最合适的标注人选,帮忙您减速AI迭代。

September 14, 2022 · 1 min · jiezi

关于算法:哈啰搜索推荐一体化建设

搜推算法介绍和模型积淀搜寻和举荐能够说无处不在,最次要的特点就是个性化,能依据不同用户不同的爱好给用户举荐不同的物品。举荐的实质是建设user与item的匹配关系,搜寻的实质是建设user与query与item的匹配关系。 演进路线为了达到最佳的匹配关系,整个解决方案也在一直摸索和提高。但不论是什么样的场景,咱们解决这类问题的演进路线都是相似的。初始阶段根本以人工经营和热门榜单为主,因为新的零碎是没有数据积攒的,咱们对用户还没有数据上的认知,通常会应用全局或者是行业最热的物品来进行展现。第二个阶段,咱们在之前的根底上引入一些简略的模型来做举荐,这时的算法模型是从0~1的,成果晋升也是最显著的。第三个阶段,简略的模型曾经没有方法充分利用现有的数据,就须要思考在现有的数据根底上,怎么样去设计更简单的模型,达到更好的举荐成果。举荐的根底有两点,一是信息要过载,二是必须有可利用的数据。 常见链路 常见的链路比拟相似,分为数据和算法模型局部。整个算法的链路分为召回层、排序层和重排层,数据局部咱们会利用一些实时数据、准实时数据或者离线数据,通过特色工程产生user维度、item维度和context维度的特色。这些特色是咱们的算法模型进行训练和预估的输出,这样从数据到模型,整个链路就串联起来。 召回算法召回是升高后续链路排序压力的重要环节,同时能够保障肯定的相关性,防止咱们在排序预估的时候,给用户展现出bad case。召回中样本的设计是非常重要的,因为在召回与排序中,咱们对于模型样本的设计要区别对待,所以对于召回须要重点刻画它的正负样本。 惯例个性化召回有热门召回,LBS、u2tag2i、协同过滤、新品召回等。目前罕用的召回都是基于Embedding的框架,如YouTube的召回是以用户点击的item作为标签,做视频的召回。Airbnb对于民宿的召回也是基于Embedding框架,同时做了很多的trick。FM、DSSM都会产生用户的Embedding向量和item的Embedding向量,这两个Embedding向量产生进去之后,咱们能够做一些向量类似度的计算,对用户召回比拟感兴趣的item。在向量类似度计算中会用到向量引擎,哈啰向量搜索引擎是Milvus。 用户有关键词的召回后面还有query parse,须要对用户的关键词做一些解决,包含预处理、分词、纠错、实体辨认等。次要目标是保障文本相关性,咱们实现的模型是基于BERT,晋升实体辨认的精确度,目前曾经用在了酒店的关键词搜寻中。比方用户输出的query是维也纳上饶高铁站,这时咱们须要去辨认出用户目标,相当于用户搜的维也纳是酒店名称,上饶高铁站是地理位置,上饶是城市名称。咱们根据这三类的实体再别离进行召回,能够满足用户输出的query需要。 精排模型演变门路精排模型其实就是数据加特色加模型,同时在精排的链路里,咱们常常会用到的是一些大规模的离散特色和间断特色,并利用一些比较复杂的模型,因为这时咱们要保障精确度。对于精排模型,特色决定了排序的天花板,所以咱们要做的第一步是设计合乎业务场景的特色,这里就不开展。 咱们次要介绍一下哈啰的模型演变门路,后期是一些小规模的DNN模型,模型的参数绝对较小,之后咱们实现了大规模离散的DNN模型,如DeepFM、DCN、DIN等。目前DeepFM和DCN模型仍然是新场景会优先思考的模型,这类模型简略高效,个别在简略的场景下能够拿到比拟好的成果。但随着场景接入越来越简单,咱们须要兼顾多指标多场景的举荐问题,所以咱们做了一些ESMM、MMOE、MBN等模型,并且也在尝试用元学习做跨域的举荐。 重排算法重排的定位是晋升用户体验、保障内容的多样性,同时有一些业务经营的逻辑。尽管这一环节不会很简单,但它其实最贴近业务,对最终的排序成果影响最大,所以这里的设计须要尽量保障咱们模型的后果不会被大范畴扭转,同时去兼顾用户体验和经营策略。比如说打散,咱们去把同类目标商品进行打散;还有曝光过滤,用户屡次看过的就不让持续展现。同时对新品做提权等,须要依据不同的业务需要进行设计。 搜推一体化引擎和算法组件设计咱们面临的问题是新业务的场景越来越多,如果从0到1实现整个链路,须要破费很大的人力老本。如何将现有的算去迅速扩大到新增场景,同时还能够去继续优化咱们重点的场景,咱们就提出了搜推一体化引擎和算法组件,彻底改变之前单个场景独自定制接入的形式。 一体化引擎设计思路 常见的解决方案是搜索引擎和举荐引擎离开,但一体化是业界比拟先进的趋势。搜寻从纯文本相干逐步走向个性化,举荐从轻内容了解到重内容了解,它们的架构和算法越来越趋同。局部头部大厂如阿里云曾经开始尝试一体化的架构设计,但因为历史包袱较重很难彻底。哈啰作为新兴平台类的业务具备后发优势,间接一体化会缩小很多反复建设,能够进行局部链路的合并。 一体化引擎能够交融搜索引擎和举荐引擎的次要模块,蕴含通用的排序模块、召回模块和内容了解的模块。这样一体化引擎有本人独特的局部,也有不同链路之间共用的局部,能大大减少反复的工作,同时提供给业务方能够通过低代码量进行接入。 数据标准化 一体化引擎须要去兼容多种简单场景,具备很大的挑战。咱们思考到如果要做标准化的引擎,第一步就是要做数据标准化。离线的数据须要去通过数据映射字段映射成规范的数据,实时的数据须要在曝光、点击、下单的事件中做一些埋点标准化的工作,这样到咱们算法中的数据都是一些绝对规范的数据,就能够做一些规范的解决。 一体化引擎一体化引擎有两个重要的局部,一是配置管理核心,二是线上的链路。它依靠于数据的标准化和接入的标准化,会提供服务编排的配置核心,整体的线上链路以QP、召回、排序、重排阶段作为流程的编排骨架,进行各阶段组件的组合。对于新接入的业务零碎,它的工作量就很小了,只有去配合引擎做相应的输出以及es数据源的提供,就能够接入咱们的举荐能力。 配置核心离线局部咱们通过SQL的映射,产生一些规范的字段,这些规范的字段通过一些通用的逻辑,去产生用户维度或item维度的特色。而这些特色对于咱们的模型,相当于是提供了绝对比拟规范的输出。召回环节也是一样的,利用这些映射好的字段,进行召回通道的计算,这样通过映射会让不同的场景映射到雷同的字段上,咱们产生的后果和计算逻辑是一样的。 线上局部召回池咱们能够去配置召回的通道及召回的个数,排序咱们去配置决策流ID,配置文件能够主动把整个链路包含 QP、召回、排序串联起来,离线和在线的组件和服务编排能够依靠于配置文件进行主动生成。 智能算法组件目前算法通过数据标准化和智能组件池曾经实现了很多组件。数据标准化咱们通过一些字段的映射以及通用的埋点,能够产生规范的用户画像特色、item画像、用户统计的特色、item统计的特色,这些规范的特色进入用意辨认组件池或召回组件池以及排序组件池里,相当于有规范的输出,这些组件池提供了不同的模型以及离线的工作,这些离线的工作能够疾速利用到其余的场景中。 咱们的用意辨认组件池实现了分词和实体辨认,召回组件池有热门、标签、query召回、item2vec,排序组件池有DeepFM、XdeepFM、MBN等,重排组件池有提权、曝光过滤、打散等。这样业界支流的算法组件都曾经具备,整个链路基本上笼罩,接下来咱们会持续去开发一些更高阶的组件,最终实现标准化的接入形式,让业务方接入搜寻举荐算法能力的效率有很大的晋升。 搜推一体化算法在哈啰的利用一是商品类的举荐,具备促成成交的属性,咱们笼罩了金融借贷、哈啰好物、电动车商城等,晋升CTR、GMV等。二是feeds流类的举荐,带有促成用户沉闷属性,包含逛逛、电动车社区、电动车用车页等。三是搜寻排序,有用户强志愿,须要满足相关性,召回全,咱们笼罩了租车、酒店等。总体上咱们笼罩了十多个场景,获得了不同水平的成果晋升,并且场景还在一直减少中。 (本文作者:侯亚伟) 本文系哈啰技术团队出品,未经许可,不得进行商业性转载或者应用。非商业目标转载或应用本文内容,敬请注明“内容转载自哈啰技术团队”。

September 13, 2022 · 1 min · jiezi

关于算法:玩转算法系列–图论精讲-面试升职必备Java版含源码ppt无mi分xiang

download:玩转算法系列–图论精讲 面试升职必备(Java版)含源码ppt无mi分xiang自学it666 java python go c教你如何用Java获取IP归属。解释次要步骤: 从Java获取申请IP解决Nginx转发问题通过IP地址获取属性 获取IP地址首先,应用基于Spring Boot的我的项目,在控制器中增加HttpServletRequest申请参数:@RestController公共类IpController {@GetMapping("/ip-address ")公共字符串ipAddress(HttpServletRequest申请){//接管申请}}复制代码通过HttpServletRequest获取IP地址:string IP = request . get header(" x-forward-for ");if (ip == null || ip.length() == 0 ||“未知”。equalsIgnoreCase(ip)) {ip = request.getHeader("代理-客户端-IP ");}if (ip == null || ip.length() == 0 ||“未知”。equalsIgnoreCase(ip)) {IP = request . get header(" WL-代理-客户端-IP ");}if (ip == null || ip.length() == 0 ||“未知”。equalsIgnoreCase(ip)) {IP = request . get header(" HTTP CLIENT IP ");}if (ip == null || ip.length() == 0 ||“未知”。equalsIgnoreCase(ip)) {IP = request . get header(" HTTP X FORWARDED _ FOR ");}if (ip == null || ip.length() == 0 ||“未知”。equalsIgnoreCase(ip)) {IP = request . getremoteaddr();}回归IP;复制代码调用以获取本地环境中的IP,0:0:0:0:0:0:0:1或LAN IP。 ...

September 12, 2022 · 2 min · jiezi

关于算法:种草成新媒体营销策划重点微信抖音小红书网红大号KOL达人带货投放服务怎么选

【本篇由言同数字科技有限公司原创】各营销阵地:关键因素、策略、玩法,针对四大支流平台——抖音、小红书、微博、微信,咱们具体开展。 抖音——关键词:闭环作为最大的短视频种草和内容电商平台,抖音根本是必选项了。抖音玩法是十分多且简单,包含品牌竞价广告、星图达人种草体系、达播自播以及各种官网IP流动,比方挑战赛、全民工作、团购探店等。抖音官网有FACT、A1-A5用户资产运作等不同营销框架和工具。抖音的益处在于,闭环让每一滴流量都不节约——无论是本人还是别人种草打下标签,多轮收割,且收割品类、竞品的流量。最终造成流量的大小循环。 小红书——关键词:价值作为内容社区平台,近几年,小红书平台的营销价值,也被越来越多的品牌器重。抖音次要是算法驱动,小红书是内容价值驱动。从用户浏览习惯来看,抖音有强娱乐休闲属性,有意识浏览和消遣,而用户关上小红书,更多是带有肯定指标感、无意识去发现和摸索。简略来说,用户在小红书,是想寻找到有价值的内容。而平台也对高价值内容十分优化,长尾效应很显著。 我已经做过一个试验,新开了一个红书号,做了一篇绝对小众干货的文章。发现在长达2个多月工夫,通过搜寻,每天都会有稳固的浏览量和互动。 小红书的逻辑其实很简略,两种:【被动发现】和【被动检索】,任何产品要在小红书胜利种草,必须抓住两类行为,而行为背地的所有原点,就是【提供高价值的内容】。也就是说,产品在小红书高效种草的要害,在于产品是否超过其自身的内容价值延展性属性,或者说是否被充沛开掘。 微信——关键词:信赖微信上的生意,根本都是基于【信赖】的生意模式。说起微信,很天然会和【私域】分割在一起,如果开展说私域,那的确远超篇幅所限。因而,这个章节还是重点聚焦在微信里【种草】(重点就是私域种草),基于私域的CRM治理、底层经营体系构建等,先不做波及。用信赖来做种草,归根究底是两种形式:通过本人的私域;利用他人的私域。先给私域下个定义,就是可反复、低成本甚至收费触达用户。 很多人都说,微信的私域才是真私域。的确如此。 如果用一句话概括在微信私域种草的逻辑,就是:划地盘种本人的草,让他人无草可种。有人说,这么好,那应该全副微信私域种啊。别急,私域种草的价格,在初期投入时,是比公域更贵的。 在本人的私域种草,须要投入长期的经营、内容等人工成本。而利用他人的私域,家喻户晓,微信大V的流量是很贵,根本一个UV的价值在1元左右。 但这些流量的价值不容置疑,因为微信熟人社交的底层模型,更容易基于信赖关系,让种草的举荐成果更有保障。因而,从投产比的角度,判断是否要在微信私域种草,外围要看是否产品十分须要【信赖】背书。 微博——关键词:议题微博像一个舞台。咱们都晓得,如果让你的产品取得集中时间段的大曝光,须要付出的费用是十分高的。比方春晚、机场大屏、央视广告、APP开屏等。微博的妙处在于,能把曝光老本极大压低,在半天或一天的工夫内,让产品站到舞台的聚光灯下。关键在于【设置议题】在微博的舆论场,设置议题是取得大曝光很重要的方法,即让产品或者服务成为社会公众感兴趣的议题。 这里操作的关键点在于:是否足够牵动更多媒体自发流传;是否留足探讨和热议空间;必须紧扣产品或服务,让他们自发地成为热议关注点,而不是边缘性植入。一旦在微博舆论场成为热搜话题,其余平台往往也会有连锁反应,让产品成为横扫各大平台的热潮。 当然,曝光毛病是工夫较短,因而适宜产品要害上市或其余节点,或者新品牌首次亮相。中国数字营销计划微信经营代理商-言同数字科技有限公司(客户经理微信farawaywork,增加请备注来意)透过绩效导向的整合数字营销解决方案,提供翻新科技的营销策略及行业洞察为品牌带来长期价值。 微信自2011年推出以来,即便面对其余平台的崛起竞争,其社交媒体的主导地位却未曾被撼动!在腾讯公司的声援下,微信与Google、Facebook一起成为2021年寰球前十大最具价值的科技品牌。 言同数字提供的策略性微信广告服务全方位的品牌评估中国严格的互联网审查法规,或者让许多行业对微信广告感到却步。只管言同相熟中国数字营销服务,但咱们仍保持对贵公司进行全方位评估,目标是为了让微信公众号的设置过程能更加顺利。 微信公众号注册微信公众号平台一直扩增,目前提供订阅号、服务号和企业号以及小程序四种帐号类型,不同的性能和模式是否曾经让您一头雾水? 别放心,言同数字业余团队将带您一一理解各别帐号的主要用途及劣势,为品牌设置最合适的微信帐号。 建设本地化的微信内容依据数据显示,微信用户均匀每天应用工夫长达66分钟,而其之所以深受宽广用户的欢送,正是因为它从讯息传递到电子领取性能一应俱全。 言同数字团队将发明合乎当地文化和语言的日常话题,随时随地引起用户的关注度。 透过微信KOL营销微信KOL在特定的分众市场中深受粉丝信赖,同时能影响其购买决策,带来广告高覆盖率并促成销售。言同数字为您的品牌筛选出在自媒体或集体公众号中适合的网红。 微信经营功效数据报告为了经营优化功效,言同数字经验丰富的团队会亲密监控品牌微信帐号,并适时调整经营策略。除此之外,更提供即时剖析报告,蕴含粉丝画像、文案内容和互动数据之洞悉见解,以便您充沛理解微信经营流动成绩。 为何抉择言同数字为微信经营代理商?7年以上的微信经营专业知识言同数字在中国市场领有超过7年以上的教训,精通微信运作。无论过程有多简单繁琐,言同数字业余团队会帮您解决好所有,并保障能取得令人满意的功效体现,进一步推动品牌业绩增长。 本地中国团队的声援凭借言同数字当先的数据开发科技及经验丰富的中国团队,为电子商务、游戏、美容和批发等不同产业的客户,量身打造专属的微信营销策略,一起开辟潜在的中国市场。 言同数字领有先进的数字营销大数据和杰出的广告服务(客户经理微信farawaywork,增加请备注来意)致力让品牌客户在数字营销旅程中实现业务指标,透过新媒体平台、媒体网站及网红推广渠道等,帮忙品牌取得、维持和增长客户。咱们的首要任务就是使用全方位对外数字营销策略,帮助国内公司进入中国市场。

September 10, 2022 · 1 min · jiezi

关于算法:算法学习笔记-day5二叉树

老规矩上链接二叉树的定义二叉树节点构造(有点像双向链表) class Node<V> { V value; Node left; Node right;} 用递归和非递归两种形式实现二叉树的先序、中序、后序遍历二叉树得先中后序又称为深度优先遍历。 遍历程序如下:(实际上就是跟节点在前 中 后的程序)。前序遍历:根结点 ---> 左子树 ---> 右子树中序遍历:左子树---> 根结点 ---> 右子树后序遍历:左子树 ---> 右子树 ---> 根结点实现上都能够通过递归序转变而来。如下图所示: 但如果不必递归的话,其实就是模仿手动压栈的过程以中序遍历为例: 每次就是整棵树左边界进栈,顺次弹出的过程当中,对弹出节点右侧子节点反复此过程已上图为例先压1 在压2 再压4。那么先弹4。无右侧子节点弹2有右侧,对5进行此操作,弹5,没了。弹1 有右侧反复,压3 压6 弹6 弹3 有右 弹7。原理是什么呢? 原理其实就是任何树都能靠左边界来合成 举个例子: 层序优先遍历(宽度优先遍历)思路: 应用队列,放入该节点,弹出,而后先放左 再放右周而复始还是以上图为例:先放1 弹1 再放2放3 弹2放4放5 弹3放6放7 public static void w(Node head) { if(head == null) { return;}Queue<Node> queue = new LinkedList‹>();queue.add(head);while(!queue. isEmpty()){ Node cur = queue.pol1(); System.out.printin(cur.value);if(cur.left I=nul1) { queue.add(cur. left);}if(cur.right l=nul1) { queue. add(cur.right);}}相干题目:求一颗二叉树最大宽度 ...

September 9, 2022 · 1 min · jiezi

关于算法:2022-WAIC-闭幕融云提供分论坛元宇宙直播技术支持

(点击报名融云 2022 社交泛娱乐出海嘉年华) 9 月 1 日至 9 月 3 日,2022 世界人工智能大会(WAIC)以线下线上相结合的形式在上海召开。关注【融云寰球互联网通信云】理解更多 大会由国家倒退和改革委员会、工业和信息化部、科学技术部、国家互联网信息办公室、中国科学院、中国工程院、中国科学技术协会、上海市人民政府独特主办,全程以“元宇宙”因素贯通始终,为现场观众带来将来感沉迷体验,也为线上观众提供元宇宙超维感触。其中,由零幺宇宙与新华云街合作伙伴联结主办的“2022 世界人工智能大会 ——元宇宙技术与生态单干论坛”成为极具元宇宙特点的代表性流动。其线下论坛于 9 月 2 日在徐汇滨江西岸艺术核心举办,线上空间也同期在零幺宇宙旗下元宇宙入口重磅开启。在融云通信云服务的反对下,用户得以在此取得突破时空限度、场景丰盛多元的直观参会和互动体验。 观众能够像加入线下流动一样,来到零幺宇宙的接待处支付纪念品;像玩游戏般操控本人的角色顺着现场路引“走”进完满复刻线下会场安排的线上演播厅;抉择一个地位落座,便能够切换第一视角观看当天的全场直播。(支付纪念品,如同线下参会个别) (顺着路引真正“走”进复刻线上会场) (抉择一个地位落座) (第一视角观看论坛直播) 此外,通过界面右下角的功能键,用户能够发送多种表情、动作和文字,与其余虚构观众进行互动;通过“传送”按钮,还能够在不同“楼层”构建的场景间穿梭,从直播间到达数字藏品展区,只需微微一点。更多场景还在构建中,除了参会和看展,将来,娱乐、教育、商贸、办公等畛域的商业模式都可能实现元宇宙化。 随着共性突出、趣味独特的 Z 世代登上舞台地方,元宇宙便成为了代表了将来可能性的微小市场。彭博社报道,2024 年,“元宇宙”的寰球支出规模预计达到 8000 亿美元左右。 这个大世界是一个生态,须要多个组件参加构建。零幺宇宙正从多个角度参加其中,从底层区块链服务、到数字资产治理平台、再到元宇宙虚构场景构建,一步步实现互联互通多元宇宙构建。 目前,零幺宇宙曾经与新华网等战略伙伴联结搭建新华云街、芒境等多个元宇宙场景,致力于成为虚拟世界的入口。而人与人之间的交互,是能让人沉迷在元宇宙中的重要因素。 在融云 IM 即时通讯和 RTC 实时音视频服务的反对下,零幺宇宙打造的元宇宙空间反对用户随时随地发动多种音讯类型的即时聊天和低提早、高晦涩的音视频交互。 有了高品质通信的加持,咱们能够用虚构数字人身份在元宇宙空间看展、购物、生存、办公,实现多种交互,成为真正的“元住民”。这一个个将来生存图景的“缩影”,将最终造成那个巨大的、充斥设想空间的元宇宙世界。

September 9, 2022 · 1 min · jiezi

关于算法:算法数据结构-回溯中重复元素与分割问题分析总结

这里总结昨天做的两类体型。组合总和问题中如果遇到反复元素状况和宰割问题。 组合总和https://leetcode.cn/problems/... 思路聚焦到再以后层,该怎么选取,对应到代码中就是回溯函数中,for 循环外面如何管制回溯函数的传入参数,使得可能反复选取自身,并且不造成反复的组合。class Solution {public: vector<vector<int>> result; vector<int> path; int sum = 0; void backtracking(vector<int>& candidates, int target, int startIndex) { if (sum == target) { result.push_back(path); return ; } if (sum > target) return ; for (int i = startIndex; i < candidates.size(); i++) { sum += candidates[i]; path.push_back(candidates[i]); backtracking(candidates, target, i); sum -= candidates[i]; path.pop_back(); } } vector<vector<int>> combinationSum(vector<int>& candidates, int target) { backtracking(candidates, target, 0); return result; }};保障每一次回溯,startIndex 都从以后节点开始抉择,保障了可能选取到自身节点并且不反复抉择之前的节点,造成组合反复。 ...

September 6, 2022 · 2 min · jiezi

关于算法:算法数据结构-二叉树的几种操作方法及思考

二刷代码随想录,在做二叉树的时候总结一下法则,以加深对二叉树的了解。 递归遍历首先,回顾一下其余的数据结构,如数组,链表,栈和队列,比拟少的呈现递归的操作,一遍都是间接遍历循环。之所以在二叉树的体系里呈现递归,和树的数据结构的特点相干:由root节点和左右节点及节点的节点...形成。实质上是存在一个指针的一直链接。因而和数组这种地址间断的构造相比,树的节点没有方法通过顺次寻找地址来遍历。所以,递归派上了用场。假使树是一个单叉树,问题倒没有那么简单(不存在前序,后序,中序遍历),只有一直将子节点传给递归函数,操作在遍历之前或者之后。递归函数的意义能够了解为他通向最初不能在递归的中央为止。因而递归函数在代码的地位十分重要,管制着代码的逻辑。递归遍历的举例以前序遍历为例,前序遍历是指中左右的遍历形式,“前”是指两头节点首先遍历。 class Solution {public: void traversal(TreeNode* cur, vector<int>& result) { if (cur == NULL) return ; result.push_back(cur->val); traversal(cur->left, result); traversal(cur->right, result); } vector<int> preorderTraversal(TreeNode* root) { vector<int> ans; traversal(root, ans); return ans; }};1.首先是结构递归函数,首先他是个函数,得思考传入参数,返回值。传入参数基本上必定须要树的节点传入,这样在函数外面能力通过调用递归函数,并将以后的节点的左右节点传入,实现递归的性能。2.程序。因为是前序遍历,所以咱们须要保障先对树的两头节点进行操作,那么因为传入的root就是一个两头节点,所以须要对其先进行操作。而后再traversal(left) , traversal(right)。 层序遍历class Solution {public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> result; queue<TreeNode*> que; if (root) que.push(root); while (!que.empty()) { int size = que.size(); vector<int> vec; for (int i = 0; i < size; i++) { TreeNode* node = que.front(); que.pop(); vec.push_back(node->val); if (node->left) que.push(node->left); if (node->right) que.push(node->right); } result.push_back(vec); } return result; }};如何了解层序遍历和一般遍历之间的异同?在我看来,层序遍历蕴含的是前序遍历的思维。首先在思考如何实现层序遍历时,咱们须要思考的问题的是如何防止树在以后节点始终递归上来。因为如果那样的话就无奈实现一层一层的输入了。所以咱们须要结构一个容器去保护每一层的节点,这里抉择队列que。在遍历以后节点的时候把他的左右节点顺次放入队列。而后再去实现遍历一层的性能,非常的奇妙。 ...

September 3, 2022 · 1 min · jiezi

关于算法:我知道你不知道我到底知不知道

请点赞关注,你的反对对我意义重大。 Hi,我是小彭。本文已收录到 GitHub · AndroidFamily 中。这里有 Android 进阶成长常识体系,有气味相投的敌人,关注公众号 [彭旭锐] 带你建设外围竞争力。 前言大家好,我是小彭。 在计算机面试中,逻辑类题目是规模以上互联网公司的必考题。因为题目花样百出,筹备难度较大,题海战术可能不是举荐的做法。在这个系列里,我将精选十道十分经典的逻辑题,心愿能帮忙你找到解题思路 / 技巧。如果能帮上忙,请务必点赞加关注,这真的对我十分重要。 系列文章: 我晓得你不晓得,我到底知不知道至多要几个砝码,能够称出 1g ~ 40g 分量舞会上有多少顶黑帽?25 匹马 5 条赛道,最快须要几轮求出前 3 名?1. 题目形容A 与 B 好奇问 C 的年龄,爱卖关子的 C 给出了以下 11 个数字,C 的年龄就是其中的一个:$35、36、38、42、45、46、51、55、57、61、62$,并且别离把年龄的十位数通知给 A,把个位数通知给 B。此时,A 和 B 产生以下对话: A:我不晓得 C 的年龄,我晓得你不晓得。 B:本来我不晓得的,当初我晓得了。 A:当初我也晓得了。 那么,请问 C 的年龄是? 2. 解题要害1、我晓得你不晓得的含意: 这句话的含意是:依据我的现有信息,能够晓得你未获得命题的充分条件。更艰深的说法是,我不晓得你当初是什么状况,反正肯定不是那个能够推断出后果的状态;2、“唯一性” 隐含的充分条件: 有 36、46、57 这三个数,假如已知指标数的个位数是 7 ,那么很显著这个数就是 57 了(因为只有惟一个数字个位是 7)。3. 题解首先咱们察看 11 个数字: $(35、36、38、42、45、46、51、55、57、61、62)$十位数有 3、4、5、6 这几种可能,都会匹配不惟一个数字。 个位数有 1、2、5、6、7、8 这几种可能,其中 1、2、5、6 会匹配不惟一个数字,而 7、8 会别离匹配 57、38 两个数字。 ...

September 1, 2022 · 1 min · jiezi

关于算法:至少要几个砝码可以称出-1g-40g-重量

请点赞关注,你的反对对我意义重大。 Hi,我是小彭。本文已收录到 GitHub · AndroidFamily 中。这里有 Android 进阶成长常识体系,有气味相投的敌人,关注公众号 [彭旭锐] 带你建设外围竞争力。 前言大家好,我是小彭。 在计算机面试中,逻辑类题目是规模以上互联网公司的必考题。因为题目花样百出,筹备难度较大,题海战术可能不是举荐的做法。在这个系列里,我将精选十道十分经典的逻辑题,心愿能帮忙你找到解题思路 / 技巧。如果能帮上忙,请务必点赞加关注,这真的对我十分重要。 系列文章: 我晓得你不晓得,我到底知不知道至多要几个砝码,能够称出 1g ~ 40g 分量舞会上有多少顶黑帽?25 匹马 5 条赛道,最快须要几轮求出前 3 名?1. 问题形容给定一台天平,至多要几个砝码,能够称出 1g ~ 40g 这 40 个分量? 这个问题等同于 “德·梅齐利亚克砝码”问题:一位商人有一个 40 磅的砝码,因为跌落在地而碎成4 块。起初,称得每块碎片的分量都是整磅数,而且能够用这 4 块来称从 1 ~ 40 磅之间的任意整数磅的重物。(援用自法国数学家 G.B.德·梅齐里亚克)问这 4 块砝码碎片各重多少? 2.解题要害砝码的和与差: 假如有 m 和 n 两个砝码(m > n),除了能够称出 m + n 的分量外,还能够称出 m - n 的分量。 3. 题解令 $A_x$ 示意第 $x$ 块砝码的分量。 第 1 块砝码 $A_1$:为了称取分量 1g ,必须领有一枚分量为 1g 的砝码,即 $A_1$ = 1。目前能够称 {1, 2, 3}。第 2 块砝码 $A_2$:砝码组 $[1, A2]$,能够称出 $\{1, A_2 - 1, A_2, A_2 + 1\}$。为了称取分量 2g,显然有 $A_2$ - 1 = 2,即 $A_2$ = 3。目前能够称 {1, 2, 3, 4}。第 3 块砝码 $A_3$:砝码组 $[1, 3, A3]$,能够称出 $\{1, 2, 3, 4, A_3 - 4, A_3 - 3, A_3 - 2, A_3 - 1, A_3, A_3 + 1, A_3 + 2, A_3 + 3, A_3 + 4\}$。为了称取分量 5g,显然有 $A_3$ - 4 = 5,即 $A_3$ = 9。目前能够称 {1, 2, 3, 4, ..., 13}。第 4 块砝码:同理,第 4 块砝码 $A_4$ = 27,能够称出 $\{1, 2, 3, 4,..., 40\}$。总共须要 4 个砝码。参考资料《托付,面试别再问我三进制了!!!》 —— 沈剑 著《世界上最完满的砝码组合---神秘的“3”重现江湖!》 —— 隔壁家的二傻子 著我是小彭,带你构建 Android 常识体系。技术和职场问题,请关注公众号 [彭旭锐] 私信我发问。 ...

September 1, 2022 · 1 min · jiezi

关于算法:舞会上有多少顶黑帽

请点赞关注,你的反对对我意义重大。 Hi,我是小彭。本文已收录到 GitHub · AndroidFamily 中。这里有 Android 进阶成长常识体系,有气味相投的敌人,关注公众号 [彭旭锐] 带你建设外围竞争力。 前言大家好,我是小彭。 在计算机面试中,逻辑类题目是规模以上互联网公司的必考题。因为题目花样百出,筹备难度较大,题海战术可能不是举荐的做法。在这个系列里,我将精选十道十分经典的逻辑题,心愿能帮忙你找到解题思路 / 技巧。如果能帮上忙,请务必点赞加关注,这真的对我十分重要。 系列文章: 我晓得你不晓得,我到底知不知道至多要几个砝码,能够称出 1g ~ 40g 分量舞会上有多少顶黑帽?25 匹马 5 条赛道,最快须要几轮求出前 3 名?1. 题目形容一群人开舞会,每人头上都戴着一顶帽子。帽子只有黑白两种,黑的至多有一顶。每个人都能看到其它人帽子的色彩,却看不到本人的。主持人先让大家看看他人头上戴的是什么帽子,而后关灯,如果有人认为本人戴的是黑帽子,就打本人一个耳光。第一次关灯,没有声音。于是再开灯,大家再看一遍,关灯时依然欢声雷动。始终到第三次关灯,才有劈劈啪啪打耳光的声音响起。问有多少人戴着黑帽子?(假如每个人都足够聪慧) 2.解题要害定义问题: 假如问题为 $y=F(n)$,示意当有 $n$ 顶黑帽时,会在第 $y$ 天打脸;每个人都看不到本人的帽子,只能通过观察他人的帽子的体现猜想本人的帽子;终止条件: 当一个人眼前都是白帽时,因为至多有一个黑帽,则阐明他本人是黑帽。3. 题解$F(1)$:因为只且仅有 1 顶黑帽,那么黑帽 A 眼前全是白帽,他很分明本人是黑帽,因而肯定会在第 1 天打脸。即 $F(1) = 1$;$F(2)$:因为只有 2 顶黑帽,大多数人眼前有 2 顶黑帽,而其中黑帽 A 和 B 最为非凡,他们眼前只有 1 顶黑帽。聪慧的 A 晓得 B 眼前只有两种状况:全是白帽 or 只有 A 头上的黑帽。聪慧的 B 也晓得 A 眼前只有两种状况:全是白帽 or 只有 B 头上的黑帽。因为 $F(2)$ 没有人眼前全是红色,所以第 1 天不会有人打脸。那么 A 和 B 察看到对方没有在第 1 天打脸,别离都晓得本人是黑帽,因而会在第 2 天打脸。即 $F(2) = 2$;$F(3)$:因为只有 2 顶黑帽,大多数人眼前有 3 顶黑帽,非凡的黑帽 A、B 和 C 眼前只有 2 顶。它们别离察看到其余两个人均没有在第 2 天打脸,同理,就确信本人是黑帽。即 $F(3)=3$。一次类推,有 $F(x) = x$,有几顶黑帽,就会在第几天打脸。我是小彭,带你构建 Android 常识体系。技术和职场问题,请关注公众号 [彭旭锐] 私信我发问。 ...

September 1, 2022 · 1 min · jiezi

关于算法:从百万到亿级得物触达策略平台是如何做的

1. 简述触达策略这几个字听起来比拟形象,刚开始听到并不能间接了解。简要形容下,触达策略的外围是工作。首先配置工作,工作下有策略,策略下有行为,行为能够发送push推送、发放优惠券、发送音讯盒子、发送短信等。而后等到工作执行工夫,执行工作下所有行为。蓄水池是晋升触达策略平台算法推送能力的实现,为算法亿级数据推送能力提供了技术支持。 2. 得物触达策略平台得物触达策略平台是通过用户的诸多特色划出一批用户,而后到指定工夫执行给用户发送push,短信,音讯盒子等行为的零碎。次要由工作、策略、行为、蓄水池、文案池等组成。接下来将通过“工作主体结构图”和“工作执行结构图”来介绍。 2.1 工作主体结构图 通过这张图能够简略的看到,工作下有策略,策略下有行为,通过策略下的行为来理论执行对应的push推送。 下面是理论发送push的时候App对应的截图。 2.2 工作执行主体结构图 3. 算法个性化从百万到亿级,得物触达策略平台怎么做触达策略平台提供了一个强有力的和得物用户沟通的渠道。触达策略平台通过AB试验、文案赛马、回流数据分析、推送发送机会等多种维度决策出了触达策略平台和用户沟通的最佳计划。为了谋求更好的用户体验,触达策略平台全面引入算法。触达策略平台应用蓄水池能力撑持起了算法亿级数据处理的需要。通过咱们的实际和触达策略工作执行模型以及蓄水池性能,曾经实现了从算法个性化从百万级到亿级的演进。 4. 触达策略平台蓄水池4.1 为何要做蓄水池以上讲述了触达策略平台主体业务,行为中有算法推送行为的case。算法推送的push内容来源于算法,实时状况下每个人的推送数据并不统一,一段时间内局部人推送数据会雷同的特点。 触达策略的蓄水池简略来说就是将要执行的用户数据暂存到池子里,待蓄水池中数据满足肯定条件后,再把合乎某一特色的用户数据捞出解决。 举个算法例子,在算法提价告诉场景,1.0版本算法推送量还比拟少,1.0版本圈选平台人群下用户流过来时咱们是实时发送推送的,因为一批数据中大多数人push数据都不雷同需单个调用。如果咱们始终这么做,算法扩量后1小时推送1亿用户的1亿次调用,音讯平台会扛不住,触达策略零碎压力也增大不少。 1小时内调用音讯平台1亿次是不OK的。为了解决下面的问题及思考到咱们业务特点,比方15分钟同一个商品的提价推送大概率会发给几十个用户。由此咱们能够做个蓄水池,对于收到的用户先暂存,而后将它们依照所属提价商品id分组分批执行。用一句话概括就是用户提价商品数据超过一定量或用户提价商品数据超过指定工夫,只有满足任何一个阈值就执行对应的行,蓄水池性能就提上了日程。 简言之,蓄水池做的就是将不可批处理的实时数据流暂存,再将暂存的所有数据依照某个特色分组,最终将分组好的数据批处理的一件事。 蓄水池业务结构图: 4.2 为何会选用HBase作为蓄水池的存储层海量存储及长久化HBase适宜存储PB级别的海量数据,存储介质可应用便宜PC。其长久化满足咱们对于数据不失落的需要,能在几十到百毫秒内返回数据。HBase良好的横向扩展性,实现了海量数据的存储能力。单表可满足咱们每日亿级数据处理和数据极限会存储数十亿行的需要。 存储应用列式存储这里的列式存储其实说的是列族(ColumnFamily)存储,HBase是依据列族来存储数据的。列族上面能够动静扩大十分多的列,满足咱们存储数据灵便格局和动静扩大的需要。 不便横向扩大HBase的扩展性次要体现在两个层面,一个是下层(RegionServer)的横向扩大进步解决能力,一个是存储(HDFS)横向扩大进步大数据量存储能力。通过增加RegionSever机器,进行程度扩大,进步Hbsae服务RegionServer反对更多Region的能力。 备注:RegionServer的作用是治理Region、承接业务的拜访,通过横向增加Datanode的机器,进行存储层扩容,晋升HBase的数据存储能力和晋升后端存储的读写能力。 高并发、高读写性能因为目前大部分应用HBase的架构单个IO提早是可承受的。并且在高并发环境下,HBase的单个IO提早降落不重大。HBase人造不便构建高并发、低提早的服务。当然其满足了咱们同时小时内亿级读写数据需要。 稠密稠密次要是针对HBase列的灵活性,在列族中,你能够指定任意多的列,在列数据为空的状况下,是不会占用存储空间的。 rowKey前缀扫描HBase反对rowKey前缀扫描分批拉取数据,预拉取数据缓存本地。主键scan性能可笼罩触达策略蓄水池业务查问需要。大数据量下数十万条数据每秒的拉取性能满足查问的性能要求。 4.3 HBase简略介绍4.3.1 HBase 架构图 4.3.2 介绍下蓄水池性能中用到的HBaseHBase是人造的分布式数据库,Table可类比MySQL表中的Table,Region可类比MySQL分库分表中的一张分表,rowKey可类比MySQL表的主键id。单个Region区数据过多时,HBase会将Region决裂为多个Region,由HBase管制。建HBase表时可指定预分区,举个例子,根据rowKey大小可设置小于1的任意字符到1、1到2、2到3、3到4、4到5、5到大于5的任意字符这6个Region分区。预设分区的目标是使HBase存储的数据和流量能够平均的散布到不同的Region上。 4.4 蓄水池技术构造介绍 算法提价商品举例: 生产者获取到提价商品数据后生成rowKey = hash(spuId+分隔符+templateCode)+分隔符+spuId+分隔符+templateCode+分隔符+userId,rowKey在HBase上是有序排序的,这样的rowKey能够将不同组数据离散到不同的HBase分区上,同时又保障了同样的推送spuId的数据在一片间断的内存,通过程序读的形式晋升数据读取性能一个数量级。rowKey设计前缀hash(spuId+分隔符+templateCode),这么做的其目标能够将数据打散散布到所有Region上,解决了spuId数据前缀雷同导致的热点数据问题,同时通过hash后所有rowKey数据分布的更离散。HBase数据转换器能够将HBase需存储的数据尽量压缩缩小空间占用保障HBase的高性能。 HBase数据池HBase数据池的职责存储数据,并依据rowKey值散布和范畴均等宰割到不同的预分区上,而后将分区均等的散布到不同的RegionServer上,并依照rowKey做排序。 消费者消费者在服务器上是一个常驻线程。数据分配器尝试获取某个分区数据的解决权限,数据获取器依据rowKey范畴从HBase分批扫描式遍历获取到数据,一次获取到的数据都是可批量发送的push数据,将满足工夫阈值和数量阈值的数据流入到数据解析器。数据解析器将HBase数据解析为业务数据,紧接着进入限流器和行为执行器。最终将已解决的数据从HBase中删除。解决完结后,数据分配器尝试获取下一个分区数据的解决权限,反复上述步骤。 触达策略蓄水池rowKey,预分区实际触达策略HBase有n台实例机器,要使每台HBase机器调配m个分区,预分区设置mn个分区,分区区间设置为小于1的任意字符到1、1到2、2到3、3到4、4到5....mn-1到大于mn-1的任意字符。rowKey的hash前缀设定位 0、1、2、3、4、5到mn-1,而后数据和后续的HBase申请流量会平均的调配到每台机器上以及每个分区上。消费者设置n个消费者,保障每个分区实时有一个消费者在解决数据。当然以上分区和消费者数量都是可动静横向扩大的,满足后续扩量和进步解决能力需要。 5. 结语触达策略平台总体来说是工作和策略和行为,等到工作执行工夫,获取圈到的人群,再对人群内的所有人依照工作下的策略执行工作下的行为。后续是针对这个外围流程做各个性能和细节上的丰盛和扩大。 蓄水池性能上线后收到了称心的成果,每天2个小时内亿级的算法推送数据可能稳固运行。后续算法推送会持续新增场景以及扩充推送用户量,根据目前的零碎负载状况,可预感蓄水池能稳固反对。 参考文献:https://hbase.apache.org/book... *文/王鹏亮 @得物技术公众号

September 1, 2022 · 1 min · jiezi

关于算法:达观携手CCF-BDCI举办第六届达观杯知识图谱自动化构建比赛

August 31, 2022 · 0 min · jiezi

关于算法:如何用DockArray的子索引实现嵌套数据的搜索

    导语 在数据很简略的时候,每个向量都代表一个数据点,咱们轻松地存储到任意向量数据库,基于类似度去检索 embedding。但事实世界的数据总是很凌乱的,多模态数据有着各式各样的档次嵌套构造。 无需放心,Jina 全家桶为你筹备了解决方案! 作者介绍 Jina AI 机器学习工程师 Johannes Messner 工作:商品搜寻 在本笔记本中,咱们的数据库蕴含在线商店的列表,每个列表都蕴含多个图像和一个商品形容。首先要让这些数据都是可搜寻的,此外,还心愿用户能应用不同的模态(文本、图像或两者同时)作为查问输出,来搜寻到精确的商品。 为了解决这两个问题,咱们只须要一个工具 DocArray 具体来说,咱们将用到 3 个 DocArray 的性能: 1. Dataclass[1],对数据进行建模2. Subindex[2],使数据点及数据点的嵌套信息可搜寻3. Document Stores[3],将咱们的数据存储在磁盘上,并对它做检索此外,咱们也将应用 CLIP-as-service 编码文本和图像数据,生成对应 embedding。 数据索引 在索引数据之前,让咱们看看咱们的数据必须是什么样子,能力实现上述工作。 • 想要搜寻图像,须要为每个图像提供 embedding• 想要搜寻形容,须要示意其形容的语义 embedding• 想要搜寻整个列表,每个列表都须要一个能代表整个列表的 embedding 将 embedding 存储在向量数据库中时,通常无奈保留这种嵌套数据结构。然而,DocArray 子索引解决了这一难题。 Subindex 在 DocArray 中,数据以 Document 的模式存储,DocumentArray 是用于保留多个 Document 的列表。默认状况下,DocumentArray 是一个内存数据结构,但它也原生反对 Document Store,它是(向量)数据库后端,可用于在磁盘上长久化数据。 每个 DocumentArray 代表一个搜寻索引,因而给定一个查问,咱们能够找到其中蕴含的元素。一旦找到匹配的 Document,就能够将它们加载到内存中。 子索引使得这种模式可能扩大到嵌套数据。每个子索引代表父 DocumentArray 的一个嵌套档次,比方图片或形容文本。只有启用了子索引,就能够间接在该层执行搜寻,就不须要像应用根级别索引一样,先将所有数据加载到内存中。 在底层,每个子索引创立一个独自的数据库索引,独立于其余子索引或根索引来存储相干数据。 援用链接 [1] Dataclass: https://docarray.jina.ai/fund...[2] Subindex: https://docarray.jina.ai/fund...[3] Document Stores: https://docarray.jina.ai/adva...  

August 31, 2022 · 1 min · jiezi

关于算法:MindSpore易点通如何将PyTorch源码转成MindSpore低阶APIP并在Ascend芯片上实现单机单卡训练

文章起源:华为云论坛_云计算论坛_开发者论坛_技术论坛-华为云1 概述本文将介绍如何将PyTorch源码转换成MindSpore低阶API代码,并在Ascend芯片上实现单机单卡训练。下图展现了MindSpore高阶API、低阶API和PyTorch的训练流程的区别。与MindSpore高阶API雷同,低阶API训练也须要进行:配置运行信息、数据读取和预处理、网络定义、定义损失函数和优化器。具体步骤同高阶API。2 结构模型(低阶API)结构模型时,首先将网络原型与损失函数封装,再将组合的模型与优化器封装,最终组合成一个可用于训练的网络。 因为训练并验证中,需计算在训练集上的精度 ,因而返回值中需蕴含网络的输入值。import mindsporefrom mindspore import Modelimport mindspore.nn as nnfrom mindspore.ops import functional as Ffrom mindspore.ops import operations as Pclass BuildTrainNetwork(nn.Cell): '''Build train network.'''def __init__(self, my_network, my_criterion, train_batch_size, class_num): super(BuildTrainNetwork, self).__init__() self.network = my_network self.criterion = my_criterion self.print = P.Print() # Initialize self.output self.output = mindspore.Parameter(Tensor(np.ones((train_batch_size, class_num)), mindspore.float32), requires_grad=False)def construct(self, input_data, label): output = self.network(input_data) # Get the network output and assign it to self.output self.output = output loss0 = self.criterion(output, label) return loss0class TrainOneStepCellV2(TrainOneStepCell): ...

August 30, 2022 · 2 min · jiezi

关于算法:最短路模板dijkstraspfa链式向前星邻接表

前言有一段时间没做最短路的题了,写题切实手生,于是我决定写下此篇模板,从原理登程,把原理刻在脑子里。马上要较量了,我也告诫本人思路决定前途,思维第一,绝不背诵代码当然炽热的手感也是提速的要害,不背然而要纯熟,那就每天起床第一步,先敲一遍最短路最初面也放上我近期刷题的总结。 序 spfa+邻接表spfa+链式向前星dijkstra+邻接表dijkstra+链式向前星原理最短路问题,属于图论问题,顾名思义就是求两点之间最短的门路。咱们用d[i]来示意i点到终点s的间隔,求出终点到每个点的最短门路。 相同点: dijkstra和spfa其实都是bfs,都是从终点登程,逐层向外扩散,搜寻最短距离而后逐层更新。 不同点:spfa逐层搜寻的时候到某个点不肯定是全局最短路,可能在之后搜寻中发现通过其余点到这个点更近,所以那就再将这个点从新进入队列即可,再更新其余的点。像这样屡次入队的点比拟多的时候就会十分影响spfa的效率,所以spfa是不稳固的。 而dijkstra是十分稳固的,它在bfs的时候采纳了优先队列,让每次push进队列的点都能排个序,当咱们拿进去的时候天然就是最短的门路,每次用最短路更新前面的最短路即可。同时,这层的最短路去更新下一层的更大的最短路,也就决定了dijkstra的权值是非负的。 打模板的时候就尽量把所有的都加上,门路,判断负圈等。 比拟一下这两种数据结构:经实际失去,邻接表曾经能解决很大的图了,除非数据特地多那就用链式向前星,然而邻接表是更快一点,所以举荐应用邻接表(当然数据小能应用邻接矩阵必定是最快的)综上所述,权值非负肯定是用dijkstra(稳),首选邻接表,数据特多用链式向前星。更多细节我放到代码正文里。 spfa+邻接表:有负圈则选 #include<bits/stdc++.h>using namespace std;int n,m,s;const int inf=0x3f3f3f;const int NUM=1e5;int d[NUM];bool inq[NUM];int Neg[NUM];//判断负圈 int pre[NUM];//记录门路 struct edge{ int from,to,w; edge(int a,int b,int c){ from=a,to=b,w=c; }};vector<edge>e[NUM];//邻接表存图,个别喜爱以i点相邻的边来存。void print_path(int s,int t){ if(s==t){ printf("%d ",s); return ; } print_path(s,pre[t]);//先打印后面的再打印前面的 printf("%d ",t); } int spfa(int s){ for(int i=1;i<=n;i++){//每个点初始化 d[i]=inf;inq[i]=false; } memset(Neg,0,sizeof(Neg)); d[s]=0;inq[s]=true;Neg[s]=1;//本人到本人也算一个吧,所以为1,和前面的正文响应 queue<int>q;//间接用点入队 q.push(s); while(!q.empty()){ int u=q.front();q.pop(); inq[u]=false; //这里和迪杰斯卡尔不一样,出了之后就false就行了,之后仍可拜访 for(int i=0;i<e[u].size();i++){ int v=e[u][i].to,w=e[u][i].w; //不像迪杰斯卡尔,这里无奈判断continue if(d[v]>d[u]+w){ d[v]=d[u]+w; pre[v]=u; if(!inq[v]){//在队列里的就不能入队了,之前的都还没更完呢~ q.push(v); inq[v]=true; Neg[v]++; if(Neg[v]>n){ return 1;//呈现负圈 //每个点到这个点的路加起来为n,如果有负圈,这个点最短路就有限更新。 } } } } } print_path(s,n); return 0; }int main(){ while(cin>>n>>m>>s){ for(int i =1;i<=n;i++)e[i].clear();//清空 for(int i=1;i<=m;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); e[a].push_back(edge(a,b,c));//一种存储形式罢了 } spfa(s); for(int i=1;i<=n;i++){//打印每个点最短路 printf("%d ",d[i]); } } return 0;}spfa+链式向前星:负圈且图极大 ...

August 26, 2022 · 2 min · jiezi

关于算法:常见数据分析场景关联分析Apriori算法

想必大家都据说过啤酒和纸尿裤的故事,十分典型的提篮剖析,通过剖析顾客的购买习惯,制订相应的营销策略,从而进步营收,是关联剖析在批发超市中的一个具体分析场景。明天就来总结下关联剖析的基本概念以及如何用Apriori算法实现关联剖析。一、关联剖析是什么?1. 关联剖析的定义关联剖析是数据挖掘中一种简略而实用的技术,通过深入分析数据集,寻找事物之间的关联性,开掘频繁呈现的组合,并形容组合对象同时呈现的模式和法则。关联剖析技术不仅能够用来剖析用户购买商品之间的关联性制订营销策略,也能够利用于智能举荐零碎、医疗、保险等畛域。 2. 关联剖析的基本概念事务库:记录用户行为的数据,以提篮剖析来说,就是用户的订单交易信息以及商品数据。事务:事务库中每一行记录就是一笔事务,以提篮剖析来说,一笔订单就是一笔事务。项和项集:在购物篮事务库中,订单中的每个商品就是一个项,项的汇合称为项集。关联规定:由“前件”和“后件”组成,A->B,{A,B}->C,别离代表如果一个用户购买了A也会购买B,一个用户购买了A和B,也会购买C。反对度:蕴含该项集的事务在整体所有事务中所占的比例。例如项集{A,B}在购物篮中共呈现3次,一共由5笔订单,则项集{A,B}的反对度为3/5。频繁项集:反对度大于人为设定的阈值的项集成为频繁项集。置信度:置信度的含意是项集Y在蕴含项集X的事务中呈现的频繁水平。在购物篮事务中,关联规定X->Y的置信度=P(Y|X)=P(XY)/P(X)=support(X,Y)/support(X)强关联规定:强关联规定是指频繁项集中满足了最小置信度的关联规定,即项集首先要满足最小反对度。二、Apriori算法是什么?Apriori算法是驰名的关联规定的开掘算法之一,外围是递推算法,步骤如下: 设定最小反对度和最小置信度依据最小反对度找出频繁项集依据最小置信度找出强关联规定三、Apriori算法在Python中的应用Python中能够利用apyori库和mlxtend库疾速推到强关联规定,apyori库应用简略,但有时会漏掉一些强关联规定;mlxtend库稍显麻烦,但比拟谨严。 1. 案例1-用apyori库实现病症关联剖析import pandas as pddf = pd.read_excel('西医辨证.xlsx')print(df.head())excel数据中存储的是病人的编号和病人病症,共 1000 条: symptoms = []for i in df['病人症状'].tolist(): symptoms.append(i.split(','))print(symptoms)去掉逗号之后的 list:symptoms from apyori import apriori#设置反对度和置信度rules = apriori(symptoms, min_support=0.1, min_confidence=0.7)results = list(rules)for i in results: for j in i.ordered_statistics: #获取频繁项集中的强关联规定 # 前件 X = j.items_base # 后件 Y = j.items_add x = ', '.join([item for item in X]) #连贯前件中的元素 y = ', '.join([item for item in Y]) if x != '': #避免前件呈现为空的状况 print(x + ' → ' + y)最终获取后果如下: ...

August 25, 2022 · 1 min · jiezi

关于算法:CMPSC-461

CMPSC 461: Programming Language ConceptsProf. G. Tan, Spring 2022Programming assignment 2: Racket ProgrammingTotal: 24 points. Due on Mar 30th at 6pm in Canvas. (3 points) Write a Racket remove-when function. It takes two parameters.The first is a boolean function f, and the second is a list l. Theremove-when function returns a list with all elements x in l such thatf(x) = #t being removed.For example,(remove-when (lambda (x) (> x 3)) ’(10 1 7 2))should return the list (1 2), since both 10 and 7 are greater than 3.Define the remove-when function by using case analysis and recursion.(4 points) Write a Racket minInt function, which takes a list of numbers,and returns its minimum element. For example, (minInt ’(7 3 62)) should return 2. If the input list is empty, then it should return 0.Write the minInt function in Scheme in two steps:(a) (2 points) Write a minInt helper function; it takes a number kand a list of numbers, x, as arguments, and returns the numberwhich is the smallest among k and numbers in x. For example,(minInt helper 5 ’(4 5 6)) should return 4.(b) (2 points) Write the minInt function based on minInt helper.(3 points) In Racket, write a higher-order function manycall that takesthree parameters: n, f, x. It calls f on x for n number of times, whenn is even, but calls f on x for n − 1 number of times, when n is odd.That is, manycall should return x when n = 0 or n = 1; it shouldreturn f(f(x)) when n = 2 or n = 3; it should return f(f(f(f(x))))when n = 4 or n = 5; etc. As an example, (manycall 7 plusOne10) should return 16. Hint: you can use built-in predicates even?and odd? to test whether a number is even or odd, respectively.(5 points) Write a Racket function to-words that takes an integerbetween 0 and 199, inclusive, as a parameter and returns a list of words1corresponding to the integer’s reading in English. Make your functionhave a small number of cases; i.e., don’t write a COND expressionwith 200 cases. Example calls to your function are given below:(to-words 13) ; should return (thirteen)(to-words 42) ; should return (forty two)(to-words 155) ; should return (one hundred and fifty five)Note, in order to simplify things, we are not expecting dashes in theoutput (i.e., 42 is output as “forty two” not “forty-two”). Also, if theinput number is outside of the range of [0,199], your program shouldoutput ’error. Hint: You may want to use the built-in integer divisionfunctions quotient and remainder.(9 points) In this question, we are going to write a Racket functionwordMaxIndex that calculates the maximum index of each word thatappears in an input word list. For example, if the input is’(time is long but life is short)Then one output can be((time 0) (long 2) (but 3) (life 4) (is 5) (short 6))The index of the first word in a word list is 0; the index for the secondword is 1; etc. Therefore, in the previous example, the maximum indexfor word “time” is 0; the maximum index for word “is” is 5, since “is”appears twice, at index 1 and 5. Note that you are not asked to sortthe words in the output. Therefore, the output is correct as long asthe indexes are correct.Do the following steps to implement the word-index program. In ourdiscussion, we call a word with an index a word-index pair, for example,(short 6) and (is 5) are word-index pairs. We call a list of wordindexpairs a word-index list.(a) (3 points) Write a function initialWIList that takes a list ofwords and creates a word-index list. The resulting word-indexlist should have the right index for every word in the list. Forinstance,2(initialWIList ’(time is long but life is short))should generate the following output:((time 0) (is 1) (long 2) (but 3) (life 4) (is 5) (short 6))Hint: develop initialWIList on top of a helper function initialWIListHelper,which takes an index k and a word list l as input. It assumes thatthe first word in l has index k and generates the right word-indexlist. For instance,(initialWIListHelper 4 ’(life is short))should generate the following output:((life 4) (is 5) (short 6))(b) (2 points) Write a function mergeWI. It takes two inputs. Thefirst is a word-index pair and the second is a word-index list.This function generates a new word-index list. If the input wordindexpair has a corresponding pair in the word-index list withthe same word, then only the pair with the bigger index shouldbe kept; otherwise, the output word-index list should have theinput word-index list with the word-index pair at the end of thelist. For instance,(mergeWI ’(is 1) ’((time 0) (is 5)))should generate((time 0) (is 5))As another example(mergeWI ’(life 4) ’((time 0) (is 5)))should generate((time 0) (is 5) (life 4))3(c) (2 points) Write a function mergeByWord, which takes a wordindexlist and produces a new word-index list; the output wordindexlist should have one word-index pair for each word thatappears in the input list and the index should be the maximumindex of all indexes for that word in the input list. For instance,if the input list is((time 0) (is 1) (long 2) (but 3) (life 4) (is 5) (short 6))then the output should be((time 0) (long 2) (but 3) (life 4) (is 5) (short 6))Write mergeByWord based on the reduce function we discussed inclass and mergeWI. The reduce function is not built-in in Racket;you can type it in yourself:(define (reduce f l v)(if (null? l) v(f (car l) (reduce f (cdr l) v))))(d) (2 points) Finally, write a wordMaxIndex function that takes ina list of words and outputs the right word-index list; that is, foreach word in the input, the output word-index list should containa pair for the word with the maximum index. Write this functionbased on initialWIList and mergeByWord.Notes For programming assignments, examples are given only for the purposeof clarification. By no means that our tests will solely be based on thoseexamples. It’s your responsibility to thoroughly test your code by designingyour own test cases.The Racket reference at https://docs.racket-lang.org/...contains a list of standard procedures provided by Racket (for example, theremainder and the square root functions). You may find them helpful duringyour programming.Submission format: Put all your code into one DrRacket file and submityour file through Canvas. Please clearly mark your answers using commentsso that we can tell the correspondence between your code and questions.4Please ensure that your file starts with a comment that includes your nameand your Penn State network user id.

August 23, 2022 · 6 min · jiezi

关于算法:多模态算法在视频理解中的应用

1 概述现阶段视频分类算法,次要聚焦于视频整体的内容了解,给视频整体打上标签,粒度较粗。较少的文章关注时序片段的细粒度了解,同时也从多模态角度剖析视频。本文将分享应用多模态网络进步视频了解精度的解决方案,并在youtube-8m 数据集中获得较大晋升。 2 相干工作在视频分类人物中,NeXtVLAD[1] 被证实是一种高效、疾速的视频分类办法。受ResNeXt办法的启发,作者胜利地将高维的视频特征向量合成为一组低维向量。该网络显着升高了之前 NetVLAD 网络的参数,但在特色聚合和大规模视频分类方面依然获得了显着的性能。RNN[2] 已被证实在对序列数据进行建模时表现出色。钻研人员通常应用 RNN 对 CNN 网络难以捕捉的视频中的工夫信息进行建模。GRU[3] 是 RNN 架构的重要组成部分,能够防止梯度隐没的问题。 Attention-GRU[4] 指的是具备留神机制,有助于辨别不同特色对以后预测的影响。为了联合视频工作的空间特色和工夫特色,起初又提出了双流CNN[5]、3D-CNN[6]、以及slowfast[7]和ViViT[8]等。尽管这些模型在视频了解工作上也获得良好的体现,但还有晋升的空间。比方,很多办法只针对单个模态,或者只对整个视频进行解决,没有输入细粒度的标签。 3 技术计划3.1 整体网络结构本技术计划是旨在充沛学习视频多模态(文本、音频、图像)的语义特色,同时克服 youtube-8m数据集样本极不平衡和半监督的问题。如Figure 1所示,整个网络次要由后面混合多模态网络(mix-Multmodal Network)和前面的图卷积网络(GCN[9])组成。mix-Multmodal Network 由三个差异化的多模态分类网络形成,具体差异化参数在Table1中。Figure 1. 整体网络结构Table 1. 三个差异化的 Multimodal Net 的参数 3.2 多模态网络如图Figure 2所示,多模态网络次要了解三个模态(文本、视频、音频),每个模态都蕴含三个过程:根底语义了解、时序特色了解、模态交融。其中,视频和音频的语义了解模型别离应用的是EfficientNet[10]和VGGish,时序特色了解模型是NextVLAD。而文本的时序特色了解模型为Bert[11]。多模态特色交融,咱们采纳的是SENet[12]。SENet网络的前解决须要将各个模态的特色长度强行压缩对齐,这样会导致信息失落。为了克服这个问题,咱们采纳了多Group的SENet的网络结构。试验表明,多个group的SENet网络相较于单个SENet 学习能力更强。Figure 2. 多模态网络结构 3.3 图卷积因为Youtube-8M粗粒度标签全副标注,细粒度标签只标注了局部数据。因而,引入 GCN来进行半监督分类工作。根本思维是通过在节点之间流传信息来更新节点示意。对于多标签视频分类工作,标签依赖关系是一个重要信息。咱们应用标签之间的条件概率将标签相干信息引入咱们的建模。基于Youtube-8M 数据集粗粒度标签,咱们首先统计每个标签的呈现次数,失去一个矩阵 \( N∈R \) 。\( C \) 是所有类别的数量。而后咱们统计所有标签对的并发次数,这样就能够失去并发矩阵 \( M∈R﹡ \) 。最终失去条件概率矩阵 \( P∈R﹡ \) :\( Pⱼ \)示意标签\( i \)呈现时标签\( j \)的呈现概率。然而,来自训练和测试数据集的共现矩阵可能并不完全一致,数据集标签也不是 100% 正确。另一方面,一些常见的共现对咱们来说可能不是真正的关系,可能只是乐音。因而,咱们能够应用阈值\( \)将\( Pⱼ \)过滤到\( Pⱼ' \):在咱们的工作中,每个标签将是图(graph)的一个节点(node),两个节点之间的线示意它们的关系[13] [14]。所以咱们能够训练一个矩阵来示意所有节点的关系。以从咱们的数据集中提取的一个简化的标签相干图 Figure 3为例,Label BMW --> Label Car,示意当 BMW 标签呈现时,Label Car 很可能产生,但反之则不肯定。标签 Car 与所有其余标签具备高度相关性,没有箭头的标签示意这两个标签彼此没有关系。Figure 3. 标签相关性示意图 ...

August 22, 2022 · 3 min · jiezi

关于算法:CSE340-Type-Checking

CSE340 Spring 2021 Project 3: Type CheckingDue: Tuesday, Arpil 1, 2021 by 11:59 pm MSTThe goal of this project is to give you experience in Hindley-Milner type checking.We begin by introducing the grammar of our language which is based on the previous project withadditional constructs. Then we will discuss the semantics of our language and type checking rules.Finally we will go over a few examples and formalize the expected output. ...

August 22, 2022 · 6 min · jiezi

关于算法:Louvain算法在反作弊上的应用

作者 | ANTI 一、概述随着互联网技术的倒退,人们享受互联网带来的红利的同时,也面临着黑产对整个互联网衰弱倒退带来的危害,例如薅羊毛、刷单、刷流量/粉丝、品控、欺骗、快排等等,反作弊作为打击黑产的中坚力量,继续跟黑产反抗着,保障搜寻/feed成果的主观公正,保障广告主的合法权益。近年来反作弊算法能力继续晋升,黑产很难通过大规模机刷形式获利,已从大规模机刷转向更加荫蔽的小团伙舞弊,因而,反作弊进行了团伙舞弊开掘的摸索,Louvain就是比拟经典的一个算法,上面具体介绍下。 二、Louvain简介2.1 模块度定义 模块度是对社区划分好坏水平的一种度量,当社区外部的点之间连边越多,社区之间的点连边越少时,模块度越大,示意以后的社区划分状况越好,公式定义如下: 模块度是对社区划分好坏水平的一种度量,当社区外部的点之间连边越多,社区之间的点连边越少时,模块度越大,示意以后的社区划分状况越好,公式定义如下: 其中示意所有边权和,示意节点 i 和 j 之间的权重,示意与 i 相连的所有边的权重和,示意节点 i所在的社区,示意 x 和 y 是否雷同,是的话为 1,否则为 0。 公式并不好间接了解,进行肯定的变换可得 其中 c 示意社团,示意社区 c 中所有节点的之间的边权和,示意社区 c 中所有节点与其余节点的边权和。 模块度前一项形容的是社团内节点之间的边权,该值越大,模块度越大。第二项形容每个社团中所有节点的边权和平方,分母为常量,当所有节点(严格来说是节点的度,即边权)在不同社区中散布越平均,第二项越小,模块度越大。(第二项重要水平与社团理论的散布状况无关,比方风控场景社团大小散布极不平均,就会导致第二项后果偏大,模块度偏小,导致模块度的优化指标与理论场景抵触。) 2.2 算法 louvain 以最大化模块度为优化指标,依据模块度公式,整个社区的模块度能够以各个社区为单位计算后求和失去,louvain算法的流程如下: 初始化 将社团中每个节点都看做一个独自的社区。 阶段1:节点合并 遍历所有节点,计算以后节点脱离以后社区,且退出到街坊节点所在社区时,带来的模块度增益,把以后节点挪动到增益最大的街坊节点社区中。 每次计算节点 i 从社团 D 挪动到社团 C 中时,依据模块度计算公式可知,此时产生的模块度变动只与以后C、D社区相干,不与其余社区相干,因而计算成本较低,将节点 i 从社区 D 转移到 C 中带来的模块度增益为: Q\=Q(D→i)+Q(i→C) 直至节点挪动不再产生增益,阶段1进行。 阶段2:社区聚合 将同一个社区的多个节点,交融为一个新的节点,社区内节点之前的权重后续不再应用,以后社区与其余社区之间的权重为两个社区所有节点的权重和,从而构建出新的图构造。 回到阶段1一直迭代,直至图构造不再产生扭转。 louvain基于贪婪算法实现,理论数据中的均匀复杂度为 O(nlog(n)),当每一轮迭代中节点数量升高一半时,能达到均匀复杂度。 整体流程如下: 三、在反作弊利用因黑产舞弊的收益较大,作弊者就算冒着守法被抓的危险,也有短缺的工夫和能源与风控团队反抗,在理论业务场景中,过来作弊者最常应用的形式是低成本批量机器舞弊被咱们严格打击殆尽,目前也只能逐渐迁徙成了高老本小批量团伙人为舞弊,这是黑产攻击方式的演变趋势,也是风控团队技术倒退的必要趋势。 咱们看一个电商风控的业务场景。多数店铺为了结构虚伪的用户体验评分、更优的算法举荐,逼上梁山组建团队做起了刷单套利、刷评分等非法操作。而商家取得的非法收益最终却由用户买单。为了还原实在的互联网、给用户带来最优质的体验 ,咱们对舞弊团伙进行了继续开掘反抗。 咱们基于经典的Louvain算法实现关系网络模型,将舞弊数据中盘根错节的关系形象成数学表白,咱们失去层次化的社区发现后果,如下图所示。其中第一张图形容了危险账户的社区发现后果,第二张图形容了交易订单的社区发现后果,精准定位了舞弊团伙,拦挡舞弊订单/交易,加强了危险防控能力,联结公司法务部对多个舞弊黑产团伙也进行了数次抓捕。 ...

August 17, 2022 · 1 min · jiezi

关于算法:算法学习笔记day3

原视频发现一个数据结构讲挺好的数据结构与算法教程 二叉树如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。如果二叉树中除去最初一层节点为满二叉树,且最初一层的结点顺次从左到右散布,则此二叉树被称为齐全二叉树。 任意节点的父节点的索引为(n-1)/2; 任意节点左孩子为2n + 1;右节点为2n + 2;(这个不必记啊,这个回头画个图,把索引标上,现找法则就行,记住这玩意儿有法则就行)堆把上图二叉树节点当成数组索引,其实数组就是一个齐全二叉树,比方: 而这个齐全二叉树就是堆大根堆:任意节点大于所有其子节点的堆 为大根堆;反之为小根堆构建大根堆(heapInsert):一个个把值放到堆开端,比拟他和他父亲,谁大谁在下面,反复此过程顶部值是任意值,上面为堆进行重排(heapify):向下根本人两个节点的最大值比拟小就换下去,反复此过程堆两头值被批改: 如果改小了往下进行heapify 改大了网上进行heapInsert堆排序思路: 先将数组转成大根堆(heapInsert)每次把大根堆的顶点pop进来,把堆的最小点移到头上,进行heapify 源代码 引申浏览数据结构:堆(Heap)

August 16, 2022 · 1 min · jiezi

关于算法:个推漫话数据智能-天才基本法中的贝叶斯网络及原理解读

最近的热播剧《蠢才基本法》中,提到了很多乏味的数学知识点,比方“亲和数”“巴什博奕”“孔明棋”“七桥问题”等等,让很多观众直呼不明觉厉。其中,最让Mr.Tech感兴趣的是剧中男女主加入数学建模大赛时用到的贝叶斯网络。 ▲女主应用贝叶斯网络进行算法建模,来预测嫌犯口头轨迹和抓捕工夫方位。图片截图自电视剧《蠢才基本法》  贝叶斯网络是一种分类算法,被宽泛地利用于医疗诊断、风控等业务场景中,并施展着重要作用。对于“贝叶斯网络”,你理解多少?明天个推就和大家一起走进机器学习畛域,独特学习这个神奇的算法模型。  一、走进贝叶斯网络生存中,人们往往会从最终的后果反向揣测其起因,从而更好地做危险躲避,或提前发明充分条件以达成预期指标。不过事物之间的分割往往盘根错节,咱们如何抽丝剥茧,清晰剖析出事件和事件之间的相互依赖关系?是否有可能通过数学的形式来计算和掂量其中的因果作用,帮忙咱们追溯甚至预测事物的走向?贝叶斯网络就是当下数据科学家和算法工程师用来解决此类问题的一种无效形式。  贝叶斯网络(bayesian network)是形容随机变量(事件)之间关系的模型。例如,贝叶斯网络能够示意疾病和症状之间的概率关系。依据症状,该网络能够计算各种疾病存在的概率。 贝叶斯网络用有向无环图(Directed Acyclic Graph,DAG)示意,其中每个节点代表一个随机变量,节点间的分割用有向箭头示意,箭头从“因节点”指向“被影响节点”,用条件概率表白关系强度。 事实中,医生的诊断过程和贝叶斯网络的推理机制高度一致。如上图,如果患者咳嗽十分重大,甚至呈现气急、呼吸不畅等症状,医生联合雾霾天气、患者的吸烟史等状况,初步判断患者可能得了肺炎。接下来医生会要求患者拍肺部的X光片,依据患者的X光片体现,做出更加迷信的诊断论断。 目前,很多医疗辅助零碎正是基于贝叶斯网络,将过往的医学诊断教训很好地积淀下来,实现智能诊断,帮忙医生大幅晋升诊断效率。 接下来,咱们再深刻理解更深层次的问题:贝叶斯网络如何量化和计算事件之间的因果/条件依赖关系?在上述案例中,雾霾、吸烟、过敏、病菌感化等都是导致患者得肺炎的危险因子。那么哪一个危险因子的影响作用最大?这就须要咱们了解贝叶斯网络的底层数学思维——贝叶斯定理。  二、贝叶斯网络与贝叶斯定理贝叶斯定理由英国驰名数学家托马斯·贝叶斯提出,它是对于条件概率的定理,公式如下: 依据高中的概率论常识来了解贝叶斯公式:P(A), P(B) 示意事件 A 和事件B的独立产生概率。P(A|B) 是个条件概率,示意当事件 B 产生的状况下,事件A产生的概率。P(B|A) 也是个条件概率,示意当事件 A 产生的状况下,事件B产生的概率。  贝叶斯定理中有先验概率和后验概率之分。 先验概率:指依据以往教训和统计分析失去的概率。是在“后果”产生之前的概率,比方公式中的P(A)就是先验概率。先验概率个别作为“由因求果”问题中的“因”呈现。 后验概率:是依据察看到的样本修改之后的概率值。指在后果产生之后,咱们依据“后果”来计算和剖析最有可能导致该后果的起因,即“执果寻因”中的“因”。公式中的P(A|B)就是后验概率。  接下来,咱们将方才提到的医疗诊断实例简化,来进一步了解贝叶斯定理。  假如(先验概率均为假如数据):患者病菌感化的概率P(V ) = 5%患者感冒的概率P(C ) = 30%患者因为病菌感化而感冒的概率P(C|V) = 40% 那么:依据贝叶斯定理,感冒患者被病菌感化的后验概率P(V|C) = P(C|V)P(V) / P(C) = 40%5% / 30% ≈66.67% 再简单一些。  假如(先验概率均为假如数据):患者发热的概率P(F) = 6%患者因为感冒而发热的概率P(F|C) = 60%那么:患者因为病菌感化而发热的概率P(F|V) = P(C|V) * P(F|C) = 24%那么:依据贝叶斯定理,发热患者被病菌感化的后验概率P(V|F) = P(F|V)P(V) / P(F) = 24%5% / 6% =20%  ...

August 16, 2022 · 1 min · jiezi

关于算法:CMPUT-379Objectives

Copyright Notice: Copyright by CMPUT 379. All rights reserved. Do not post any part on apublicly-available Web site.CMPUT 379 - Assignment #3 (10%)Communicating Peer Processes using TCP Sockets and FIFOs (first draft)Due: Monday, March 21, 2022, 09:00 PM(electronic submission)ObjectivesThis programming assignment is intended to give you experience in developing client-server programsthat utilize TCP sockets for communication over the Internet, FIFOs for communicationamong peers, and I/O multiplexing (select or poll) for nonblocking I/O.DetailsIn this assignment, you are asked to write a C/C++, called a3w22, that implements the transactionsperformed by the simplified hypothetical data center network described in Assignment 2. As inAssignment 2, each switch communicates with its neighbour switches using FIFOs. However,unlike Assignment 2, the packet switches communicate with the master switch over TCP sockets.The program can be invoked as a TCP server (simulating a master switch), or a TCP client (simulatinga packet switch) using:% a3w22 master nSwitch portNumber% a3w22 pswi dataFile (null|pswj) (null|pswk) IPlow-IPhigh serverAddress portNumberwhere, in addition to the command line arguments in Assignment 2, the program uses the followingarguments:• portNumber specifies the TCP port used by the server to listen to incoming connections.(To minimize the chance of port number conflicts when running servers in the lab, use portnumber 9xxx where xxx is the last 3 digits of your student ID number.)• serverAddress is the IP address of the server’s host specified either as a symbolic name(e.g., ui11.cs.ualberta.ca, or localhost), or in dotted-decimal notation (e.g.,127.0.0.1).Features from Assignment 2Your a3w22 program should implement the following features (detailed in Assignment 2). ...

August 16, 2022 · 7 min · jiezi

关于算法:COMP0050类型系统

COMP0050 AssignmentDataDownload from moodle the file COMP0050CourseworkData.zip.This contains two datasets:1- peerToPeerLoans.csv: The data come from George, N. (2018) (AllLending Club loan data version 6, February 2018, www.kaggle.com/wordsforthewise/lending-club). This is a subset of thedatasets used in Turiel, J. D., & Aste, T. (2020). The variable ofinterest is charged_off, which takes value 1 if a debtor is not repayingthe loan (0 otherwise).2- stockReturns.csv: this dataset contains 500 daily percentage stockreturns for 50 assets. ...

August 16, 2022 · 2 min · jiezi

关于算法:DATA3888源码解析

DATA3888 (2022): Assignment 1Instructions Your assignment submission needs to be a HTML document that you have compiled using R Markdown.Name your file as SIDXXX_Assignment.Rmd" where XXX is your Student ID.Under author, put your Student ID at the top of the Rmd file (NOT your name) .For your assignment, please use set.seed(3888) Do not upload the Rmd file (i.e. the code file).You must use code folding so that we can inspect your code where required.Your assignment should make sense and provide all the relevant information in the text when the codeis hidden. Don’t rely on the marker to understand your code.Any output that you include needs to be explained in the text of the document. If your code chunkgenerates unnecessary output you can suppress it by specifying results=‘hide’ in the chunk options.Start each question in a separate section.Question 1: Brain-boxA physics instructor Louis has created a data set stored under “Spiker box Louis.zip” that has a seriesof sequences of varying lengths. The file name determines the eye movement. For example the file ‘LRLL3.wav’ corresponds to left-right-left eye movements; the file LLRLRLRL_L.wav corresponds to left-left-rightleft-right-left-right-left‘eye movements. There are a total of 31 files. Build a classification rule for detecting{L, R} under streaming condition where the function will take a sequence of signal as an input.• (i) Estimate the accuracy of your classifier. Is your value reasonable?• (ii) Does the length of the sequence impact on the classification accuracy?Hint: (a) Consider what metric you will use to define “performance”? You will need to explain your choiceand justify your answer.dir("data/Spiker_box_Louis/Short") ...

August 16, 2022 · 4 min · jiezi

关于算法:完全背包转化为多重背包

齐全背包转化为多重背包前言在本篇文章当中次要给大家介绍如何将齐全背包问题转化成多重背包问题,在后面的文章齐全背包当中,咱们认真的介绍了齐全背包的状态转移方程、依据状态转移方程如何实现代码以及多重背包的数组优化的原理,为什么这种优化可能无效!本篇文章次要专一于如何将齐全背包转化成多重背包。如果你还不理解多重背包能够先浏览深刻分析多重背包问题(上篇)和深刻分析多重背包问题(下篇)。 齐全背包问题有$N$种物品和一个容量是 $V$的背包,每种物品都有有限件可用。第$i$ 种物品的体积是 $v_i$,价值是$w_i$。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。齐全背包问题和01背包的惟一区别就在于物品的个数,在01背包当中所有的物品只有一件,也就只能应用一次。而在齐全背包当中物品能够应用有限屡次。 比方上面的4个物品,背包可能接受的最大分量为5,咱们应该如何抉择,使得咱们取得的总价值最大: 物品分量价值A12B24C34D45这个问题还是比较简单,咱们间接从图中看,咱们能够抉择五个A或者两个B一个A,能够产生最大的收益,最大收益为10。 动静转移方程在后面的文章齐全背包当中咱们认真介绍了齐全背包的动静转移方程。咱们用一个二位数组dp[i][j]示意当只应用前i个物品且背包容量为j的时候,咱们可能获取的最大的收益。 和01背包问题一样首先对于第i个物品,首先须要判断背包是否可能包容(v[i]示意第i件物品的体积,w[i]示意第i件物品的价值): 如果背包的容量大于等于第i个物品的体积,那咱们就有两种抉择: 将第i个物品放入背包当中,然而在这里须要留神的一点是齐全背包的物品有有数件,因而当咱们抉择之后咱们的转移方程为dp[i][j - v[i]] + w[i],这里不是i-1而是i,因为第i件物品有有数件。不将第i个物品放入背包当中,那么咱们就可能应用容量为j的背包去抉择前i - 1个物品,这种状况下咱们的最大收益为dp[i - 1][j]。如果背包容量小于第i件物品的体积,咱们就不可能抉择第i件物品了,这种状况下咱们的最大收益为dp[i - 1][j]。基于下面的剖析咱们能够晓得齐全背包问题的动静转移方程为: $$dp[i][j] = \begin{cases}max(dp[i][j - v[i]] + w[i], dp[i - 1][j]), j \ge v[i]\\dp[i - 1][j] , j \lt v[i]\end{cases}$$ 依据下面的状态转移方程,咱们的外围代码如下(其中N示意物品的个数,V示意背包的容量,w[i]示意第i个物品的价值,v[i]示意第i个物品所占的体积): int backpack() { for (int i = 1; i < N; ++i) { for (int j = 0; j <= V; ++j) { if (j >= v[i]) { dp[i][j] = max(dp[i - 1][j], dp[i][j - v[i]] + w[i]); } else { dp[i][j] = dp[i - 1][j]; } } } return dp[V];}然而下面的代码咱们能够进行数组优化,优化之后的代码如下(如果你还不是很分明优化原理的话,你能够浏览齐全背包当中的数组优化大节): ...

August 15, 2022 · 2 min · jiezi

关于算法:哈啰顺风车智能交易体系建设下

本次跟大家分享的是哈啰逆风车智能交易体系建设。上篇,咱们介绍了哈啰逆风车的业务背景和智能利用中的订单匹配。 算法利用订单匹配 首先介绍一下多任务模型,业务背景是咱们要做发完单的预测,预测的越准,做排序的时候也就越准。但在做发完单预测的过程中,咱们的数据量是绝对无限的,之前讲了因为咱们是一个漏斗,在发单到接单的过程当中,会产生大量的数据,这部分数据实际上是失落的。如果可能把这部分数据用上的话,对进步咱们模型的性能会有帮忙。所以咱们依据这个状况,设计了一个双塔构造的模型,咱们把发单和接单模型训练成了独自的模型,相当于是一个辅助的工作和主工作拼接在一起进行训练。这样训练后的模型,就可能利用更多的数据,当然过程中咱们也设计了一些定制化的损失函数。通过这样的办法训练下来,咱们给这个模型起了个名字叫WDMM模型,它比Wide&Deep模型效率晋升了2.65%。 接下来介绍一下实时序列模型,咱们对司机的行为模式进行辨认,司机根本能够分为职业司机和非职业司机,但实际上司机还有很多不同的状态,所以咱们对司机在地图上的各种流动,把他的行为序列做了向量化。咱们应用 Attention的交互去做,把它映射成了一个向量,而后把这个向量和其余的特色拼接起来,再放到模型外面去,这样就可能更好的去体现司机的行为模式。最初咱们去跟Wide&Deep模型比拟,能够看到效率晋升了3%。 接下来介绍一下策略优化,是顺路度的革新。在咱们的举荐列表上是有一些顺路度的,它间接显示在下面,会对司机的接单决策产生影响。起初的顺路度是天文上的顺路度,能够看到右边的图是某竞品APP的顺路度,顺路度显示的都是一样的,这样就不能疏导点击举荐列表上最高位的那一个,而举荐列表上最高的那一位才是完单概率最高的。所以依据这个状况,咱们就对物理的顺路度进行了一些革新,融入了更多与完单概率相似的一些因子,比方工夫是否匹配,接驾的终点起点是否匹配,以及把共享里程与绕路度都加进去了。做完了之后,咱们能够看到顺路度的逻辑基本上与举荐列表的逻辑是统一的,这样能晋升司机的决策信念,大盘的增幅超过了5%。 接下来介绍一下召回,方才也提到了跟其余广告零碎去比拟的话,咱们召回的特点首先是实时性,就是咱们须要实时计算门路等信息。第二个特点是同质性,与视频网站能够给用户举荐不同性质的视频不同的是,咱们的零碎推的基本上是订单,类型并不会有太大的差异。第三是均匀数量适中,数量差别大。召回是举荐的底盘,所以咱们会依据找到的问题,制订不同的应答办法。第一点是因为咱们是实时计算的,所以不可能做向量化。第二点是咱们能够依照地理分布、工夫散布等策略形式进行召回。第三点是范畴能够适度进行扩充,此外不同的城市会进行不同策略的召回。总体来说召回就是尽量多的把想要召回的召回,如果召回太多,性能又会受不了,所以咱们须要去预判什么样的状况性能还能接受。在咱们做了一些召回策略上的调试之后,大盘会有2%左右的晋升。 最初是咱们订单匹配的工程计划,咱们要实现这样的计划还须要依赖一些工程能力。之前提到咱们工夫的要求十分高,这里依赖了搜索引擎的算法插件零碎和高性能Rank Service零碎,此外还要依赖司乘同显服务的能力。由算法和工程的一些底层能力,独特形成了这样的一套计划,可能帮忙咱们实现订单匹配的工作。 营销和定价 咱们的定价形式有根底定价、城市差别定价、感知竞对变动,最终咱们心愿可能做到智能定价。当初咱们根本还在第二个阶段,也就是城市差别定价。影响的因素首先是供需,能够看到价格一直进步的话,我的需要就会升高,供应就会减少。咱们进行不合理的定价和最正当的定价,产生的业务量是不一样的。另外一个因素是竞争,咱们的竞争对手给市场定下的价值,也会造就市场上司机和乘客的意识,对咱们也是有影响的。此外工夫地点对咱们也是有影响的。 定价完了之后,咱们把定价和营销放在一起来说,营销实际上也是做了定价的工作。咱们能够看到上图,咱们补贴了一些金额让需要曲线往上挪动。在给乘客进行补贴的时候,咱们取得了业务量的减少。具体到一次营销流动,咱们能够看到算法策略的价值比经营策略的价值高一些,也就是咱们营销所带来的增量的价值,这就是咱们的背景。 接下来介绍一下智能定价,这里的智能定价实际上也是一种营销。咱们并没有同时对两边进行调整,而会把当中的差额本人提供补贴给用户,所以它也是一种营销。实际上这是在打车业务里去做的,跟逆风车相似,咱们心愿在业务的场景里去放弃每个区域外面的供需的比例基本一致。所以咱们会去发现供需失衡的场景,而后再圈选哪些人须要进行补贴,并对他进行个性化的补贴。能够看到在这种状况下,算法是做了差异化的策略,如果没有做差异化的策略,它的钱效就会低30%,这也是咱们的算法带来的增量。 接下来是智能营销的利用,其实它就是要保护咱们司乘全生命周期的过程,尽量多的让更多的司机和乘客在咱们的零碎里,咱们有拉新、促活、防散失、散失挽回这样的过程。对于新司机如何开掘,如果新司机注册了想要激活,那就有新车主的奖励金。如果你曾经变成新车主了,咱们有司机多单任务,晋升司机在平台的实现工作的数量。如果他要散失了,咱们会进行返现,或者对他做一些散失召回。对于乘客也是相似的,在他的生命周期中进行一些触达以保护乘客。 最初是咱们的智能营销计划,次要用到了response模型、uplift模型和运筹优化。咱们要做的事件就是决定在什么工夫,对哪些人做什么样的营销流动,并且要满足咱们估算的要求。目前咱们的营销效率绝对于经营来说,整体晋升的效率在20%左右。 智能仲裁 智能仲裁咱们目前并没有大规模的应用,但模型实际上曾经上线。在业务中,咱们的用户会产生一些投诉的状况,当投诉产生的时候,他就会把 Request发到咱们智能判责的引擎外面。智能判责引擎是依据历史情绪反馈的正负样本去进行建模的,就是以往产生了投诉之后,咱们判责的案例就会作为正负样本,到底是司机有责还是乘客有责,咱们会把路上的一些轨迹信息、录音的信息、用户和司机历史的状况,各种各样的行为都作为特色放到这个模型外面进行训练,构建出了这样的一套模型,会主动对一些比拟显著的案例进行判罚,如果是十分不确定的话,就会给到客服那边。 接下来介绍一下智能仲裁的典型场景,比方咱们判责的利用有车主催车费判责,是因为咱们车主有很多曾经到了起点,然而乘客没有点击界面上的曾经达到起点。这个时候咱们以往的做法就是要隔很长的工夫,才会把款打给车主,会引发车主的情绪。这种状况产生,咱们能够依据轨迹的信息进行判责,看是否他曾经把乘客送到起点,曾经有的话就能够把钱款尽早打给司机,这样就能够缩小投诉率。相似的也有司机早退判责等。这类问题都存在一些共性的问题,比方打标数据难以获得、成果难以验证、和次要业务指标抵触。比如说进行处罚之后,他可能就不能完单,这对业务会有负面作用。如何去均衡用户体验和业务增长的指标,须要多与业务和产品进行探讨。 办法总结算法我的项目的推动形式 首先要更正当的定义问题,就是咱们要预测的是什么,咱们的业务指标是什么。这里有一个例子,比方咱们要去晋升大盘完单完单率,但如果接完率有进步,发完率有升高,这种状况下它有很多的两头指标,有可能最终的指标是没有晋升的,然而两头指标有晋升,咱们怎么样去发现更多的有意义的价值,可能从外面提炼进去,这也是十分重要的。定义好问题之后,接下来是更正当的利用数据。这里须要domian、expert输出,就是业务同学的很多教训对咱们是有用的,比方方才提到的职业司机和非职业司机,实际上也是来源于咱们业务的教训,他会对咱们的司机群体的个性有一些判断,这些都可能帮忙咱们去构建构建一些特色和数据。第三步是抉择更适合的模型和策略。基本上对于咱们的模型来说,缩小了偏差和方差这两种谬误。咱们的模型要选树模型、深度模型、多任务模型等就会绝对独立一点。然而后面两步如果咱们做的不好,即便前面做的再好,算法也会呈现一些问题。 MLOps实际 MLOps就是咱们整个训练中怎么流程化、复用、可重现,部署上怎么进行模型治理、注册、上线,运维上咱们怎么样可能追踪过程中的指标,比如说用户数、提早,以及咱们怎么样可能告警,比如说线上业务有模型、数据的漂移,怎么样可能及时发现。还有自动化,指的是咱们的模型怎么样可能依据不同的状况,阈值有不同的变动。这里有一篇2015年的论文,讲的是机器学习零碎外面一些隐形的技术栈,机器学习的code实际上只是整个机器学习解决方案code外面很小的一块,在咱们四周实际上还有大量的代码,比如说数据怎么样收集、特色怎么样提取、数据怎么校验、机器资源怎么监控,怎么样去剖析、流程怎么治理、上线之后底层的服务怎么样去监管,以及整个服务的运行状态怎么样去监控,这些在以前并没有系统地去进行治理,但实际上咱们整个模型上线之后,它呈现了种种问题,最终都会反馈到咱们这里来。所以这也迫使咱们必须做好这些事件。拿告警来说,咱们以前可能没有留神到会产生一些问题,比如说做营销的时候,补贴可能很快就发完了。咱们也不晓得呈现了什么样的问题,可能就是上游的数据一个字段没有传过来,这就阐明数据产生了一些漂移。起初咱们就加了一些监控,就看咱们模型每天数据的auc是否有大幅的稳定,如果有大幅的稳定就阐明可能数据有了问题,或者模型有了问题。模型漂移的问题就阐明咱们用户的群体可能不一样了,用户的行为模式就会不一样,所以咱们这个模型也须要主动地去更新,主动地去反抗市场的变动。这些基本上在咱们的订单匹配零碎里都做到了,咱们的模型每个星期都会主动去进行训练,会和最新训练的数据去进行验证,auc进行比拟,更好的模型才会主动上线。 最初总结一下,本次分享首先是对逆风车业务进行介绍,包含订单匹配、营销定价和仲裁。并且依据这几个方向做了几个利用,包含智能订单匹配、智能营销定价和智能仲裁。最初介绍了两个教训,包含我的项目推动的形式和MLOps实践经验。 (本文作者:王凡) 本文系哈啰技术团队出品,未经许可,不得进行商业性转载或者应用。非商业目标转载或应用本文内容,敬请注明“内容转载自哈啰技术团队”。

August 15, 2022 · 1 min · jiezi

关于算法:BAT大牛亲授-个性化推荐算法实战内附资料文档

BAT大牛亲授 个性化举荐算法实战内附材料文档下载地址:百度网盘从零开始自己动手写自旋锁咱们在写并发程序的时候,一个非常常见的需要就是保障在某一个时刻只有一个线程执行某段代码,像这种代码叫做临界区,而通常保障一个时刻只有一个线程执行临界区的代码的方法就是锁。在本篇文章当中咱们将会认真分析和学习自旋锁,所谓自旋锁就是通过while循环实现的,让拿到锁的线程进入临界区执行代码,让没有拿到锁的线程一直进行while死循环,这其实就是线程自己“旋”在while循环了,因而这种锁就叫做自旋锁。原子性在谈自旋锁之前就不得不谈原子性了。所谓原子性简略说来就是一个一个操作要么不做要么全做,全做的意义就是在操作的过程当中不能够被中断,比方说对变量data进行加一操作,有以下三个步骤: 将data从内存加载到寄存器。将data这个值加一。将失去的后果写回内存。 原子性就示意一个线程在进行加一操作的时候,不能够被其余线程中断,只有这个线程执行完这三个过程的时候其余线程才能够操作数据data。咱们现在用代码体验一下,在Java当中咱们可能使用AtomicInteger进行对整型数据的原子操作:import java.util.concurrent.atomic.AtomicInteger; public class AtomicDemo { public static void main(String[] args) throws InterruptedException { AtomicInteger data = new AtomicInteger();data.set(0); // 将数据初始化位0Thread t1 = new Thread(() -> { for (int i = 0; i < 100000; i++) { data.addAndGet(1); // 对数据 data 进行原子加1操作 }});Thread t2 = new Thread(() -> { for (int i = 0; i < 100000; i++) { data.addAndGet(1);// 对数据 data 进行原子加1操作 }});// 启动两个线程t1.start();t2.start();// 等待两个线程执行实现t1.join();t2.join();// 打印最终的后果System.out.println(data); // 200000}} ...

August 14, 2022 · 1 min · jiezi

关于算法:MindSpore强化学习基础蒙特卡洛Monte-Carlo

在接触强化学习过程中,大家可能在很多场合据说蒙特卡洛这个词,例如Monte Carlo Tree Search,Monte Carlo CFR。理论即使在策略梯度(Policy Gradients)算法中也应用了蒙特卡洛办法,本文将介绍Monte Carlo算法和在强化学习中的利用。基本概念Monte Carlo办法源于20世纪40年代,由冯.诺依曼,斯塔尼斯拉夫·乌拉姆在核武器钻研过程中提出。和许多以作者名字(如拉格朗日定理,柯西定理)命名不同,Monte-Carlo其实并不是某位学者名字,实际上是一座位于摩洛哥的赌场。统计和概率学常常会将概率和博彩分割在一起,或者某天也会呈现澳门葡京办法/定理Monte Carlo实质上是一种统计学办法,这类办法通过随机抽样,依据随机事件呈现的频率来估算随机变量的特色大家小时候都学过撒豆子估算不规则图形的面积,应用一个规定图形包裹不规则图形,而后将肯定数量的豆子平均的洒向这个图形,通过计算不规则图形中豆子比例和规定形态的面积,即能够估算出不规则形态的面积。随着计算机技术产生,撒豆子被随机数代替,这一类办法也被各个领域宽泛应用。如果咱们并不知道圆形面积计算公式,假如圆形半径为1,咱们应用变长为2的正方形包裹这个圆形,而后平均采样,随着样点数量的减少,圆形面积将越来越靠近理论值from math import sqrt, pifrom random import uniform 正方形边长和面积side_length = 2.0square_area = side_length * side_length 圆形半径radius = side_length / 2 def in_circle(x, y): return sqrt(x x + y y) < radius num_sample = 10000000num_in_circle = 0for i in range(num_sample): x = uniform(-1, 1) y = uniform(-1, 1) num_in_circle += in_circle(x, y) 落入圆形的样点个数ratio = num_in_circle / num_sample 圆形面积circle_area = ratio * square_areaprint('circle area: {}, theory area: {}'.format(circle_area, pi radius radius))执行后果circle area: 3.1413452, theory area: 3.141592653589793强化学习中的利用根底利用在深度学习和强化学习畛域中,许多算法实际上应用了Monte-Carlo办法,并没有给它冠名。这些算法如此根底,咱们常常会疏忽它的存在。例如因为计算资源受限,深度学习把一个批次样本的梯度作为整体梯度的预计,来更新模型的权重,同时通过屡次采样(迭代次数,或者step数)修改偏差。经典的强化学习算法中,无论Q-Learning还是Policy Gradient算法中,都须要估算累计收益,例如多步TD TargetMonte-Carlo Tree Search蒙特卡洛树搜寻蕴含两层含意,首先它是一种树搜寻办法,和深度优先、广度优先搜索算法相似,它须要对树进行遍历。其次蒙特卡洛强调了它并不是一种确定性的搜索算法,而是通过启发式的形式,让树向着最优解方向成长,升高搜寻空间,实现了相似剪枝的性能。具体流程如下:抉择(Selection): 从根节点开始,通过UCT(Upper Confidence Bounds to Trees)办法向下直至抉择出一个叶子节点。UCT办法对每个节点进行打分,通常蕴含利用-摸索两个重量。利用重量源于先验常识,例如之前仿真的后果,有时也会蕴含神经网络给出的评分;摸索重量个别和这个节点的拜访次数无关,如果节点拜访的越少,则摸索重量的值越大。扩大(Expansion):抉择完结之后,咱们失去一个叶子节点。当叶子节点曾经被充沛评估时,会在这个节点根底上拓展出一个新的叶子节点。评估是否充沛个别以这个叶子节点曾经被仿真过多少次来掂量。仿真(Simulation):从叶子节点开始游戏,直至游戏完结。反向流传(Back Propagation):仿真完结后,咱们会失去本次模仿的后果,拿这个后果刷新沿途节点分值。Monte-Carlo CFRCFR算法须要对博弈树进行遍历,从而计算某个动作的遗憾值。当博弈树规模十分大时,遍历整棵树的老本十分高,改良的办法:在单局博弈中,对动作进行剪枝。例如在某个信息集上,所有非法的动作有M个,算法人为的限度它的搜寻为N,N的数值还能够随着遍历层级的加深而缩小;作为补充,算法须要减少博弈的次数,尽可能笼罩更多的动作 ...

August 11, 2022 · 1 min · jiezi

关于算法:新特性解读-MySQL80-ALTER-TABLE-…-ALGORITHMINSTANT

作者:张娜 爱可生南区DBA组成员,负责MySQL、TiDB日常保护、故障解决。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 一、前言MySQL 8.0.29之前,在线 DDL 操作中即时增加列只能增加在表的最初一列,对于在某个具体列前面疾速增加列很不不便,MySQL 8.0.29 扩大了对 ALTER TABLE … ALGORITHM=INSTANT 的反对:用户能够在表的任何地位即时增加列、即时删除列、增加列时评估行大小限度。 每次即时增加或删除列都会创立一个新的行版本。MySQL 8.0.29 在 INFORMATION_SCHEMA.INNODB_TABLES 表中增加了一个新的列 TOTAL_ROW_VERSIONS 列来跟踪行版本的数量,每个表最多容许 64 行版本。 另外 XtraBackup 8.0.29 在备份 MySQL 8.0.29 时会有个小插曲,这个小插曲就跟 ALTER TABLE … ALGORITHM=INSTANT 无关。接下来咱们来一一体验一下。 二、新个性体验:首先创立一张2千万的表 sbtest1 : sysbench ./oltp_read_write.lua --mysql-host=10.186.61.168 --mysql-user=root --mysql-password='XXXXXX' --mysql-port=3388 --mysql-socket=/data/mysql8.0.29/data/mysqld.sock --mysql-db=test_a --tables=1 --table-size=20000000 --report-interval=2 --threads=10 prepare1、任一地位即时增加列原始表构造如下: 在表sbtest1任一地位即时增加列:k列前面增加k2列: mysql> ALTER TABLE sbtest1 ADD COLUMN k2 int(10) AFTER k,ALGORITHM=INSTANT; 能够看到,2千万的表在任一地位即时增加列在秒级内实现。 而在8.0.29之前的版本,仅反对在表最初一列即时增加列,不反对在表任一地位即时增加列,如下8.0.27中操作: 能够看到,同样2千万行的表通过默认的ALGORITHM在任一地位添列耗时7分22秒,而ALGORITHM=INSTANT仅反对默认在最初一列即时增加列。 2、即时删除列MySQL 8.0.29 开始,ALTER TABLE … ALGORITHM=INSTANT反对删除某列。如下先增加两列,再删除两列: ...

August 11, 2022 · 3 min · jiezi

关于算法:CIKM-2022-AnalytiCup-Competition-联邦异质任务学习

简介:为了摸索联邦学习中的异质性,推动联邦学习畛域的倒退,阿里巴巴达摩院智能计算实验室联结天池举办“CIKM 2022 AnalytiCup Competition: 联邦异质工作学习”大赛,期待借助本次较量助力突破事实利用中的“数据孤岛”,推动实现数据价值的共享。CIKM 2022 AnalytiCup Competition: 联邦异质工作学习联邦学习(Federated Learning)是一种新的机器学习范式,容许多个参与者在不间接分享各自数据的前提下独特训练机器学习模型。其外围挑战是如何应答参与者之间的异质性(Heterogeneity),其中数据分布的异质性(non-IID)已引起了钻研界的宽泛关注,并疾速成为了联邦学习畛域的钻研热点之一。然而,在联邦学习的许多理论利用中,联邦工作参与者之间的异质性往往更加简单,也更具挑战性:不仅仅是数据分布,甚至参与者的工作都会呈现出较大的差异性。例如,在一个分子图的联邦学习工作中,某些参与者的指标是对分子的类型进行判断,即分类工作,另外局部参与者的指标是预测分子化学性质的强弱,即回归工作。在这种工作场景下,尽管参与者都要求训练失去的模型具备对分子图表征的理解能力,然而其具体的学习指标是齐全不同的,相比数据分布的异质性更具挑战性。 为了应答联邦学习在事实利用中遇到的上述挑战,阿里巴巴达摩院智能计算实验室提出了一种新的联邦学习设定:联邦异质工作学习(Federated hetero-task learning)。相比于传统的联邦学习,这一设定激励研究者将联邦学习与多任务学习(Multi-task learning)、模型预训练(Model pre-training)、主动机器学习(Auto-ML)等不同畛域的钻研概念进行交融,从而买通事实利用中的“数据孤岛”,并最终实现数据价值的共享。与此同时,达摩院智能计算实验室设计实现了开源的联邦学习平台——FederatedScope[1,2],来帮忙钻研人员更加容易地摸索、设计、实现联邦异质工作学习算法,并进行充沛地验证。 同时,阿里巴巴达摩院智能计算实验室联结天池举办“CIKM 2022 AnalytiCup Competition: 联邦异质工作学习”大赛,并筹备了丰富的处分,期待更多的同学可能独特参加到联邦异质工作学习的摸索中。 为了帮忙参赛者可能尽快上手,咱们筹备了一个具体的教程,并提供了一个能够间接应用的playground供参赛者应用。 较量官网网址:https://tianchi.aliyun.com/competition/entrance/532008/introductionFederatedScope开源联邦学习平台:https://github.com/alibaba/FederatedScope较量奖金: 第一名:5000 USD第二名:3000 USD第三名:1500 USD第四至十名:各500 USD较量证书: 第一至二十名:排名证书其余:参赛证书较量工夫安顿(所有工夫以截止日期的UTC工夫11:59PM计算) 2022年07月15日:较量开始,数据集和代码凋谢下载。论坛和较量排行榜开始更新。2022年09月01日:较量注册完结。2022年09月11日:预测后果提交截止。2022年09月12日:主办方进行代码审查,排行榜前30名的队伍将主动进入代码审查阶段。2022年09月18日:颁布代码审查后果。2022年09月21日:颁布"CIKM 2022 AnalytiCup Competition"后果。2022年10月17日:CIKM 2022会议开始。援用FederatedScope: A Flexible Federated Learning Platform for Heterogeneity. arXiv preprint 2022. pdfFederatedScope-GNN: Towards a Unified, Comprehensive and Efficient Package for Federated Graph Learning. KDD 2022. pdf版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

August 10, 2022 · 1 min · jiezi

关于算法:极客拉钩算法突击训练营内置文档资料

download:极客拉钩算法突击训练营内置文档资料用Flexbox和Grid使网页页脚保持在页面的底部如果你次要是处理SPA开发,你可能会困惑为什么这个问题仍然存在,但它仍然有可能找到你的页脚沉没起来的原因: 登录页面博客/新闻文章(没有广告...)流程的间歇性页面,如确认口头产品列表页日历事件的细节 有两种方法可能用古代CSS来处理:flexbox和grid。这里是演示,默认为flexbox方法。如果你打开完整的Codepen,你可能将$method 变量换成grid ,以查看该代替打算。持续浏览演示,了解每种方法。Flexbox方法#这种方法是通过定义来实现的。body { min-height: 100vh; display: flex; flex-direction: column;} footer { margin-top: auto;} / Optional /main { margin: 0 auto; / or: align-self: center / max-width: 80ch;}复制代码它是如何工作的#首先,咱们确保body 元素将至多拉伸到屏幕的全副高度,min-height: 100vh 。如果内容较短,这将不会触发溢出(例外:某些移动阅读器),它将容许内容根据需要持续拉伸高度。设置flex-direction: column ,可能在保留重叠的块元素方面保持失常文档流的行为(假设body 的间接子元素确实都是块元素)。Flexbox的劣势在于利用了margin: auto 的行为。这个怪异的技巧将导致边距填补它所设置的我的项目和它在相应方向上最近的兄弟姐妹之间的任何空间。设置margin-top: auto ,可能无效地将页脚推到屏幕的底部。骗局#在演示中,我在main 中增加了一个outline ,以证实在flexbox方法中,main 元素并没有填补高度。这就是为什么咱们必须使用margin-top: auto 的技巧。这对你来说不可能有什么影响,但如果有的话,请看网格方法,它可能将main ,以填补可用空间。网格方法#这种方法是通过设置实现的:body { min-height: 100vh; display: grid; grid-template-rows: auto 1fr auto;} / Optional /main { margin: 0 auto; max-width: 80ch;}复制代码它是如何工作的#咱们为这种方法保留了min-height: 100vh ,但咱们随后使用了grid-template-rows ,以正确划分空间。这种方法的怪招是使用非凡的网格单位fr 。fr 意义是 "分数",使用它申请阅读器计算出可用的 "分数 "空间,以调配给该列或行。在这种情况下,它填补了页眉和页脚之间的所有可用空间,这也解决了flexbox方法的 "陷阱"。哪个更好?#看到grid之后,你可能会有一霎时感觉它显然更胜一筹。然而,如果你在页眉和页脚之间增加更多的元素,你需要更新你的模板(或者确保总是有一个包装元素,如div ,以不影响任何嵌套语义/档次)。另一方面,flexbox方法可用于两头部分有多个块状元素的各种模板--例如,一系列的<article> 元素,而不是繁多的<main> ,用于存档页面。因此,与所有技术一样,这取决于我的项目 :)然而,咱们都可能批准,具备这些古代的CSS布局方法是很了不起的! ...

August 8, 2022 · 1 min · jiezi

关于算法:哈啰顺风车智能交易体系建设上

导读:7月22日,2022年GIAC寰球互联网架构大会在深圳顺利举办。哈啰高级算法专家王凡老师做了《哈啰逆风车智能交易体系建设》的主题分享。包含以下几大部分:业务背景介绍、智能利用、办法总结。 业务背景介绍公司背景介绍 哈啰从大家相熟的共享单车业务起步,逆风车业务上线已有三年多的工夫,在从无到有的过程中算法陪伴业务一起成长。“以技术驱动更正当的司乘匹配出行供需,为用户提供更值得信赖的拼车服务”提到的司乘匹配出行供需,实际上就体现出算法在产品当中的价值。 逆风车产品的根本流程 上图是逆风车产品中几个支流的页面。第一个页面是乘客发单,乘客会关上他的界面收回行工夫和目的地,这样就会产生一个订单,订单产生后咱们的零碎就会把订单推送到司机这边。司机在不同的场景下会收到不同的订单,如果司机有本人的路线,他就会收到跟路线比拟匹配的订单;如果司机没有本人的路线,他就会收到本人左近的订单。司机选好单后会去接单,最初就会完单。咱们次要的性能就是发单、接单和完单的过程,还有其余一些辅助的性能。实际上这个过程是一个漏斗,每一个步骤都是会有漏损的。关上APP的人必定是数量最多的,但不是所有关上的人都会发单,不是所有发完单的人都会被接单,不是所有接单的都能够完单。这当中的漏损是十分大的,咱们逆风车的产品就是要提高效率,把漏斗最上层的人尽量多完单。 要达成这一指标是非常复杂的,它的复杂性体现在哪里呢?第一个方面体现在内部的市场环境特地简单,逆风车业务是全国性的业务,各个城市的特点不同,还会受到天气等因素影响。第二个方面体现在它是波及到三方的,拿两轮业务来进行比照,它只波及到咱们的用户和平台这两方,但逆风车业务里有司机、乘客、平台这三方,很大水平上减少了问题的复杂性。第三个方面体现在决策环节多,逆风车业务除了有发单、接单和完单,还有很多干线的环节,比方用户发完单之后有可能勾销,司机接完单之后有可能感觉途程太远而勾销,还可能会产生一些投诉而造成散失,因而这当中的决策过程很多。最初一个方面体现在指标体系非常复杂,整个过程中咱们的指标是尽可能让更多人去完单,有可能咱们在做司乘匹配时因为效率优先,可能会疏忽一些用户的体验。 逆风车产品性能汇总 咱们把下面的这些问题汇总一下。最右边是市场环境,就是咱们讲的外部环境特地简单,逆风车产品的经营城市和竞争对手各种各样,司机群体和乘客群体的行为习惯也会不同,还会面临营销估算的限度,因而咱们在不同类型的城市投入的资源也会不一样,这些都是咱们逆风车交易系统的输出。而后乘客就会进行发单,发单后咱们有很多的决策环节,比方订单匹配、定价营销和仲裁,接着司机会完单。最初能够看到,咱们业务的后果也是简单的,包含平台完单量、平台支出、司机接复数、司机支出、乘客的留存率和投诉率。 逆风车问题拆解 咱们对整个过程进行了拆解,首先是订单匹配的问题。市场环境次要看人口个性、司机群体、乘客群体和竞争对手。在乘客发完单后,咱们须要做订单匹配,大家能够看到有一个列表,实际上它是一个举荐零碎。咱们须要对订单进行排序,排序之后司机从这个列表外面选出他最称心的去做完单,最初拿到的业务成果是订单的规模和交易的规模。 拆解的第二个问题是定价和营销,市场环境看司机的密度、乘客的密度、竞争对手和营销估算。输出交易系统后,咱们会在乘客发单前或发单后给到一些营销的办法,在接单的过程中会给到他一些定价。图中定价用红框标了进去,咱们能够实时给出价格,还会有一些实时优惠,这是由营销算法动静生成的。最初给到咱们的乘客之后,乘客用这个价格进行完单。这个场景业务后果是咱们平台的完单量、平台的支出、司机的支出和乘客的留存率。 拆解的最初一个问题是仲裁,也是咱们交易系统里比拟重要的一块。市场环境次要看司机群体和乘客群体,基本上咱们的仲裁都产生在司机和乘客之间,当然也有独自一方的状况。通常乘客在发单到完单的过程中会呈现一些问题,咱们就须要对呈现的问题进行判断,到底是谁的责任,也会做一些相应的解决。最终它会影响的业务后果就是用户的留存率和用户的投诉率这两个要害的指标。从短期的指标来看,咱们看到的是用户的投诉率,但长期来看的话就是用户的留存率。 定义智能利用 咱们对问题进行拆解之后,会依据不同的指标产生不同算法的利用。依据交易效率和业务规模,咱们推导出智能匹配的算法利用;依据支出治理,咱们推导出智能定价的利用;依据营销效率,咱们推导出智能营销的利用;依据用户体验,咱们推导出智能判责的利用。 对于形象的算法问题,咱们也有一套方法论。首先要对价值进行剖析,能够看到至多这里有四个我的项目去做,先做哪个后做哪个我的项目,咱们就须要对价值进行预估。总体来看,智能匹配的价值是最大的,所以咱们在下面最先进行投入,而且投入的工夫最长。从逆风车上线后的短时间内,咱们就开发了智能匹配的一套算法,始终迭代到明天,而且继续在给咱们的业务带来增量的价值。 一旦有了价值之后,咱们就须要对指标做一些量化,就是咱们怎么样去掂量这样的一套指标。比方说交易效率,咱们就定了发完率指标作为一个外围指标,发单的人到完单的人中转化效率越高,就代表交易效率更高。 接着咱们须要做问题的定义,是指咱们机器学习外面是什么样的问题,它是一个分类问题还是回归问题。最初咱们再小心地进行求证,就是说逐渐投入资源进行验证,咱们会尽量减小操作的半径,投入最小的人力把它的成果验证进去。如果能不必算法来验证,咱们会用一些策略来验证。 算法利用订单匹配 做智能订单匹配前,就像方才讲的那套方法论,咱们要掂量它的价值大不大。逆风车业务跟网约车不一样,它的特殊性决定了做举荐的空间很大。首先从时效性上,网约车个别咱们打了车马上车就会过去,而逆风车有可能是提前一两天打的,至多也是提前几个小时打的。咱们在做匹配的时候,匹配范畴就发的大。其次是从司机上,个别网约车的司机约束力是比拟强的,然而逆风车很多是第三方或私家车的司机,约束力就没有那么强。第三从价格上,逆风车的价格会更便宜。最初从体验上,逆风车会差一点,网约车服务的到位性会更高。 依据逆风车的特点,技术上还是存在很多挑战的。所以逆风车产品不是一个标准化的产品,它的特点就是不确定性高,司机提供的服务差别比拟大,用户的期望值也参差不齐。此外它的配对范畴大,不仅体现在工夫上也体现在间隔上。同时它存在着大量的未知因素,规定很难保障成果。 所以逆风车的技术机会就是好的匹配和不好的匹配策略产生的后果差别十分大,比方在打车外面咱们会把订单派给间隔最近的司机,这样一个简略的策略产生的后果也不会太差,但如果在逆风车这样的场景里,可能产生的后果跟最优的计划成果差距会十分大。另外机器学习也是长于从不确定性中去找到确定性。还有很重要的一点就是这个场景是业务的次要流程,它的后劲是十分大的,咱们的订单十分多,每一个订单都须要通过匹配,匹配的好坏对后果有十分重要的影响。 接下来咱们来看一下智能订单匹配零碎的架构。智能匹配实际上是一个简单的举荐零碎,须要用各种各样的数据,包含离线的数据,比方人口统计、接单偏好、聊天的记录、职业标签、历史完单目的地和轨迹信息。还有实时的一些数据,比方实时点击行为、实时轨迹、实时地块数据。这些都会被拿来用做特色,放到咱们的模型外面。模型作为一个举荐零碎,会有召回、排序和规定引擎这样的步骤,最初计算出一个后果并进行排序,这就是咱们的智能订单匹配零碎的架构。 逆风车的举荐零碎和广告的举荐零碎也会有一些差异。广告的举荐零碎是一个广告库,广告库外面有各种各样的广告,它的量级达到了百万级。首先做一个召回,而后把它放入到一个粗排模型外面,从召回到粗排大略就只剩下几千条或者几万条了。粗排之后会失去一个截断的后果,这个量级大概是几千条。接着就会进入到精排模型,对数千条选中的广告进行比拟精密的排序,它的耗时会比粗排模型的耗时更长。而后选中前几百个,再对他做一个截断,放到重排的策略外面去。重排会依据不同的指标,对它进行一些规定上的排序。最初会推送到用户的前端设施外面,数量在十条左右,这就是用户会看到的后果。它的特点是候选集的数量更大,能够离线计算。而逆风车的举荐零碎是不一样的,咱们有很多货色是要实时计算的。候选集的数量也很大,比如说一个司机当初要去接单,实际上他可能接的单是十分多的,所以召回的数量就须要咱们去用一些规定进行截断,大略有几万条这样的数据。而后咱们也会进行粗排,粗排之后要去对它进行一个排序,接着是重排,最初会有几十条数据显示给司机。与广告不同,逆风车的每一个订单都须要有终点、起点和门路布局,所以须要大量调用地图的服务,对性能也会有十分大的压力。 接下来介绍一下算法的摸索过程。咱们的迭代门路分几个阶段,逆风车业务刚上线的时候是没有算法接入的,起初是一个规定的版本,对每一个订单是否会被完单去进行预测。在这样的根底上,咱们首先做了算法化,因为须要疾速上线,所以咱们用的办法是比较简单的,次要用了线性模型和lightgbm这两种形式,在业务晚期的时候就实现了肯定的算法化,过后获得的成果还是比拟显著的。第二个阶段是在2020年到2021年间,咱们做了深度化的革新。随着数据越来越多,模型慢慢深度化,所以咱们的模型也越来越大,深度也越来越深。在咱们深度模型倒退的趋势里,Wide&Deep是一个重要的里程碑,在这个阶段咱们也把它利用到零碎当中,训练进去新的模型,它比以前的线性模型和树模型成果更好。基于Wide&Deep,咱们又去做了DeepFM和xDeepFM,都是业界比拟支流的模型,咱们都一个个去迭代和实现,带来了正向的成果。第三个倒退阶段是定制化,现有的模型曾经不能满足业务持续增长,所以咱们依据业务的特点设计了新的模型。这些模型不是通用的模型,在业界也不是通用的做法。这里咱们去进行了一些革新,依据数据的个性咱们做了实时序列模型,依据模型的构造革新咱们做了多任务模型,依据业务的策略咱们做了智能化的顺路度。通过这样的一系列革新,咱们累计给大盘的订单量晋升了超过20%,成果十分显著。 下篇将具体介绍订单匹配的排序模型、营销定价和智能仲裁,以及过程中办法经验总结。 (本文作者:王凡) 本文系哈啰技术团队出品,未经许可,不得进行商业性转载或者应用。非商业目标转载或应用本文内容,敬请注明“内容转载自哈啰技术团队”。

August 8, 2022 · 1 min · jiezi

关于算法:算法学习笔记-day1-位运算选择冒泡排序

视频源连贯抉择排序思路: 从数组索引0开始,找比以后值更小的值,找到即为最小值找到最小值后替换以后索引值以及最小值所在索引值反复遍历源代码:冒泡排序思路: 从数组索引0开始,只有以后值比他下一位值大,替换两者程序。反复遍历源代码:位运算a ^ b 雷同为0 不同为1位运算满足交换律和结合律 即: a^b = b^a; (a^b)^c = a^(b^c)0 ^ N = N; N^N = 0;位运算能够了解为二进制的不进位相加比方: 101 ^ 011 = 110;通过这个,能够进一步了解为什么满足交换律 因为无论多少个数字异或,那么雷同地位上是1 还是0 齐全取决于1 和0的数量,与程序无关所以反过来看冒泡排序中的swap,原理如下: 但值得注意的是,其中i和j不能是雷同值,雷同值相当于本人和本人异或 那么会清0 导致计算结果不精确。 提取一个数最右的1:int rightOne = eor & (~eor +1);原理如下: 思路:本人与本人取反加1;原题:数组中有两个数是奇数个,其余数为偶数个,找出这两个数: 插入排序思路: 从数组索引1开始,向前比拟找到适合的地位插入源代码: 相较于抉择和冒泡,插入排序最差是On^2 最好是On 依据数据状况来定,绝对性能较好 二分法常见问题: 有序数组 找某个数是否存在有序数组 找大于某个数最左侧的地位部分最小值一个arr中 任意两个元素相邻数肯定不相等,找任意一个部分最小值,部分最小为i 比i-1, 比i+1 都小。要求工夫复杂度好于On 最好用二分思路:解释:首先判断0 和 n是不是部分最小 不是的话那么0-1 肯定是大小向下的趋势,n到n-1肯定是向下的。那么1到n-1之间肯定有个最小值。所以这个时候你找m 如果不是的话m到m-1之间肯定是向下的那么m-1到1之间肯定存在最小值 生成0-n的随机数Math.random() => [0 - 1) 所有的小数Math.random() * N => [0, N) 所有小数parseInt(Math.random () *N)=> [0, N-1]所有整数 等概率返回解决理论问题的思路:1.数据非凡能够优化,2问题非凡能够优化

August 7, 2022 · 1 min · jiezi

关于算法:拉勾算法突击特训营3期百度云

download:拉勾-算法突击特训营3期【百度云】Java线程池Executor详解咱们最常使用的Executors实现创建线程池使用线程次要是用上述类图中提供的类。在上边的类图中,蕴含了一个Executor框架,它是一个根据一组执行策略的调用调度执行和管制异步工作的框架,目标是提供一种将工作提交与工作如何运行别来到的机制。它蕴含了三个executor接口: Executor:运行新工作的简略接口ExecutorService:扩大了Executor,增加了用来治理执行器生命周期和工作生命周期的方法ScheduleExcutorService:扩大了ExecutorService,反对Future和定期执行工作 线程池的好处 升高资源消耗-重用存在的线程,缩小对象创建、沦亡的开销,性能好提高响应速度 -可无效管制最大并发线程数,提高系统资源应用率,同时可能避免过多资源竞争,避免阻塞。当工作到达时,工作可不必等待线程创建就能立即执行提高线程的可管理性-提供定时执行、定期执行、单线程、并发数管制等功能。 new Thread的弊病 每次new Thread 新建对象,性能差线程不足对立治理,可能无限度的新建线程,相互竞争,可能占用过多的系统资源导致死机或者OOM(out of memory 内存溢出),这种问题的原因不是因为单纯的new一个Thread,而是可能因为程序的bug或者设计上的缺点导致不断new Thread造成的。缺少更多功能,如更多执行、定期执行、线程中断。 线程池核心类-ThreadPoolExecutor参数说明:ThreadPoolExecutor一共有七个参数,这七个参数配合起来,形成了线程池弱小的功能。 corePoolSize:核心线程数量maximumPoolSize:线程最大线程数workQueue:阻塞队列,存储等待执行的工作,很重要,会对线程池运行过程产生重大影响 当咱们提交一个新的工作到线程池,线程池会根据以后池中正在运行的线程数量来决定该工作的处理形式。处理形式有三种:1、间接切换(SynchronusQueue)2、无界队列(LinkedBlockingQueue)能够创建的最大线程数为corePoolSize,这时maximumPoolSize就不会起作用了。当线程池中所有的核心线程都是运行状态的时候,新的工作提交就会放入等待队列中。3、有界队列(ArrayBlockingQueue)最大maximumPoolSize,能够升高资源消耗,然而这种形式使得线程池对线程调度变的更艰巨。因为线程池与队列容量都是无限的。所以想让线程池的吞吐率和处理工作达到一个正当的范畴,又想使咱们的线程调度绝对简略,并且还尽可能升高资源的消耗,咱们就需要正当的限度这两个数量调配技巧: [如果想升高资源的消耗包含升高cpu使用率、操作系统资源的消耗、上下文切换的开销等等,可能设置一个较大的队列容量和较小的线程池容量,这样会升高线程池的吞吐量。如果咱们提交的工作常常发生阻塞,咱们可能调整maximumPoolSize。如果咱们的队列容量较小,咱们需要把线程池大小设置的大一些,这样cpu的使用率相对来说会高一些。然而如果线程池的容量设置的过大,提高工作的数量过多的时候,并发量会减少,那么线程之间的调度就是一个需要考虑的问题。这样反而可能会升高处理工作的吞吐量。] keepAliveTime:线程没有工作执行时最多保持多久工夫终止(当线程中的线程数量大于corePoolSize的时候,如果这时没有新的工作提交核心线程外的线程不会立即销毁,而是等待,直到超过keepAliveTime)unit:keepAliveTime的工夫单位threadFactory:线程工厂,用来创建线程,有一个默认的工场来创建线程,这样新创建进去的线程有雷同的优先级,是非守护线程、设置好了名称)rejectHandler:当拒绝处理工作时(阻塞队列满)的策略(AbortPolicy默认策略间接抛出异样、CallerRunsPolicy用调用者所在的线程执行工作、DiscardOldestPolicy抛弃队列中最靠前的工作并执行当前任务、DiscardPolicy间接抛弃当前任务)corePoolSize、maximumPoolSize、workQueue 三者关系:如果运行的线程数小于corePoolSize的时候,间接创建新线程来处理工作。即使线程池中的其余线程是空闲的。如果运行中的线程数大于corePoolSize且小于maximumPoolSize时,那么只有当workQueue满的时候才创建新的线程去处理工作。如果corePoolSize与maximumPoolSize是雷同的,那么创建的线程池大小是固定的。这时有新工作提交,当workQueue未满时,就把请求放入workQueue中。等待空线程从workQueue取出工作。如果workQueue此时也满了,那么就使用另外的拒绝策略参数去执行拒绝策略。

August 5, 2022 · 1 min · jiezi

关于算法:算法复杂度

算法复杂度算法复杂度指运行该算法所须要耗费的资源,包含工夫资源和空间资源。 评估一个算法的性能次要根据其工夫复杂度和空间复杂度来确定。工夫复杂度是指该算法运行的工夫长短。空间复杂度是指该算法运行占用的内存大小。复杂度越低越好,越短小越好。工夫比空间更重要。 工夫复杂度算法运行的工夫。工夫复杂度通常用大写O示意,是一个估算出的复杂度量级。 常见算法工夫复杂度图表:O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(n³) < \( O(2^n) \) < O(n!) O(1):最快,常数工夫,固定步骤内执行结束,与输出数据n无关。尽量往这个量级优化。O(logn):对数工夫。是以2为底n的对数。(多少个2相乘才等于n)。log2 = 1、 log4 = 2、 log8 = 3、 log16 = 4、 log32 = 5 以此类推。O(n):线性工夫,与n成正比的关系。O(nlogn):线性对数工夫,比O(n)慢。O(n²):指数工夫,算法的执行工夫是n的平方。O(n!):阶乘,比指数工夫更慢。 排序算法工夫复杂度图表:https://blog.csdn.net/weixin_... 算法复杂度速查表:https://www.cnblogs.com/marti... 算法复杂度理论体验:O(1): 最棒O(logn): 很好O(n): 能够O(nlogn): 有点慢O(n²): 很慢O(n³): 慢的可怕O(n!): 如坠天堂

August 5, 2022 · 1 min · jiezi

关于算法:近邻搜索算法浅析

简介随着深度学习的倒退和遍及,很多非构造数据被示意为高维向量,并通过近邻搜寻来查找,实现了多种场景的检索需要,如人脸识别、图片搜寻、商品的举荐搜寻等。另一方面随着互联网技术的倒退及5G技术的遍及,产生的数据呈爆发式增长,如何在海量数据中精准高效的实现搜寻成为一个钻研热点,各路前辈专家提出了不同的算法,明天咱们就简略聊下以后比拟常见的近邻搜索算法。 次要算法 Kd-TreeK-dimension tree,二叉树构造,对数据点在k维空间(如二维 (x,y),三维(x,y,z),k维(x,y,z..))中划分。 构建过程确定split域的值(轮询 or 最大方差) 确定Node-data的域值(中位数 or 平均值) 确定左子空间和右子空间 递归结构左右子空间  查问过程进行二叉搜寻,找到叶子结点 回溯搜寻门路,进入其余候选节点的子空间查问间隔更近的点 反复步骤2,直到搜寻门路为空  性能现实状况下的复杂度是O(K log(N)) 最坏的状况下(当查问点的邻域与宰割超平面两侧的空间都产生交加时,回溯的次数大大增加)的复杂度为维度比拟大时,间接利用K-d树疾速检索(维数超过20)的性能急剧下降,简直靠近线性扫描。 改良算法Best-Bin-First:通过设置优先级队列(将“查问门路”上的结点进行排序,如按各自宰割超平面与查问点的间隔排序)和运行超时限定(限定搜寻过的叶子节点树)来获取近似的最近邻,无效地缩小回溯的次数。采纳了BBF查问机制后Kd树便能够无效的扩大到高维数据集上 。 Randomized Kd tree:通过构建多个不同方向上的Kd tree,在各个Kd tree上并行搜寻局部数量的节点来晋升搜寻性能(次要解决BBF算法随着Max-search nodes增长,收益减小的问题)  Hierarchical k-means trees相似k-means tree,通过聚类的办法来建设一个二叉树来使得每个点查找时间复杂度是O(log n) 。 构建过程 :随机抉择两个点,执行k为2的聚类,用垂直于这两个聚类核心的超平面将数据集划分 在划分的子空间内进行递归迭代持续划分,直到每个子空间最多只剩下K个数据节点 最终造成一个二叉树构造。叶子节点记录原始数据节点,两头节点记录宰割超平面的信息  搜寻过程  从根节点开始比拟,找到叶子节点,同时将门路上的节点记录到优先级队列中执行回溯,从优先级队列中选取节点从新执行查找 每次查找都将门路中未遍历的节点记录到优先级队列中 当遍历节点的数目达到指定阈值时终止搜寻 性能  搜寻性能不是特地稳固,在某些数据集上体现很好,在有些数据集上则有些差 构建树的工夫比拟长,能够通过设置kmeans的迭代次数来优化LSHLocality-Sensitive Hashing 高维空间的两点若间隔很近,他们哈希值有很大概率是一样的;若两点之间的间隔较远,他们哈希值雷同的概率会很小. 个别会依据具体的需要来抉择满足条件的hash函数,(d1,d2,p1,p2)-sensitive 满足上面两个条件(D为空间间隔度量,Pr示意概率): 若空间中两点p和q之间的间隔D(p,q)<d1,则Pr(h(p)=h(q))>p1 若空间中两点p和q之间的间隔D(p,q)>d2,则Pr(h(p)=h(q))<p2 离线构建索引 抉择满足(,,1,2)-sensive的哈希函数; 依据对查找后果的准确率(即相邻的数据被查找到的概率)确定哈希表的个数, 每个table内的hash functions的个数(也就哈希的键长),以及跟LSH hash function 本身无关的参数 ;利用下面的哈希函数组,将汇合中的所有数据映射到一个或多个哈希表中,实现索引 的建设。 在线查找  将查问向量通过哈希函数映射,失去相应哈希表中的编号 将所有哈希表中相应的编号的向量取出来,(保障查找速度,通常只取前2) 对这2个向量进行线性查找,返回与查问向量最类似的向量。 查问耗时次要为:计算q的hash值(table id)+ 计算q与table中点的间隔 查问成果方面因为损失了大量原始信息从而升高检索精度 。 PQproduct quantization,把原来的向量空间合成为若干个低维向量空间的笛卡尔积,并对合成失去的低维向量空间别离做量化(quantization),这样每个向量就能由多个低维空间的量化code组合示意。 须要选取最优的量化算法,咱们熟知的k-means算法就是一个靠近最优化的量化算法。  量化 应用k-means进行量化的过程  将原始向量切分为m组,每组内应用k-means聚类,产出m组,每组多个聚类核心 将原始向量编码为m维向量,向量中每个元素代表所在组聚类核心的id 查问过程 将搜寻query划分子向量,计算子向量和对应段的所有簇心的间隔,失去间隔表(m×k*矩阵) 遍历样本库中的向量,依据间隔表,计算每个样本与查问向量的间隔和返回k个间隔最靠近的样本  间隔计算 SDC(symmetric distance computation),对称的间隔计算方法,对query向量和样本库中的向量都进行PQ量化,同时会在构建阶段会计算出每组向量各个聚类核心的间隔,生成k*k的间隔表,在查问阶段计算query向量和样本库中的向量时,通过查表即可,缩小计算过程,但放大了误差。 ADC(Asymmetric distance computation),非对称的间隔计算计划,只对样本库中的向量进行PQ量化,在查问阶段计算query向量和m组聚类核心的间隔,生成m*k的间隔表,而后查表计算与样本库中向量的间隔,因为须要每次对查问向量实时计算,减少计算开销,但误差小。 优化 IVFPQ,基于倒排的乘积量化算法,减少粗量化阶段,对样本进行聚类,划分为较小的region ,缩小候选集数据量(之前是须要遍历全量的样本,工夫复杂度为O(N*M))。 HNSW在NSW算法之上进行改良的基于图的算法,应用分层的构造,在每层通过启发式办法来抉择某节点的街坊(保障全局连通性),使其形成一张连通的图。 ...

August 3, 2022 · 1 min · jiezi

关于算法:密码学的基础X690和对应的BER-CER-DER编码

简介之前咱们讲到了优良的数据描述语言ASN.1,很多协定规范都是应用ASN.1来进行形容的。对于ASN.1来说,只定义了数据的形容是不够的,它还规定了音讯是如何被编码的,从而能够在不同的机器中进行通信。 ASN.1反对一系列的编码规定,比方BER,DER,CER等。而X.690就是一个ITU-T的规范,它外面蕴含了一些对ASN.1进行编码的规定。 有人要问了,那么什么是ITU-T呢? ITU-T的全称是International Telecommunication Union Telecommunication Standardization Sector,也就是国际电联电信标准化部门,次要用来协调电信和信息通信技术标准。 X.690次要蕴含了Basic Encoding Rules (BER),Canonical Encoding Rules (CER)和Distinguished Encoding Rules (DER)这三种编码规定。 接下来,咱们来看下这些编码规定的实现细节。 BER编码BER的全称是Basic Encoding Rules,它是最早的编码规定,应用Tag-Length-Value(TLV)的格局对所有信息进行编码。 在BER中,每个数据元素都被编码为类型标识符、长度形容、理论数据元素,以及可选的内容完结标记,如下所示: 类型标识符长度理论数据内容完结标记TypeLengthValue只用在不确定长度的状况所有的编码都是以字节为单位的。 类型标识符ASN.1的类型有上面几种,下表列出了ASN.1中类型和对应的十进制的关系: type名称根底类型还是组合类型Number(十进制)End-of-Content (EOC)根底类型0BOOLEAN根底类型1INTEGER根底类型2BIT STRING两者皆可3OCTET STRING两者皆可4NULL根底类型5OBJECT IDENTIFIER根底类型6Object Descriptor两者皆可7EXTERNAL组合类型8REAL (float)根底类型9ENUMERATED根底类型10EMBEDDED PDV组合类型11UTF8String两者皆可12RELATIVE-OID根底类型13TIME根底类型14Reserved 15SEQUENCE and SEQUENCE OF组合类型16SET and SET OF组合类型17NumericString两者皆可18PrintableString两者皆可19T61String两者皆可20VideotexString两者皆可21IA5String两者皆可22UTCTime两者皆可23GeneralizedTime两者皆可24GraphicString两者皆可25VisibleString两者皆可26GeneralString两者皆可27UniversalString两者皆可28CHARACTER STRING组合类型29BMPString组合类型30DATE根底类型31TIME-OF-DAY根底类型32DATE-TIME根底类型33DURATION根底类型34OID-IRI根底类型35RELATIVE-OID-IRI根底类型36以上就是ASN.1中的类型和对应的值。接下来咱们看下这些类型是怎么进行编码的。 ASN.1都是以字节为单位的,一个字节是8bits,其中7-8bits示意的是Tag class。2个bits能够示意4种class,如下: classvalue形容Universal0ASN.1的native类型Application1该类型仅对一种特定应用程序无效Context-specific2这种类型依赖于contextPrivate3 6bit示意的是这个类型是简略类型还是组合类型,简略类型用0,组合类型用1。 还剩下5个bits,能够示意32个不同的值,然而对于ASN.1来说,它的类型是超出32范畴的,所以这5个bits只用来示意0-30的值的范畴。如下所示: 如果想要示意超出30范畴的值,那么能够应用两个byte,如下: 后面一个byte的1-5bits全副用1示意,前面一个byte的第8bit用1示意,剩下的7个bits用来示意实在的值。 长度type编码之后就是length编码,length编码有两种格局,一种是确定长度的length,一种是不确定长度的length。 如果数据的长度是可预感的,那么咱们就能够应用确定长度的编码模式,如果长度是不确定的,那么就能够应用不确定长度的编码模式。 咱们看下不同类型的长度编码模式: 首先,如果是确定长度,并且长度比拟短的状况下,那么在8bit位设置为0,剩下的7个bits能够示意0-127范畴的长度状况。 如果长度超过了127,那么能够在8bit设置为1,并且剩下的7个bits示意的是前面存储长度的byte个数,byte个数的范畴是(1-126)。 如果是非固定长度,那么在8bit位设置为1,剩下的7bits设置为0。 所有bits都设置为1的是保留值。 在非固定长度的状况下,如果内容完结之后,须要额定附加一个byte示意的End-of-Contents,用来示意非固定长度编码曾经完结了。 内容Contents是跟在长度前面的byte字段,Contents的长度能够为0,示意没有Contents内容。 总体来看BER编码,通过类型+长度+具体的内容字段来组成的。 CER编码和DER编码CER的全称是Canonical Encoding Rules, DER的全称是Distinguished Encoding Rules,这两个编码都是从BER衍生过去的,他们都是BER的变体。 为什么会有这两个变体呢?首先考虑一下BER的定义,BER是Basic Encoding Rules,它是一个十分根底的编码规定,在很多状况下并没有提供具体的编码实现规定,所以须要具体的实现者自行对根底协定进行扩大。 ...

August 1, 2022 · 1 min · jiezi

关于算法:深入浅出零钱兑换问题背包问题的套壳

深入浅出零钱兑换问题——背包问题的套壳前言在本篇文章当中次要通过介绍两个算法题,从最根本的问题开始深入浅出零钱兑换问题,帮忙大家从动静布局的根源深刻了解问题当中的原理,并且学会本人剖析问题,剖析数据之间的依赖关系,通过剖析这种关系本人推导算法的优化过程,再也不怕相似于背包问题的算法题了。 零钱兑换题目给你一个整数数组 coins ,示意不同面额的硬币;以及一个整数 amount ,示意总金额。 计算并返回能够凑成总金额所需的 起码的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你能够认为每种硬币的数量是有限的。 示例示例1 输出:coins = [1, 2, 5], amount = 11输入:3 解释:11 = 5 + 5 + 1示例2 输出:coins = [2], amount = 3输入:-1状态示意和状态转移方程在求解动静布局问题的时候通常的步骤有以下几个: 寻找可能示意状态的数组dp,即咱们须要寻找dp的含意,剖析须要用几纬数组示意具体的状态。通过剖析问题,寻找动静转移公式。初始化状态数组。通过剖析动静转移方程,确定数组的遍历程序。状态示意数组在背包问题当中通常都是用一个二维数组示意数据的状态,在这个问题当中咱们应用一个二维数组dp示意咱们须要的状态: dp[i][j]示意应用coins前i种面额的硬币示意金额等于j时应用的起码的金币,那么咱们最终答案就是dp[N][amount],他示意应用coins数组当中所有面额的硬币示意amount须要的起码的硬币个数。 寻找动静转移方程在确定了状态示意的数组之后,当初咱们就须要剖析出动静转移方程了,在这个问题当中对于每一种面额的硬币咱们都有两种抉择:选和不选,然而在这个问题当中题目曾经阐明了对于每一种货币都能够认为是有限的,如果咱们不抉择,那这种状况比较简单,然而如果抉择了这种状况就比较复杂了: 不选,这种状况比较简单,比方对于dp[i][j],如果第i种面额的货币不抉择,那么阐明只应用前i - 1种面额的货币,那么dp[i][j] = dp[i - 1][j],也就是说明如果应用前i种面额的货币去示意总额为j,然而不抉择第i种面额的货币,就相当于应用前i-1种货币去示意j,那么须要的货币个数跟应用前i-1种货币去示意j须要的货币数目是相等的。选,这种状况看起来就比较复杂了,因为咱们须要确定是选一次,还是选两次,......,还是选N次,然而其实认真思考一下咱们能够应用一个相似递归的模式去解决这个问题,如果抉择那么dp[i][j] = dp[i][j - coins[i]] + 1,咱们仔细分析一下这个公式,相当于在总金额等于j的状况下先应用一次第i个面额的硬币,然而因为咱们的硬币是有限的,当初咱们还是能够抉择第i个硬币,相当于总金额等于j - coins[i]而且能够应用前i个硬币的状况下,须要的起码的硬币个数,这就解决了是选一次还是选N次的问题了,而在下面的公式当中加一的起因是应用了一次第i种硬币。很显然咱们须要从下面两种状况当中抉择须要的硬币起码的一种办法,因而综合下面的后果又如下的动静转移方程: $$dp[i][j] = min(dp[i - 1][j], dp[i][j - coins[i]] + 1)$$ 其实下面这个问题的剖析过程跟齐全背包能够说是截然不同,如果你对齐全背包感兴趣,你能够浏览这篇文章齐全背包。 初始化状态数组下面的问题剖析过程当中,咱们曾经剖析进去了动静转移方程,这个过程和齐全背包十分类似,然而这个问题比齐全背包还略微简单一点,因为不肯定可能寻找到这样一种组合凑成的总金额等于题目当中规定的数目。咱们用-1示意找不到这样一种组合可能示意。 在正式初始化之前先将dp数组第一行当中的数据全副初始化为-1。初始化第一行代码如下:for (int i = 0; i * coins[0] <= amount; i++) { dp[0][i * coins[0]] = i;}dp数组的第一行示意只应用第一种面额的硬币,因而只有第一种硬币面额的整数倍总金额能力应用第一种硬币进行示意,而且对应的硬币个数等于$\frac{amout}{coins[0]}$。 ...

July 30, 2022 · 4 min · jiezi

关于算法:浅谈CVPR2022-Traffic-Line

CVPR 2022 刚刚完结,而我最近一段时间始终在进行Traffic Line 相干的工作,所以趁着热度跟大家聊一聊CVPR 2022 中对于Traffic Line 相干的论文。这次次要筛选我认为比拟有意思的一些Paper来跟大家分享一下。 by 元戎感知组 Kivi·Wong 01 《Rethinking Efficient Lane Detection via Curve Modeling》摘要目前车道线解决计划蕴含以下三大类: Keypoint-base Method: 相似于物体检测的形式,将车道线看成由若干关键点组成的线,而后进行关键点检测。例如:Line-CNN[1]、LaneATT[2]Segmentation-base Method:这种形式将车道线标注为图像宰割,通过图像宰割的形式进行车道线检测。例如:HDMapNet[3]Curve-base Method: 首先预约义曲线模型,通过对曲线模型的学习来获取图像中的车道线示意。例如:PolyLaneNet[4]目前支流的办法是Keypoint-base Method和Segmentation-base Method,基于Curve-base Method的办法在性能上落后于其余的两类办法。在此基础上,作者认为次要的起因在于基于多项式的曲线参数模式很难被学习。 面对上述的状况,作者提出了一个问题,Curve-base相干办法是否有可能达到SOTA的程度?作者察看到,贝塞尔曲线模型有足够的参数自由度,可能表征驾驶场景中的车道线线型。该曲线模型具备计算复杂性低、高稳固等劣势,并且曲线参数模型拟合的形式也能够防止其余冗余的后处理(例如NMS)以及手动设计Anchor。这些劣势都使得整体模型可能更加简洁高效。 本篇文章作者次要有两点翻新点:1.提出了基于贝塞尔曲线拟合的车道检测办法2.提出了基于可变形卷积的特色反转交融模块 论文办法贝塞尔曲线方程可由下式定义,曲线中的每个点均由多个控制点递归组合而确定。作者在试验过程发现,取n=3根本满足车道线的拟合需要。 作者整个网络结构的设计由下图所示,首先利用一个特色网络(例如ResNet)对输出图像进行特征提取,而后通过特色翻转交融,并进行pooling操作,最初送入到分类分支和回归分支。 特色反转交融 作者发现,对于前装摄像头而言,所看到路面的车道线,往往具备肯定的对称性。例如:如果右边看到了一条车道线,往往对称的左边也会有一条。所以作者认为能够利用这个特色,进行对称的特色增强。当然,为了兼容可能呈现的不对称景象(例如:转弯、变道、线段不成对),作者应用了可变形卷积来进行一个偏置状况的学习。 Loss 的设定在loss这块,作者应用在Ground Truth Curve 与Predict Curve 内做等间距插点,并利用这些点做L1 Error的形式作为模型训练的回归Loss。整体表达式如下 作者提出,相似于ABCNet[4] 中利用控制点之间的L1 Error 会呈现控制点之间差距大,而生成的曲线差距小的状况。如下图(a) 所示,所以作者选用了下图(b)的形式进行Loss计算。并且,比照与经典的多项式回归算法中采纳的等y值采样,这种形式可能防止因为线段错位而引起的额定loss计算,如下图(c)所示。 试验后果 作者在TuSimple(见上表)、CULane(见上表)、LLAMAS(见下表)等数据集上均做了比照试验 从整体的试验后果来看,作者提出的办法在精度体现上并不惊艳。单看最优的模型后果设计,与一年前的LaneATT 在不同指标上平分秋色。不过当咱们连同模型速度一起比拟时,不难发现,得益于模型后处理的简洁,其FPS相较于等同构造的其余模型要高出一大截。当咱们将FPS大致相同的BezierLaneNet(ResNet-34)与LaneATT(ResNet-18)进行精度比拟时,能够发现BezierLaneNet 还是具备了肯定的劣势。。 论断本篇论文摸索了一种新的基于贝塞尔曲线拟合的车道线检测形式,并且证实其性能体现可能达到与其余类型的形式相近的水平。论文中试验论断给Curve-base 相干办法的钻研指出了一条新的方向,在Curve-base 办法中,一个易于拟合的曲线模型对整个算法精度的影响更为要害。 02 《VectorMapNet: End-to-end Vectorized HD Map Learning》摘要对于环境的感知了解是主动驾驶畛域要害的一环。现行大多数办法采纳密集栅格化宰割预测(Dense Rasterized Segmentation Predictions)的形式进行环境感知。这种形式经常因为没有蕴含实例信息而要求进行简单的后处理。因为上述的起因,作者提出了一种E2E的Semantic Map Leaning办法,称之为VectorMapNet。 ...

July 25, 2022 · 2 min · jiezi

关于算法:拉勾算法突击特训营3期完整无密

download:拉勾-算法突击特训营3期【残缺无密】Spring Boot+Vue3 动静菜单实现思路梳理对于 Spring Boot + Vue3 的动静菜单,松哥之前已经写了两篇文章了,这两篇文章次要是从代码上和大家分析动静菜单最终的实现形式,然而还是有小伙伴感觉没太看明确,感觉不足一个纲要挈领的思路,所以,明天松哥再整一篇文章和大家再来捋一捋这个问题,心愿这篇文章能让小伙伴们彻底搞明显这个问题。 整体思路首先咱们来看整体思路。有父有子:像系统管理那种,既有父菜单,又有子菜单。只有一个一级菜单,这种又细分为三种情况 一般的菜单,点击之后在左边主页面打开某个功能页面。一个超链接,但不是外链,是一个在以后零碎中打开的内部网页,点击之后,会在左边的主页面中新开一个选项卡,这个选项卡中浮现的是一个内部网页(本质上是通过 iframe 标签引入的一个内部网页)。一个超链接,并且还是一个外链,点击之后,间接在阅读器中打开一个新的选项卡,新的选项卡中展示一个内部链接。 四种菜单对应的 JSON 格局别离如下: 有父有子: { "name": "Monitor","path": "/monitor","hidden": false,"redirect": "noRedirect","component": "Layout","alwaysShow": true,"meta": { "title": "系统监控", "icon": "monitor", "noCache": false, "link": null},"children": [{ "name": "Online", "path": "online", "hidden": false, "component": "monitor/online/index", "meta": { "title": "在线用户", "icon": "online", "noCache": false, "link": null }}, { "name": "Job", "path": "job", "hidden": false, "component": "monitor/job/index", "meta": { "title": "定时工作", "icon": "job", "noCache": false, "link": null }}]}复制代码 ...

July 22, 2022 · 5 min · jiezi

关于算法:最长的递增子序列的算法推演

例子:3 1 2 7 5 8 6 9 4 v1.0.0从前到后循坏,找到所有的可能性 const arr = [3, 1, 2, 7, 5, 8, 6, 9, 4]for (let i = 0; i < arr.length; i++) { const n = arr[i] console.log(i, n) // todo}i = 0,可能最长组合: 3 ... // i = 0, n = 3i = 1,可能最长组合: 3 ... // i = 0, n = 31 ... // i = 1, n = 1i = 2,可能最长组合: ...

July 20, 2022 · 5 min · jiezi

关于算法:22张图带你深入剖析前缀中缀后缀表达式以及表达式求值

深刻分析前缀、中断、后缀表达式以及表达式求值前言在本篇文章当中次要跟大家介绍以下几点 前缀、中断和后缀表达式。如何将中断表达式转化成后缀表达式。如何应用后缀表达式进行求值。表达式求值这是一个比拟经典的计算机系统根底问题,然而整个过程比拟形象,本文次要通过图解的办法帮忙大家了解这个问题。 表达式介绍后缀表达式也称作逆波兰表达式,前缀表达式也称作波兰表达式,这个是因为这是由波兰数学家杨-武卡谢维奇提出来的,用于简化命题逻辑的一种办法。 中断表达式咱们常见的数学表达式就是中断表达式,比如说:$1 + 2$,像这种咱们从小到大常常见到的表达式就叫做中断表达式,这个表达式的特点就是将运算符(加减乘除)放在两个操作数(数字)两头。 后缀表达式后缀表达式和中断表达式的最大区别就是,他不是将运算符放在操作数两头,而是将运算符放在操作数前面,比方下面的中断表达式$1 + 2$转化成后缀表达式就为$12+$。 前缀表达式前缀表达式就是将运算符放在操作数的后面,比方下面的中断表达式$1 + 2$转化成前缀表达式之后为$+12$。 表达式之间转化的例子下面的表达式还是比较简单,可能不足以帮忙大家好好了解表达式之间的转化过程。 中断表达式:$A + B * (C - D) - E / F$ 当初咱们来将下面的中断表达式转化成后缀表达式,咱们的第一个计算的局部如下(括号外面的优先计算): 依据咱们的转化原理:将运算符放在操作数前面, 下面的失去的后缀表达式持续进行转化(当初须要计算$B$乘以前面的那个局部): 持续进行转化(从左往后进行计算): 持续进行转化(除法的优先级比减法高): 失去最终的后果: 程序如何将中断表达式转化成后缀表达式将中断表达式转化成后缀表达式有以下几条规定(上面的栈是存储操作符的栈,而且只存储操作符): 从左到右进行遍历。遇到操作数,间接退出到后缀表达式当中。遇到界线符。遇到“(”间接入栈,遇到“)”则顺次弹出栈内运算符并退出后缀表达式,直到弹出“(” 为止,留神:“(” 不退出后缀表达式。遇到运算符。顺次弹出栈中优先级高于或等于以后运算符的所有运算符,并退出后缀表达式,若碰到“(”或栈空则进行。之后再把以后运算符入栈。当初咱们依据下面的规定来将上文当中的中断表达式转化成后缀表达式。 遍历到$A$,依据第二条规定,将$A$退出到后缀表达式当中,以后的后缀表达式为:$A$。 当初遍历到加号,依据后面的规定须要弹出栈外面优先级大的运算符,再将加号退出到栈中,以后的后缀表达式为$A$。 遍历到$B$,间接退出到后缀表达式当中,目前的后缀表达式为$AB$。 遍历到$*$,依据规定间接将其退出到栈中,以后后缀表达式为$AB$。 遍历到$($,依据规定间接将其退出到栈中,以后后缀表达式为$AB$。 遍历到$C$,则间接将其退出到后缀表达式当中,以后后缀表达式为$ABC$。遍历到$-$,依据规定将其退出到栈中,以后后缀表达式为$ABC$。 遍历到$D$,则将其间接退出到后缀表达式当中,以后的后缀表达式为$ABCD$。遍历到$)$,则须要将栈中的符号弹出,直到遇到$($,以后的后缀表达式为$ABCD-$。 遍历到$-$,须要将栈中优先级大于等于$-$的运算符弹出,则以后的后缀表达式为$ABCD-*+$,再将$-$压入栈中。 遍历到$E$,间接将数字退出到后缀表达式当中,则以后的后缀表达式为$ABCD-*+E$。遍历到$/$,将栈中优先级大于等于$/$的运算符,再将$/$压入到栈中,以后的后缀表达式为$ABCD-*+E$。 遍历到$F$,间接将其退出到后缀表达式当中,则以后的后缀表达式为$ABCD-*+EF$。最终将栈中所有的运算符都弹出,失去的后缀表达式为$ABCD-*+EF/-$。通过下面的过程就能够将一个中断表达式转成后缀表达式了,大家如果想要代码实现,只须要在遍历数据的时候依据下面四个规定一个个进行判断即可,程序并不艰难,就是逻辑略微有点多,须要思考更多的问题,在写代码的时候须要粗疏一点。 后缀表达式求值在前文当中咱们曾经失去了表达式$A + B * (C - D) - E / F$的后缀表达式为$ABCD-*+EF/-$。当初咱们须要将这个后缀表达式进行求值。依据后缀表达式求值次要有以下两条规定: 如果遇到数字间接将其退出到数字栈。如果遇到操作符间接从操作数栈弹出两个数据进行对应的运算,再将运算后果退出到栈中。当初咱们进行后缀表达式的求值过程; 首先后面四个$ABCD$都是数字,依据下面提到的第一条规定,咱们都须要将数字压入到栈当中,因而遍历四个数字之后,状况如下: 当初遍历到$-$,咱们须要将$D$和$C$弹出,而后进行$-$操作的运算,再将后果压入栈中。 当初遍历到$*$,咱们须要将$C-D=M$和$B$弹出,进行乘法运算,而后将后果压入栈中。 当初咱们遍历到$+$,须要将栈中残余的两个数弹出,进行加法运算,在将后果压栈。 遍历$EF$都须要将这两个数压入到栈当中。 当初遍历到$/$,须要进行除法运算,在将失去的后果压入到栈中。 最初遍历到$-$,将栈中的两个数弹出栈,进行减法运算失去最初的后果。 ...

July 20, 2022 · 1 min · jiezi

关于算法:GIT斯坦福大学提出应对复杂变换的不变性提升方法-ICLR-2022

论文对长尾数据集中的简单变换不变性进行了钻研,发现不变性在很大水平上取决于类别的图片数量,实际上分类器并不能将从大类中学习到的不变性转移到小类中。为此,论文提出了GIT生成模型,从数据集中学习到类无关的简单变换,从而在训练时对小类进行无效加强,整体成果不错 起源:晓飞的算法工程笔记 公众号论文: Do Deep Networks Transfer Invariances Across Classes? 论文地址:https://arxiv.org/abs/2203.09739 论文代码:https://github.com/AllanYangZhou/generative-invariance-transferIntroduction 优良的泛化能力须要模型具备疏忽不相干细节的能力,比方分类器应该对图像的指标是猫还是狗进行响应,而不是背景或光照条件。换句话说,泛化能力须要蕴含对简单但不影响预测后果的变换的不变性。在给定足够多的不同图片的状况下,比方训练数据集蕴含在大量不同背景下的猫和狗的图像,深度神经网络确实能够学习到不变性。但如果狗类的所有训练图片都是草地背景,那分类器很可能会误判房子背景中的狗为猫,这种状况往往就是不均衡数据集存在的问题。 类不均衡在实践中很常见,许多事实世界的数据集遵循长尾散布,除几个头部类有很多图片外,而其余的每个尾部类都有很少的图片。因而,即便长尾数据集中图片总量很大,分类器也可能难以学习尾部类的不变性。尽管罕用的数据加强能够通过减少尾部类中的图片数量和多样性来解决这个问题,但这种策略并不能用于模拟简单变换,如更换图片背景。须要留神的是,像照明变动之类的许多简单变换是类别无关的,可能相似地利用于任何类别的图片。现实状况下,经过训练的模型应该可能主动将这些不变性转为类无关的不变性,兼容尾部类的预测。 论文通过试验察看分类器跨类迁徙学习到的不变性的能力,从后果中发现即便通过过采样等均衡策略后,神经网络在不同类别之间传递学习到的不变性也很差。例如,在一个长尾数据集上,每个图片都是随机平均旋转的,分类器往往对来自头部类的图片放弃旋转不变,而对来自尾部类的图片则不放弃旋转不变。 为此,论文提出了一种更无效地跨类传递不变性的简略办法。首先训练一个input conditioned但与类无关的生成模型,该模型用于捕捉数据集的简单变换,暗藏了类信息以便鼓励类之间的变换转移。而后应用这个生成模型来转换训练输出,相似于学习数据加强来训练分类器。论文通过试验证实,因为尾部类的不变性失去显著晋升,整体分类器对简单变换更具不变性,从而有更好的测试准确率。 Measuring Invariance Transfer In Class-Imbalanced Datasets 论文先对不均衡场景中的不变性进行介绍,随后定义一个用于度量不变性的指标,最初再剖析不变性与类别大小之间的关系。 Setup:Classification,Imbalance,and Invariances 定义输出$(x,y)$,标签$y$属于$\{1,\cdots,C\}$,$C$为类别数。定义训练后的模型的权值$w$,用于预测条件概率$\tilde{P}_w(y=j|x)$,分类器将抉择概率最大的类别$j$作为输入。给定训练集$\{(x^{(i)}, y^{(i)})\}^N_{i=1}\sim \mathbb{P}_{train}$,通过教训危险最小化(ERM)来最小化训练样本的均匀损失。但在不均衡场景下,因为$\{y^{(i)}\}$的散布不是平均的,导致ERM在多数类别上体现不佳。 在事实场景中,最现实的是模型在所有类别上都体现得不错。为此,论文采纳类别均衡的指标来评估分类器,相当于测试散布$\mathbb{P}_{test}$在$y$上是平均的。 为了剖析不变性,论文假如$x$的简单变换散布为$T(\cdot|x)$。对于不影响标签的简单变换,论文心愿分类器是不变的,即预测的概率不会扭转: Measuring Learned Invariacnes 为了度量分类器学习不变性的水平,论文定义了原输出和变换输出之间的冀望KL散度(eKLD): 这是一个非正数,eKLD越低代表不变性水平就越高,对$T$齐全不变的分类器的eKLD为0。如果有方法采样$x^{'}\sim T(\cdot|x)$,就能计算训练后的分类器的eKLD。此外,为了钻研不变性与类图片数量的关系,能够通过别离计算类特定的eKLD进行剖析,行将公式2的$x$限定为类别$j$所属。 计算eKLD的难点在于简单变动散布$T$的获取。对于大多数事实世界的数据集而言,其简单变动散布是不可知的。为此,论文通过选定简单散布来生成数据集,如RotMNIST数据集。与数据加强不同,这种生成形式是通过变换对数据集进行裁减,而不是在训练过程对同一图片利用多个随机采样的变换。 论文以Kuzushiji-49作为根底,用三种不同的简单变换生成了三个不同的数据集:图片旋转(K49-ROT-LT)、不同背景强度(K49-BG-LT)和图像收缩或侵蚀(K49-DIL-LT)。为了使数据集具备长尾散布(LT),先从大到小随机抉择类别,而后有选择地缩小类别的图片数直到数量散布合乎参数为2.0的Zipf定律,同时强制起码的类为5张图片。反复以上操作30次,结构30个不同的长尾数据集。每个长尾数据集有7864张图片,最多的类有4828张图片,最小的类有5张图片,而测试集则放弃原先的不变。 训练方面,采纳规范ERM和CE+DRS两种办法,其中CE+DRS基于穿插熵损失进行提早的类均衡重采样。DRS在开始阶段跟ERM一样随机采样,随后再切换为类均衡采样进行训练。论文为每个训练集进行两种分类器的训练,随后计算每个分类器每个类别的eKLD指标。后果如图1所示,能够看到两个景象: 在不同变动数据集上,不变性随着类图片数缩小都升高了。这表明尽管简单变换是类无关的,但在不均衡数据集上,模型无奈在类之间传递学习到的不变性。对于图片数量雷同的类,应用CE+DRS训练的分类器往往会有较低的eKLD,即更好的不变性。但从曲线上看,DRS仍有较大的晋升空间,还没达到类别之间统一的不变性。Trasnferring Invariances with Generative Models 从后面的剖析能够看到,长尾数据集的尾部类对简单变换的不变性较差。上面将介绍如何通过生成式不变性变换(GIT)来显式学习数据集中的简单变换散布$T(\cdot|x)$,进而在类间转移不变性。 Learning Nuisance Transformations from Data 如果有数据集理论相干的简单变换的办法,能够间接将其用作数据加强来增强所有类的不变性,但在实践中很少呈现这种状况。于是论文提出GIT,通过训练input conditioned的生成模型$\tilde{T}(\cdot|x)$来近似实在的简单变换散布$T(\cdot|x)$。 论文参考了多模态图像转换模型MUNIT来结构生成模型,该类模型可能从数据中学习到多种简单变换,而后对输出进行变换生成不同的输入。论文对MUNIT进行了大量批改,使其可能学习单数据集图片之间的变换,而不是两个不同域数据集之间的变换。从图2的生成后果来看,生成模型可能很好地捕获数据集中的简单变换,即便是尾部类也有不错的成果。须要留神的是,MUNIT是非必须的,也能够尝试其它可能更好的办法。 在训练好生成模型后,应用GIT作为实在简单变换的代理来为分类器进行数据加强,心愿可能进步尾部类对简单变换的不变性。给定训练输出$\{(x^{(i)}, y^{(i)})\}^{|B|}_{i=1}$,变换输出$\tilde{x}^{(i)}\gets \tilde{T}(\cdot|x^{(i)})$,放弃标签不变。这样的变换可能进步分类器在训练期间的输出多样性,特地是对于尾部类。须要留神的是,batch能够搭配任意的采样办法(Batch Sampler),比方类均衡采样器。此外,还能够有选择地进行加强,防止因为生成模型的缺点侵害性能的可能性,比方对数量足够且不变性曾经很好的头部类不进行加强。 ...

July 18, 2022 · 1 min · jiezi

关于算法:深入剖析JDKArrayQueue源码

深刻分析(JDK)ArrayQueue源码前言在本篇文章当中次要给大家介绍一个比较简单的JDK为咱们提供的容器ArrayQueue,这个容器次要是用数组实现的一个单向队列,整体的构造绝对其余容器来说就比较简单了。 ArrayQueue外部实现在谈ArrayQueue的外部实现之前咱们先来看一个ArrayQueue的应用例子: public void testQueue() { ArrayQueue<Integer> queue = new ArrayQueue<>(10); queue.add(1); queue.add(2); queue.add(3); queue.add(4); System.out.println(queue); queue.remove(0); // 这个参数只能为0 示意删除队列当中第一个元素,也就是队头元素 System.out.println(queue); queue.remove(0); System.out.println(queue);}// 输入后果[1, 2, 3, 4][2, 3, 4][3, 4]首先ArrayQueue外部是由循环数组实现的,可能保障减少和删除数据的工夫复杂度都是$O(1)$,不像ArrayList删除数据的工夫复杂度为$O(n)$。在ArrayQueue外部有两个整型数据head和tail,这两个的作用次要是指向队列的头部和尾部,它的初始状态在内存当中的布局如下图所示: 因为是初始状态head和tail的值都等于0,指向数组当中第一个数据。当初咱们向ArrayQueue外部退出5个数据,那么他的内存布局将如下图所示: 当初咱们删除4个数据,那么上图通过4次删除操作之后,ArrayQueue外部数据布局如下: 在下面的状态下,咱们持续退出8个数据,那么布局状况如下: 咱们晓得上图在退出数据的时候不仅将数组后半局部的空间应用完了,而且能够持续应用前半部分没有应用过的空间,也就是说在ArrayQueue外部实现了一个循环应用的过程。 ArrayQueue源码分析构造函数public ArrayQueue(int capacity) { this.capacity = capacity + 1; this.queue = newArray(capacity + 1); this.head = 0; this.tail = 0;}@SuppressWarnings("unchecked")private T[] newArray(int size) { return (T[]) new Object[size];}下面的构造函数的代码比拟容易了解,次要就是依据用户输出的数组空间长度去申请数组,不过他具体在申请数组的时候会多申请一个空间。 add函数public boolean add(T o) { queue[tail] = o; // 循环应用数组 int newtail = (tail + 1) % capacity; if (newtail == head) throw new IndexOutOfBoundsException("Queue full"); tail = newtail; return true; // we did add something}下面的代码也绝对比拟容易看懂,在上文当中咱们曾经提到了ArrayQueue能够循环将数据退出到数组当中去,这一点在下面的代码当中也有所体现。 ...

July 17, 2022 · 2 min · jiezi

关于算法:01背包面试题系列一

01背包面试题系列(一)题目形容——宰割等和子集给你一个 只蕴含正整数 的 非空 数组 nums 。请你判断是否能够将这个数组宰割成两个子集,使得两个子集的元素和相等。 示例 1: 输出:nums = [1,5,11,5]输入:true解释:数组能够宰割成 [1, 5, 5] 和 [11] 。示例 2: 输出:nums = [1,2,3,5]输入:false解释:数组不能宰割成两个元素和相等的子集。01背包动静布局求解下面的问题乍一看如同是一个子集划分的问题,咱们可能依据数据nums失去它的所有的子集,而后将所有的本人加起来看看是否存在一个子集的数据的和等于nums数组所有数据的和的一半,其实咱们的确能够这样做,咱们将在后文当中认真探讨这个办法。 那么咱们改如何应用01背包去解决这个问题呢?咱们首先先回顾一下01背包解决了什么问题: 有 $N$件物品和一个容量是 $V$ 的背包。每件物品只能应用一次。第$i$件物品的体积是$v_i$,价值是 $w_i$。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。01背包就是给定肯定容量的背包,看他可能装入物品的最大的价值。那么咱们该如何将上述问题转化成01背包呢? 咱们能够这样,将nums数组当中的数值变成物品对应的价值和体积,比如说nums = [1, 2, 3],咱们就能够分成三个物品,这三个物品的体积和价值别离是1和1、2和2和3和3,咱们背包的容量为V = (1 + 2 + 3) / 2。咱们将nums数组当中所有数据和的一半作为背包的容量,nums当中的数值就示意每一个物品的价值和体积,而且价值和体积都相等,如果咱们可能恰好装满背包就阐明,存在一种物品的组合他的和为nums数组当中数据的和的一半。 那么咱们该如何判断背包被恰好装满呢?咱们晓得背包问题求解的只是在背包容量肯定的状况下,咱们可能获取的最大的价值是多少,因而如同不可能判断背包是否装满!然而在下面转化的过程当中物品的体积和价值是相等的,因为咱们能够依据咱们取得的最大价值判断,如果咱们最终失去的收益等于背包的容量,那么阐明背包被填满了,也就是存在一种物品的组合咱们可能获取的最大的价值等于数组当中数据和的一半。因为物品的价值和体积相等,因而把背包填满和获取最大价值是等价的。 因而依据下面的剖析,如果咱们想用01背包去解决这个问题,咱们能够将背包容量设置为nums数组当中数据和的一半,物品的个数为数组的长度,物品的价值和体积为数组当中对应地位的值,而后进行01背包求解即可。 如果你还不是很理解01背包的话,能够先看这篇文章,该文章次要从0开始介绍了01背包问题,从二维数组到滚动数组再到一维数组,优化过程层层递进,带你从原理到实战齐全把握01背包问题。 因而咱们的代码如下(一维数组优化): class Solution { public boolean canPartition(int[] nums) { int sum = 0; for (int num : nums) { sum += num; } if ((sum & 1) == 1) return false; int t = sum / 2; int[] dp = new int[t + 1]; for (int i = 0; i < nums.length; i++) { for (int j = t; j >= nums[i]; j--) { dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]); } } return dp[t] == t; }}子集划分求解咱们晓得任何一个汇合的子集个数为$2^n$,其中$n$示意汇合当中数据的个数,比如说汇合${1, 2}$有如下子集(4个): ...

July 17, 2022 · 2 min · jiezi

关于算法:深入剖析斐波拉契数列

深刻分析斐波拉契数列前言动静布局作为一种十分经典的一类算法,不仅在解决理论问题当中有很多理论的利用,同时通常也是面试的一个重点。本篇文章一步步分析动静布局的基本原理,通过斐波拉契数列问题(优化工夫复杂度从$O(2^n)$到O(n)再到O(log(n)))一步一步带你从最根本的原理弄懂动静布局。咱们首先剖析斐波拉契数列问题,而后在剖析问题的时候缓缓的深刻动静布局。 斐波拉契数列斐波拉契数列的定义如下: $$F_0 = 0$$ $$F_1 = 1$$ $$F_n = F_{n - 1} + F_{n- 2}$$ 就是斐波那契数列由0和1开始,之后的斐波那契数就是由之前的两数相加而得出。比如说在斐波拉契数列当中第一个数为0,第二个数为1,因而第三个数为后面两个数之和,因而第三个数为1,同理第四个数是第二个数和第三个数之和,因而第四个数为2,上面就是斐波拉契数的变动: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, .... 斐波拉契数列——递归法当初咱们的问题是要你求第n个斐波拉契数,这个问题还是比较简单的,很容易想到这就是一个能够递归解决的问题,在公式$F_n = F_{n - 1} + F_{n-2}$当中也容易看出应该应用递归。当初要确定的就是递归终止条件。 如果n == 0则返回0,如果n == 1则返回1,这就是递归终止条件。确定完递归终止条件之后咱们很容易写出上面这样的代码: public class Fibonacci { public static int fibonacci(int n) { if (n <= 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } public static void main(String[] args) { System.out.println(fibonacci(6)); }}当咱们求第6个斐波拉契数的时候,函数fibonacci的调用过程如下所示: ...

July 16, 2022 · 5 min · jiezi

关于算法:深入剖析多重背包问题下篇

深刻分析多重背包问题(下篇)前言在后面的三篇文章当中,咱们曾经认真的探讨了01背包问题和齐全背包问题以及多重背包上篇,在本篇文章当中次要给大家介绍多重背包问题的一种优化办法——二进制优化多重背包,如果你还没有看过多重背包上篇,你须要先浏览多重背包上篇。 多重背包问题介绍有 $N$ 种物品和一个容量是 $V$ 的背包。第 $i$ 种物品最多有 $s_i$ 件,每件体积是 $v_i$,价值是 $w_i$。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 留神:下面应用到的字符含意在本篇文章当中都一样。 多重背包问题跟01背包和齐全背包的区别都是在物品的可用次数上,01背包只能应用一次,多重背包可用应用无数次,而多重背包可用应用屡次。 多重背包的二进制优化二进制优化的实现在正式剖析多重背包的二进制优化之前,咱们先剖析一下多重背包的工夫复杂度,假如咱们有$N$件物品,均匀每个物品的个数为$S$,那么多重背包的的工夫复杂度为$O(NSV)$。而多重背包的二进制优化能够将这个工夫复杂度升高到$O(NV)$。 在多重背包上篇上篇当中咱们提到了多重背包的动静转移方程( $T = min(S, \frac{V}{v_i})$,其中$S$示意物品可能抉择的次数,$v_i$示意物品的体积,$V$示意以后背包的容量): $$dp[i][j] = max\\\{ \\dp[i - 1][j], \\dp[i - 1][j - v[i]] + w[i],\\dp[i - 1][j - v[i] * 2] + w[i] * 2, \\..., \\dp[i - 1][j - v[i] * T] + w[i] * T\\\}$$ 从下面的公式咱们能够晓得,对于某个有$S$件的物品当中,咱们要抉择一个适合的数字使得咱们的收益最大,这个数字可能是$1, 2, 3, 4, ..., S$。咱们在文章多重背包上篇提到咱们能够将多重背包转化成01背包,咱们将$S$个物品在逻辑上分成体积和价值雷同的$S$个不同的物品,被分成$S$个不同的物品在进行动静抉择的时候与$S$个雷同的物品是一样的。比如说对于$S$个雷同的物品$A$,咱们在抉择3个的时候收益能够达到最大,那么对于转化之后的01背包问题来说就抉择3个与$A$体积和价值雷同的物品即可。 依据下面剖析咱们能够晓得多重背包可能转化成01背包的起因就是多重背包在转化为01背包之后,01背包可能有多重背包选1个,选2个,选3个,...,选$S$个的成果。 而咱们的二进制优化也次要集中在这个中央。多重背包的二进制优化也是将多重背包问题转化成01背包问题,然而不是将$S$个雷同的物品转化成$S$个体积和价值雷同的不同的物品。依据上文的剖析咱们晓得,咱们在将多重背包转化成01背包之后是须要保障01背包可能实现多重背包选1个,选2个,选3个,...,选$S$个的成果。那么咱们如何实现这一点呢?上面代码次要显示二进制优化将多重背包转化成01背包该往装物品的价值和体积的汇合里退出什么货色。 Scanner scanner = new Scanner(System.in);int N = scanner.nextInt();int V = scanner.nextInt();ArrayList<Integer> v = new ArrayList<>();ArrayList<Integer> w = new ArrayList<>();for (int i = 0; i < N; i++) { // 这个示意第 i 个物品的体积 int vi = scanner.nextInt(); // 这个示意第 i 个物品的价值 int wi = scanner.nextInt(); // 这个示意第 i 个物品有多少个 int si = scanner.nextInt(); // 这段代码次要是实现多重背包可能抉择1个 // 抉择2个,...,抉择S个的成果 for (int j = 1; j <= si; j *= 2) { si -= j ; v.add(vi * j); w.add(wi * j); } if (si > 0) { v.add(vi * si); w.add(wi * si); }}咱们举一个例子来剖析下面的代码,假如咱们退出一个物品$A$,它的个数为9,价值和体积别离为5和3。那么在汇合$v$和汇合$w$当中的数据别离为: ...

July 16, 2022 · 2 min · jiezi

关于算法:深入剖析多重背包问题上篇

深刻分析多重背包问题(上篇)前言在后面的两篇文章当中,咱们曾经认真的探讨了01背包问题和齐全背包问题,在本篇文章当中将给大家介绍另外一种背包问题——多重背包问题,多重背包问题的物品数量介于01背包问题和齐全背包问题之间,他的物品的数量是无限个! 多重背包问题介绍有 $N$ 种物品和一个容量是 $V$ 的背包。第 $i$ 种物品最多有 $s_i$ 件,每件体积是 $v_i$,价值是 $w_i$。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 留神:下面应用到的字符含意在本篇文章当中都一样。 多重背包问题跟01背包和齐全背包的区别都是在物品的可用次数上,01背包只能应用一次,多重背包可用应用无数次,而多重背包可用应用屡次。 背包问题温习——01背包的动静转移方程01背包的动静转移方程01背包问题当中,咱们是应用一个二维数组dp[i][j]进行计算,dp[i][j]示意在只应用前i个物品且背包容量为j的状况下,咱们可能取得的最大的收益。在这个状况下,咱们依据以后背包容量j判断是否能装入第i个物品能够失去上面两个方程: $$dp[i][j] = \begin{cases}max(dp[i - 1][j - v[i]] + w[i], dp[i - 1][j]), j \ge v[i]\\dp[i - 1][j] , j \lt v[i]\end{cases}$$ 下面01背包的公式的第二条比较简单,如果背包容量不足以包容第i件物品,那么只能从前i - 1物品当中抉择了。咱们来仔细分析一下第一条公式。 如果以后背包容量能够包容第i个物品,那么咱们就能够抉择第i件物品或者不抉择,咱们应该抉择两种抉择当中收益更大的那个。 如果咱们不抉择第i个物品,那么咱们就可能应用容量为j的背包去抉择前i - 1个物品,这种状况下咱们的最大收益为dp[i - 1][j]。如果抉择第i个物品,那么咱们背包容量还剩下j - v[i],还能够抉择剩下的i - 1个物品,而且咱们的收益须要加上w[i],因而咱们的收益为max(dp[i - 1][j - v[i]] + w[i], dp[i - 1][j])。将多重背包转化成01背包在多重背包的问题当中,咱们对于一种物品咱们能够应用屡次,比说$A$物品咱们能够用三次。事实上咱们能够将多重背包转化成01背包,比方咱们能够将三个$A$物品变成三个不同的物品,所谓不同就是他们的名字不一样,然而他们的价值和体积都是一样的,假如$A$的体积为$V_a$,价值为$W_a$,可能应用的次数为3次,那么咱们能够将其转化成$A_1$,$A_2$,$A_3$,这三个物品的体积和价值均为$V_a$和$W_a$,这样的话$A$能够应用3次就转化成了$A_1$、$A_2$和$A_3$均只能应用一次。通过这种转换咱们就将多重背包转化成了01背包。 多重背包Java代码: import java.util.ArrayList;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int N = scanner.nextInt(); int V = scanner.nextInt(); ArrayList<Integer> v = new ArrayList<>(); ArrayList<Integer> w = new ArrayList<>(); for (int i = 0; i < N; i++) { int vi = scanner.nextInt(); int wi = scanner.nextInt(); int t = scanner.nextInt(); for (int j = 0; j < t; j++) { v.add(vi); w.add(wi); } } int[][] dp = new int[v.size() + 1][V+ 1]; // 对第0行进行初始化操作 for (int i = v.get(0); i <= V; ++i) { dp[0][i] = w.get(0); } for (int i = 1; i < v.size(); ++i) { for (int j = 0; j <= V; ++j) { if (j >= v.get(i)) { dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - v.get(i)] + w.get(i)); } else { dp[i][j] = dp[i - 1][j]; } } } System.out.println(dp[v.size() - 1][V]); }}和01背包一样,咱们对多重背包也能够应用单行数组进行优化: ...

July 16, 2022 · 3 min · jiezi

关于算法:文案撰写海报图设计视频剪辑后期制作拍摄服务微抖红代运营公司

【本篇文章为言同数字科技有限公司原创】内容农场对短视频内容行业产生的影响次要有以下四个方面。 可能导致短视频数量和品质的失调高产量、低质量的内容始终是内容农场被诟病的起因,这在短视频时代仍然存在。在以后宏大的市场需求量下,采纳流水线式生产的短视频公司,通过薄利多销实现利润最大化。[12]只管大量内容填充了短视频平台的资源库,但借助蹭热点、题目党、同质化的内容参差不齐,虽有流量却难以积淀价值,反而会“劣币驱赶良币”,毁坏平台的内容生态。 推动娱乐内容成为了“硬通货”综艺影视、明星八卦、内容电商等娱乐类内容通常会取得较高的流传量,这体现在数据分析中会疏导内容农场适应短视频平台算法,进一步供应类似内容,造成低质娱乐内容的泛滥。而短视频平台的个性化举荐机制,也更偏向于向用户继续举荐类似内容,加剧了“娱乐至死”的景象,如何避免短视频内容生产进一步低俗化,值得高度关注。[13]短视频侵权问题亟需器重在短视频APP上,常常能看到一些视频博主通过混剪视频带你“五分钟看完一部电影”,或是不同的博主换汤不换药重复演绎同一段台词。12426版权监测中心公布的《2020中国网络短视频版权监测报告》显示,仅2019年至2020年10月间,就累计监测疑似侵权链接1602.69万条,独家原创作者被侵权率高达92.9%。[14]短视频正成为互联网知识产权侵权的最高发地带,推动版权内容合规治理成为了亟待解决的问题。 获取优质信息的老本持续减少农场生产食物,食物养活人类。内容农场自身即是一种绝妙的比喻:信息作为一种食物,扭转的不是食用者的身材,而是食用者的思维。这一比喻还连续在另一个颇显单向流传论的词语上——“Feed”,它自身有“投喂”的意思,在互联网语境中,网友订阅或关注某个信息源,即被视为被“投喂”信息。然而,平台上的内容农场越多,用户获取无效信息的难度越高。只管内容农场不肯定守法,但如果农场比例过高,其流水线般批量输入的内容就可能有损用户的信息生产环境。 在图文为主的网络时代,这些低质量的图文混淆在无效信息之中,令用户分别优质内容的工夫老本和机会成本加大。到了短视频瓜分注意力的当下,用户被各类影像突围,筛选信息的难度变得更高。 当然,内容行业始终在倒退,本文所探讨的“内容农场”依然是过来传统意义上次要产出低质信息的主体。 实际上,当下行业里的不少公司曾经趋于成熟,可能在批量化供应内容的同时保障优质性,目前咱们在短视频平台看到的许多好内容,背地都有业余机构的身影。言同数字科技有限公司就是新时代下稀缺的优质内容供应商。 言同数字是一家新媒体图文视频一站式解决方案服务商,咱们为超过220个公众号、130个抖音号,提供了2000余篇微信图文定制、近1000部视频拍摄制作服务。咱们业务涵盖深度原创/创意文案写稿、平面设计长图文、手绘漫画长图文、动静插画长图文、SVG交互图文技术开发、交互图文创意策动、视频拍摄剪辑、视频后期制作、动画设计、微信微博代经营、抖音小红书视频号代经营等。 作为行业出名、业内当先的服务商,咱们为品牌方提供了泛滥优质的交互图文及创意视频解决方案,为客户带来了超预期的推广成果和品牌名誉。咱们的客户涵盖了各个领域的知名品牌,包含宝马、飞驰、奥迪等出名车企,腾讯、华为、美团、民生银行、五芳斋、领英、英特尔等各行业顶尖品牌。

July 15, 2022 · 1 min · jiezi

关于算法:MindSpore报错-Conv2D第三维输出数据类型必须是正整数或者SHPANY-but-got

1 报错形容1.1 零碎环境Hardware Environment(Ascend/GPU/CPU): AscendSoftware Environment:– MindSpore version (source or binary): 1.6.0– Python version (e.g., Python 3.7.5): 3.7.6– OS platform and distribution (e.g., Linux Ubuntu 16.04): Ubuntu 4.15.0-74-generic– GCC/Compiler version (if compiled from source):1.2 根本信息1.2.1 脚本训练脚本是通过构建Conv2D的单算子网络,来实现2d卷积操作的。脚本如下: 01 class Net(nn.Cell): 02 def __init__(self, in_channels, out_channels, kernel_size): 03 super(Net, self).__init__() 04 self.in_channels = in_channels 05 self.out_channels = out_channels 06 self.kernel_size = kernel_size 07 # self.pad_mode = "valid" 08 self.conv2d = nn.Conv2d(self.in_channels, self.out_channels, self.kernel_size, pad_mode="valid") 09 10 def construct(self, x): 11 return self.conv2d(x) 12 13 net = Net(in_channels=2, out_channels=10, kernel_size=64) 14 x = Tensor(np.random.randn(1, 2, 4, 64), mindspore.float32) 15 y = net(x).shape 16 print("otput shape: ", y)1.2.2 报错这里报错信息如下:Traceback (most recent call last): File "C:/Users/l30026544/PycharmProjects/q2_map/new/I4GYSL.py", line 20, in <module> ...

July 15, 2022 · 2 min · jiezi

关于算法:某课算法与数据结构体系课已完结

download:某课算法与数据结构体系课已完结Spring Boot+Vue3 动静菜单实现思路梳理对于 Spring Boot + Vue3 的动静菜单,松哥之前已经写了两篇文章了,这两篇文章次要是从代码上和大家分析动静菜单最终的实现形式,然而还是有小伙伴感觉没太看明确,感觉不足一个纲要挈领的思路,所以,明天松哥再整一篇文章和大家再来捋一捋这个问题,心愿这篇文章能让小伙伴们彻底搞明显这个问题。 整体思路首先咱们来看整体思路。有父有子:像系统管理那种,既有父菜单,又有子菜单。只有一个一级菜单,这种又细分为三种情况: 一般的菜单,点击之后在左边主页面打开某个功能页面。一个超链接,但不是外链,是一个在以后零碎中打开的内部网页,点击之后,会在左边的主页面中新开一个选项卡,这个选项卡中浮现的是一个内部网页(本质上是通过 iframe 标签引入的一个内部网页)。一个超链接,并且还是一个外链,点击之后,间接在阅读器中打开一个新的选项卡,新的选项卡中展示一个内部链接。 四种菜单对应的 JSON 格局别离如下: 有父有子: { "name": "Monitor","path": "/monitor","hidden": false,"redirect": "noRedirect","component": "Layout","alwaysShow": true,"meta": { "title": "系统监控", "icon": "monitor", "noCache": false, "link": null},"children": [{ "name": "Online", "path": "online", "hidden": false, "component": "monitor/online/index", "meta": { "title": "在线用户", "icon": "online", "noCache": false, "link": null }}, { "name": "Job", "path": "job", "hidden": false, "component": "monitor/job/index", "meta": { "title": "定时工作", "icon": "job", "noCache": false, "link": null }}]}复制代码 ...

July 15, 2022 · 5 min · jiezi

关于算法:堆叠降噪自动编码器-Stacked-Denoising-Auto-EncoderSDAE

原文链接 主动编码器(Auto-Encoder,AE)自编码器(autoencoder)是神经网络的一种,经过训练后能尝试将输出复制到输入。自编码器外部有一个暗藏层 h,能够产生编码(code)示意输出。该网络能够看作由两局部组成:一个由函数 h = f(x) 示意的编码器和一个生成重构的解码器 r = g(h)。咱们不应该将自编码器设计成输出到输入齐全相等。这通常须要向自编码器强加一些束缚,使它只能近似地复制,并只能复制与训练数据类似的输出。 自动编码机由三层网络组成,其中输出层神经元数量与输入层神经元数量相等,中间层神经元数量少于输出层和输入层。搭建一个主动编码器须要实现上面三样工作:搭建编码器,搭建解码器,设定一个损失函数,用以掂量因为压缩而损失掉的信息(自编码器是有损的)。编码器和解码器个别都是参数化的方程,并对于损失函数可导,典型状况是应用神经网络。编码器和解码器的参数能够通过最小化损失函数而优化。 自动编码机(Auto-encoder)是一个自监督的算法,并不是一个无监督算法,它不须要对训练样本进行标记,其标签产生自输出数据。因而自编码器很容易对指定类的输出训练出一种特定的编码器,而不须要实现任何新工作。主动编码器是数据相干的,只能压缩那些与训练数据相似的数据。比方,应用人脸训练进去的主动编码器在压缩别的图片,比方树木时性能很差,因为它学习到的特色是与人脸相干的。 主动编码器运算过程:原始input(设为x)通过加权(W、b)、映射(Sigmoid)之后失去y,再对y反向加权映射回来成为z。通过重复迭代训练两组(W、b),目标就是使输入信号与输出信号尽量类似。训练完结之后主动编码器能够由两局部组成: 1.输出层和中间层,能够用这个网络来对信号进行压缩 2.中间层和输入层,咱们能够将压缩的信号进行还原 降噪主动编码器(Denoising Auto Encoder,DAE)降噪主动编码器就是在主动编码器的根底之上,为了避免过拟合问题而对输出层的输出数据退出乐音,使学习失去的编码器具备鲁棒性而改良的,是Bengio在08年论文:Extracting and composing robust features with denoising autoencoders提出的。 论文中对于降噪主动编码器的示意图如下,相似于dropout,其中x是原始的输出数据,降噪主动编码器以肯定概率(通常应用二项分布)把输出层节点的值置为0,从而失去含有乐音的模型输出x。 这个破损的数据是很有用的,起因有二: 1.通过与非破损数据训练的比照,破损数据训练进去的Weight噪声比拟小。降噪因而得名。起因不难理解,因为擦除的时候不小心把输出噪声给×掉了。 2.破损数据肯定水平上加重了训练数据与测试数据的代沟。因为数据的局部被×掉了,因此这破损数据肯定水平上比拟靠近测试数据。训练、测试必定有同有异,当然咱们要求同舍异。 重叠降噪主动编码器(Stacked Denoising Auto Encoder,SDAE)SDAE的思维就是将多个DAE重叠在一起造成一个深度的架构。只有在训练的时候才会对输出进行侵蚀(加噪),训练实现就不须要在进行侵蚀。构造如下图所示: 逐层贪心训练:每层自编码层都独自进行非监督训练,以最小化输出(输出为前一层的隐层输入)与重构后果之间的误差为训练指标。前K层训练好了,就能够训练K+1层,因为曾经前向流传求出K层的输入,再用K层的输入当作K+1的输出训练K+1层。 一旦SDAE训练实现, 其高层的特色就能够用做传统的监督算法的输出。当然,也能够在最顶层增加一层logistic regression layer(softmax层),而后应用带label的数据来进一步对网络进行微调(fine-tuning),即用样本进行有监督训练。 学习更多编程常识,请关注我的公众号: 代码的路

July 15, 2022 · 1 min · jiezi

关于算法:自编码器-AEAutoEncoder程序

原文链接 1.程序解说(1)香草编码器在这种自编码器的最简略构造中,只有三个网络层,即只有一个暗藏层的神经网络。它的输出和输入是雷同的,可通过应用Adam优化器和均方误差损失函数,来学习如何重构输出。 在这里,如果隐含层维数(64)小于输出维数(784),则称这个编码器是有损的。通过这个束缚,来迫使神经网络来学习数据的压缩表征。 input_size = 784hidden_size = 64output_size = 784x = Input(shape=(input_size,))# Encoderh = Dense(hidden_size, activation='relu')(x)# Decoderr = Dense(output_size, activation='sigmoid')(h)autoencoder = Model(input=x, output=r)autoencoder.compile(optimizer='adam', loss='mse')Dense:Keras Dense层,keras.layers.core.Dense( units, activation=None) units, #代表该层的输入维度 activation=None, #激活函数.然而默认 liner Activation:激活层对一个层的输入施加激活函数 model.compile() :Model模型办法之一:compile optimizer:优化器,为预约义优化器名或优化器对象,参考优化器 loss:损失函数,为预约义损失函数名或一个指标函数,参考损失函数 adam:adaptive moment estimation,是对RMSProp优化器的更新。利用梯度的一阶矩预计和二阶矩预计动静调整每个参数的学习率。长处:每一次迭代学习率都有一个明确的范畴,使得参数变动很安稳。 mse:mean_squared_error,均方误差 (2)多层自编码器如果一个隐含层还不够,显然能够将主动编码器的隐含层数目进一步提高。 在这里,实现中应用了3个隐含层,而不是只有一个。任意一个隐含层都能够作为特色表征,然而为了使网络对称,咱们应用了最两头的网络层。 input_size = 784hidden_size = 128code_size = 64x = Input(shape=(input_size,))# Encoderhidden_1 = Dense(hidden_size, activation='relu')(x)h = Dense(code_size, activation='relu')(hidden_1)# Decoderhidden_2 = Dense(hidden_size, activation='relu')(h)r = Dense(input_size, activation='sigmoid')(hidden_2)autoencoder = Model(input=x, output=r)autoencoder.compile(optimizer='adam', loss='mse')(3)卷积自编码器除了全连贯层,自编码器也能利用到卷积层,原理是一样的,然而要应用3D矢量(如图像)而不是展平后的一维矢量。对输出图像进行下采样,以提供较小维度的潜在表征,来迫使自编码器从压缩后的数据进行学习。 x = Input(shape=(28, 28,1)) # Encoderconv1_1 = Conv2D(16, (3, 3), activation='relu', padding='same')(x)pool1 = MaxPooling2D((2, 2), padding='same')(conv1_1)conv1_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool1)pool2 = MaxPooling2D((2, 2), padding='same')(conv1_2)conv1_3 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool2)h = MaxPooling2D((2, 2), padding='same')(conv1_3)# Decoderconv2_1 = Conv2D(8, (3, 3), activation='relu', padding='same')(h)up1 = UpSampling2D((2, 2))(conv2_1)conv2_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(up1)up2 = UpSampling2D((2, 2))(conv2_2)conv2_3 = Conv2D(16, (3, 3), activation='relu')(up2)up3 = UpSampling2D((2, 2))(conv2_3)r = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up3)autoencoder = Model(input=x, output=r)autoencoder.compile(optimizer='adam', loss='mse')conv2d:Conv2D(filters, kernel_size, strides=(1, 1), padding='valid') ...

July 15, 2022 · 5 min · jiezi

关于算法:ArrayDequeJDK双端队列源码深度剖析

ArrayDeque(JDK双端队列)源码深度分析前言在本篇文章当中次要跟大家介绍JDK给咱们提供的一种用数组实现的双端队列,在之前的文章LinkedList源码分析当中咱们曾经介绍了一种双端队列,不过与ArrayDeque不同的是,LinkedList的双端队列应用双向链表实现的。 双端队列整体剖析咱们通常所议论到的队列都是一端进一端出,而双端队列的两端则都是可进可出。上面是双端队列的几个操作: 数据从双端队列左侧进入。数据从双端队列右侧进入。 数据从双端队列左侧弹出。 数据从双端队列右侧弹出。 而在ArrayDeque当中也给咱们提供了对应的办法去实现,比方上面这个例子就是上图对应的代码操作: public void test() { ArrayDeque<Integer> deque = new ArrayDeque<>(); deque.addLast(100); System.out.println(deque); deque.addFirst(55); System.out.println(deque); deque.addLast(-55); System.out.println(deque); deque.removeFirst(); System.out.println(deque); deque.removeLast(); System.out.println(deque);}// 输入后果[100][55, 100][55, 100, -55][100, -55][100]数组实现ArrayDeque(双端队列)的原理ArrayDeque底层是应用数组实现的,而且数组的长度必须是2的整数次幂,这么操作的起因是为了前面位运算好操作。在ArrayDeque当中有两个整形变量head和tail,别离指向右侧的第一个进入队列的数据和左侧第一个进行队列的数据,整个内存布局如下图所示: 其中tail指的地位没有数据,head指的地位存在数据。 当咱们须要从左往右减少数据时(入队),内存当中数据变动状况如下: 当咱们须要从右往做左减少数据时(入队),内存当中数据变动状况如下: 当咱们须要从右往左删除数据时(出队),内存当中数据变动状况如下: 当咱们须要从左往右删除数据时(出队),内存当中数据变动状况如下: 底层数据遍历程序和逻辑程序下面次要议论到的数组在内存当中的布局,然而他是具体的物理存储数据的程序,这个程序和咱们的逻辑上的程序是不一样的,依据下面的插入程序,咱们能够画出上面的图,大家能够仔细分析一下这个图的程序问题。 上图当中队列左侧的如队程序是0, 1, 2, 3,右侧入队的程序为15, 14, 13, 12, 11, 10, 9, 8,因而在逻辑上咱们的队列当中的数据布局如下图所示: 依据后面一大节谈到的输出在入队的时候数组当中数据的变动咱们能够晓得,数据在数组当中的布局为: ArrayDeque类关键字段剖析// 底层用于存储具体数据的数组transient Object[] elements;// 这就是后面谈到的 headtransient int head;// 与上文谈到的 tail 含意一样transient int tail;// MIN_INITIAL_CAPACITY 示意数组 elements 的最短长度private static final int MIN_INITIAL_CAPACITY = 8;以上就是ArrayDeque当中的最次要的字段,其含意还是比拟容易了解的! ...

July 15, 2022 · 3 min · jiezi

关于算法:指派问题之KM算法

July 14, 2022 · 0 min · jiezi

关于算法:面试官完全背包都不会是你自己走还是我送你

面试官:齐全背包都不会,是你本人走还是我送你?在现在的面试当中算法题曾经成为面试不可或缺的内容,明天就跟大家分享一个还比拟艰难的口试题——齐全背包。 齐全背包问题有$N$种物品和一个容量是 $V$的背包,每种物品都有有限件可用。第$i$ 种物品的体积是 $v_i$,价值是$w_i$。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。齐全背包问题和01背包的惟一区别就在于物品的个数,在01背包当中所有的物品只有一件,也就只能应用一次。而在齐全背包当中物品能够应用有限屡次。 比方上面的4个物品,背包可能接受的最大分量为5,咱们应该如何抉择,使得咱们取得的总价值最大: 物品分量价值A12B24C34D45这个问题还是比较简单,咱们间接从图中看,咱们能够抉择五个A或者两个B一个A,能够产生最大的收益,最大收益为10。 齐全背包问题剖析01背包动静转移方程剖析在01背包问题当中,咱们是应用一个二维数组dp[i][j]进行计算,dp[i][j]示意在只应用前i个物品且背包容量为j的状况下,咱们可能取得的最大的收益。在这个状况下,咱们依据以后背包容量j判断是否能装入第i个物品能够失去上面两个方程(上面公式字母的含意与上文齐全背包问题所提到的统一)。 $$dp[i][j] = \begin{cases}max(dp[i - 1][j - v[i]] + w[i], dp[i - 1][j]), j \ge v[i]\\dp[i - 1][j] , j \lt v[i]\end{cases}$$ 下面01背包的公式的第二条比较简单,如果背包容量不足以包容第i件物品,那么只能从前i - 1物品当中抉择了。咱们来仔细分析一下第一条公式。 如果以后背包容量能够包容第i个物品,那么咱们就能够抉择第i件物品或者不抉择,咱们应该抉择两种抉择当中收益更大的那个。 如果咱们不抉择第i个物品,那么咱们就可能应用容量为j的背包去抉择前i - 1个物品,这种状况下咱们的最大收益为dp[i - 1][j]。如果抉择第i个物品,那么咱们背包容量还剩下j - v[i],还能够抉择剩下的i - 1个物品,而且咱们的收益须要加上w[i],因而咱们的收益为dp[i - 1][j - v[i]] + w[i], dp[i - 1][j])。齐全背包动静转移方程剖析和01背包问题一样首先对于第i个物品,首先须要判断背包是否可能包容: 如果背包的容量大于等于第i个物品的体积,那咱们就有两种抉择: 将第i个物品放入背包当中,然而在这里须要留神的一点是齐全背包的物品有有数件,因而当咱们抉择之后咱们的转移方程为dp[i][j - v[i]] + w[i],这里不是i-1而是i,因为第i件物品有有数件。不将第i个物品放入背包当中,那么咱们就可能应用容量为j的背包去抉择前i - 1个物品,这种状况下咱们的最大收益为dp[i - 1][j]。如果背包容量小于第i件物品的体积,咱们就不可能抉择第i件物品了,这种状况下咱们的最大收益为dp[i - 1][j]。基于下面的剖析咱们能够晓得齐全背包问题的动静转移方程为: $$dp[i][j] = \begin{cases}max(dp[i][j - v[i]] + w[i], dp[i - 1][j]), j \ge v[i]\\dp[i - 1][j] , j \lt v[i]\end{cases}$$ ...

July 14, 2022 · 3 min · jiezi

关于算法:你真的懂01背包问题吗01背包的这几问你能答出来吗

你真的懂01背包问题吗?01背包的这几问你能答出来吗?对于01背包的几个问题背包问题的动静转移方程是怎么来的?你能解释背包问题的两个for循环的意义嘛?为什么须要两个for循环,一个循环行不行?01背包问题的for循环肯定要从0开始吗?01背包滚动数组的优化原理是什么?01背包只用不必二维数组只用一位数组的根据是什么?这些问题在浏览完本文之后你将会失去答案! 01背包问题介绍有 $N$件物品和一个容量是 $V$ 的背包。每件物品只能应用一次。第$i$件物品的体积是$v_i$,价值是 $w_i$。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。比方上面的4个物品,背包可能接受的最大分量为5,咱们应该如何抉择,使得咱们取得的总价值最大: 物品分量价值A12B24C34D45这个问题还是比较简单,咱们间接看就晓得抉择物品B和物品C失去的价值最大。那么咱们如何设计一个算法去实现这个问题呢?首先对于每一个物品都有两种状况,抉择和不抉择,咱们须要抉择两种状况当中可能获取最大价值的那种状况。 01背包问题动静转移方程首先我么先要确定一个信息就是没件物品只有一件,选完就没有了。如果咱们的背包当中还有残余容量能够放下某个物品,那么对于这个物品咱们就有两种抉择:选或者不选。 咱们定义数组dp[i][j],其含意是对于前i件物品,在咱们的背包容量为j的状况下咱们可能取得的最大的收益,如果咱们有N件物品,背包容量为V,那么咱们可能取得的最大价值为dp[N][V],因为他示意的是对于前N个物品,在背包容量为V的状况下咱们可能获取到的最大的价值。咱们能够失去上面的公式: $$dp[i][j]=max(dp[i - 1][j - v[i]] + w[i], dp[i - 1][j]),如果背包的容量大于等于物品 i 占的体积$$ $$dp[i][j]=dp[i - 1][j],如果背包的容量小于物品 i 占的体积$$ 第一种状况(背包容量大于等于第i件物品的体积v[i]时): 在这种状况下咱们对于第i件物品有两种抉择,一种是将其放入背包当中,另外一种就是不选他,那么咱们就能够应用容量为j的背包在前i-1件物品进行抉择。如果咱们选第i件物品,那么咱们背包剩下的容量就为j - v[i],咱们还能抉择的物品就是前i - 1个物品,这个状况下可能取得的最大的收益为$dp[i - 1][j - v[i]]$,再加上咱们抉择的第i件物品的价值,咱们抉择第i件物品可能取得的总收益为dp[i - 1][j - v[i]] + w[i]。如果咱们不抉择第i件物品,那么咱们背包残余容量依然为j,而且咱们只能从前i - 1 个商品当中进行抉择,那么咱们最大的收益就为dp[i - 1][j]。第二种状况(背包容量小于第i件物品的体积v[i]时): 这种状况下咱们只可能抉择前i - 1个商品,因而咱们可能获取的最大收益为dp[i - 1][j]。01背包数据依赖问题剖析在上文当中咱们曾经剖析进去了咱们的动静转移方程: $$dp[i][j]=max(dp[i - 1][j - v[i]] + w[i], dp[i - 1][j]),如果背包的容量大于等于物品 i 占的体积$$ $$dp[i][j]=dp[i - 1][j],如果背包的容量小于物品 i 占的体积$$ ...

July 13, 2022 · 4 min · jiezi

关于算法:HashMap源码深度剖析手把手带你分析每一行代码包会

HashMap源码深度分析,手把手带你剖析每一行代码!在后面的两篇文章哈希表的原理和200行代码带你写本人的HashMap(如果你浏览这篇文章感觉有点艰难,能够先浏览这两篇文章)当中咱们认真谈到了哈希表的原理并且本人入手应用线性探测法实现了咱们本人的哈希表MyHashMap。在本篇文章当中咱们将仔细分析JDK当中HashMap的源代码。 首先咱们须要理解的是一个容器最重要的四个性能 增删改查 ,而咱们也是次要依据这四个性能进行开展一步一步的分析HashMap的源代码。在正式进行源码剖析之前,先提一下:在JDK当中实现的HashMap解决哈希抵触的方法是应用链地址法,而咱们本人之前在文章200行代码带你写本人的HashMap当中实现的MyHashMap解决哈希抵触的方法是线性探测法,大家留神一下这两种办法的不同。 HashMap源码类中关键字段剖析上面字段示意默认的哈希表的长度,也就是HashMap底层应用数组的默认长度,在HashMap当中底层所应用的的数组的长度必须是2的整数次幂,这一点咱们在文章200行代码带你写本人的HashMap曾经认真做出了阐明。 /** * The default initial capacity - MUST be a power of two. */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16这个字段示意哈希表当中数组的最大长度,HashMap底层应用的数组长度不能超过这个值。 /** * The maximum capacity, used if a higher value is implicitly specified * by either of the constructors with arguments. * MUST be a power of two <= 1<<30. */ static final int MAXIMUM_CAPACITY = 1 << 30;字段DEFAULT_LOAD_FACTOR的作用示意在HashMap当中默认的负载因子的值。 /** * The load factor used when none specified in constructor. */ static final float DEFAULT_LOAD_FACTOR = 0.75f;在理论状况当中咱们并不是当HashMap当中的数组齐全被应用完之后才进行扩容,因为如果数组快被应用完之后,再退出数据产生哈希抵触的可能性就会很大,因而咱们通常会设置一个负载因子(load factor),当数组的使用率超过这个值的时候就进行扩容,即当(数组长度为L,数组当中数据个数为S,负载因子为F): ...

July 13, 2022 · 9 min · jiezi

关于算法:为什么很多人都在考阿里云ACP

最近有不少人都在问我,为什么阿里云ACP那么多人考,这个证书到底有什么用?简答来说,对于大多数人这个证书没有用,但对于想从事云计算行业的人来说,这个能够说是能帮他们取得更好待遇的好工具。如何你也在从事云计算行业,或者对这个行业感兴趣,就和小编一起理解一下吧。 阿里云ACP简介 对于当初的咱们来说,有一个货色咱们可能不懂,但肯定能感触失去,那就是科技对生存的影响,给社会带来的扭转。这些技术中最重要的是什么,那就是云计算技术,东数西算、人工智能、中小型服务器这些我的项目技术都基于云计算的技术倒退。 因为全球化趋势、后疫情时代的到来、智能化办公的潮流,越来越多的企业抉择转型上云,这也就带来了一个问题,稀少的云计算人才无奈满足宏大的市场需求,于是各大云企业接连推出了本人的云计算人才认证零碎,而阿里云ACP则是阿里云依据本人的产品搭建的人才认证零碎。 阿里云认证劣势 1、阿里云是目前国内市场占比最大的云计算企业,位于世界第三、亚洲第一,能够说阿里云的合作伙伴泛滥、服务行业宽泛。 2、阿里云是我国最早研发云计算技术的企业之一,而且直到现在,阿里云成为了我国惟一一家领有齐全自主研发的云计算零碎——飞天零碎的企业。 3、阿里云在金融、医疗、教育、制作等各行各业都有合作伙伴,而且多是头部企业,比方微博、知乎、中国联通、中石油等等。 4、阿里云认证搭建了一套残缺、体系化的学习课程,考生在认证学习的过程中,能够晋升本人的专业技能,在工作中更加熟能生巧。 5、阿里云的合作伙伴泛滥,如果通过了考试认证,个人信息则会被收录到阿里云的人才库中,能被阿里云的合作伙伴们看到,取得更多工作机会。 阿里云报名条件 其实阿里云报名不须要任何条件,只有年满十八岁,有身份证就能够报考,认证流程能够参考一下这篇文章 考试内容: 1、云服务器 ECS 2、弹性伸缩(Auto Scaling) 3、负载平衡 SLB 4、专有网络 VPC 5、对象存储 OSS 6、内容散发网络 CDN 7、平安(云盾、云平安) 8、云计算通用常识 考试工夫:120mon 考试模式:口试

July 12, 2022 · 1 min · jiezi

关于算法:指派问题之匈牙利算法

July 11, 2022 · 0 min · jiezi

关于算法:庖丁解牛斐波拉契数列和背包问题详细解析两个问题优化过程带你从最基本核心的问题看懂动态规划

庖丁解牛斐波拉契数列和背包问题——具体解析两个问题优化过程,带你从最根本的问题看懂动静布局!!!动静布局作为一种十分经典的一类算法,不仅在解决理论问题当中有很多理论的利用,同时通常也是面试的一个重点。本篇文章一步步分析动静布局的基本原理,通过斐波拉契数列问题(优化工夫复杂度从$O(2^n)$到O(n)再到O(log(n)))和经典的01背包问题一步一步带你从最根本的原理弄懂动静布局。咱们首先剖析斐波拉契数列问题,而后在剖析问题的时候缓缓的深刻动静布局。 本篇文章的篇章构造: 斐波拉契数列斐波拉契数列的定义如下(如果公式不能很好的渲染,请查看这篇同样内容而且可能渲染公式的文章): $$F_0 = 0$$ $$F_1 = 1$$ $$F_n = F_{n - 1} + F_{n- 2}$$ 就是斐波那契数列由0和1开始,之后的斐波那契数就是由之前的两数相加而得出。比如说在斐波拉契数列当中第一个数为0,第二个数为1,因而第三个数为后面两个数之和,因而第三个数为1,同理第四个数是第二个数和第三个数之和,因而第四个数为2,上面就是斐波拉契数的变动: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, .... 斐波拉契数列——递归法当初咱们的问题是要你求第n个斐波拉契数,这个问题还是比较简单的,很容易想到这就是一个能够递归解决的问题,在公式$F_n = F_{n - 1} + F_{n-2}$当中也容易看出应该应用递归。当初要确定的就是递归终止条件。 如果n == 0则返回0,如果n == 1则返回1,这就是递归终止条件。确定完递归终止条件之后咱们很容易写出上面这样的代码: public class Fibonacci { public static int fibonacci(int n) { if (n <= 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } public static void main(String[] args) { System.out.println(fibonacci(6)); }}当咱们求第6个斐波拉契数的时候,函数fibonacci的调用过程如下所示: ...

July 9, 2022 · 9 min · jiezi

关于算法:MATH1090-Problem

MATH1090 Problem Set No2 October 2021Lassonde School of EngineeringDept. of EECSProfessor G. TourlakisMATH1090 B. Problem Set No2Posted: Oct. 6, 2021Due: Oct. 29, 2021; by 2:00pm, in eClass.Q: How do I submit?A:(1) Submission must be a SINGLE standalonefile to eClass. Submission by email is notaccepted.(2) Accepted File Types: PNG, JPEG, PDF,RTF, MS WORD, OPEN OFFICE, ZIP(3) Deadline is strict, electronically limited.(4) MAXIMUM file size = 10MBPost’s Theorem use is not allowed in any questionbelow. ...

July 8, 2022 · 2 min · jiezi

关于算法:ENGGEN131-Marking

ENGGEN 131, Semester Two, 2021 - 1 - C Programming ProjectENGGEN131 C Project Marking CodeRunner is now set up for project marking. Please read this announcement carefully so youknow what to expect. DeadlinesYou can mark your project any time between now and the project deadline (Sat 23rd October at11:59pm). You are strongly encouraged to mark your project early, rather than leaving it untilthe last minute. CodeRunner has been configured so that you can mark one task at a time – youcan begin marking the tasks you have finished now, even if you haven’t finished the wholeproject. The “Precheck” feature is enabled for each task to let you check your syntax errorswithin CodeRunner. As recommended for the labs, you should use this feature only once youhave successfully compiled and executed your program for all kinds of test inputs in your IDE. ...

July 8, 2022 · 5 min · jiezi

关于算法:ArrayList源码深度剖析从最基本的扩容原理到魔幻的迭代器和fastfail机制你想要的这都有

ArrayList源码深度分析本篇文章次要跟大家剖析一下ArrayList的源代码。浏览本文你首先得对ArrayList有一些根本的理解,至多应用过它。如果你对ArrayList的一些根本应用还不太熟悉或者在浏览本文的时候感觉有点艰难,你能够先浏览这篇文章ArrayList设计与实现,本人入手写ArrayList。 ArrayList继承体系剖析 RandomAccess,这个接口的含意示意能够随机拜访ArrayList当中的数据,拿什么是随机拜访呢?随机拜访就是示意咱们能够在常量工夫复杂度内拜访数据,也就是工夫复杂度是O(1)。因为在ArrayList当中咱们应用的最根本的数据类型是数组,而数组是能够随机拜访的,比方像上面这样。 public static void main(String[] args) { int[] data = new int[10]; for (int i = 0; i < 10; i++) data[i] = i; System.out.println("data[5] = " + data[5]); }而链表是不能够随机拜访的,比如说咱们想通过下标拜访链表当中的某个数据,须要从头结点或者尾节点开始遍历,直到遍历到下标对应的数据,比方下图中的单链表找到第3个数据,须要从头开始遍历,而这个工夫复杂度为O(n)。 Serializable,这个接口次要用于序列化,所谓序列化就是能将对象写入磁盘,反序列化就是可能将对象从磁盘当中读取进去,如果想序列化和反序列化ArrayList的实例对象就必须实现这个接口,如果没有实现这个接口,在实例化的时候程序执行会报错,比方上面就是一个序列化的例子。import java.io.*;import java.util.Objects;class TestPerson implements Serializable{ String name; Integer age; private static final long serialVersionUID = 9999L; @Override public String toString() { return "TestPerson{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; TestPerson that = (TestPerson) o; return that.age.equals(this.age) && that.name.equals(this.name); } @Override public int hashCode() { return Objects.hash(name, age); } public TestPerson(String name, Integer age) { this.name = name; this.age = age; }}public class SerialTest { public static void main(String[] args) throws IOException, ClassNotFoundException { TestPerson leHung = new TestPerson("LeHung", 18); FileOutputStream os = new FileOutputStream("objtest"); ObjectOutputStream outputStream = new ObjectOutputStream(os); // 序列化数据 outputStream.writeObject(leHung); FileInputStream is = new FileInputStream("objtest"); ObjectInputStream stream = new ObjectInputStream(is); // 反序列化数据 TestPerson object = (TestPerson) stream.readObject(); System.out.println(object); System.out.println(object == leHung); System.out.println(object.equals(leHung)); }}如果下面程序当中的TestPerson没有implements Serializable,则上述代码会报异样java.io.NotSerializableException:。 ...

July 7, 2022 · 8 min · jiezi

关于算法:分类TAB商品流多目标排序模型的演进

1. 概述分类TAB商品流是得物app购买页面内除“举荐”页外的所有TAB内的商品举荐流,如“鞋类”、“箱包”等。当用户进入分类TAB中,咱们能够简化为给定<userId, tabId, itemId> 三元组的商品流举荐,能够看出,分类TAB的举荐场景跟其余“开放式”举荐场景的最大差别在于,是限定条件下(品类)的举荐,与搜寻场景有一点类似度,分类TAB代表着用户的品类用意。以咱们目前的迭代进度,现阶段次要聚焦于<userId, ItemId>的二元建模,实际上<userId, tabId>,即用户的行为与TAB的相关性,以及<tabId, itemId>,即TAB与商品的相关性,是咱们后续进行差异化建模须要着重思考的;以下的相干停顿次要讲述较为通用的商品举荐模型的落地迭代。咱们以多指标排序模型作为精排策略。 2. 模型2.1 Base ESMM从多指标学习范式上,咱们抉择ESMM模型的范式作为咱们的精排模型,对于ESMM的介绍在这里咱们不做过多论述,详情参考论文。从论文中,咱们可知ESMM的架构如下: 业务上的baseline 模型,是将上图中的MLP layer 替换为DeepFM模型的构造,退出FM构造学习穿插信息。但从整体上该模型依然较为浅层,没有对用户的信息表征做更多的抽取,为此咱们将模型构造进行了降级。 2.2 模型整体构造咱们现阶段的建模是<userId, itemId>,从样本表征的角度看,item是比拟浓密而且稳固的局部,在大样本的环境下,大部分信息都可能被id embedding所表白,相同,user局部是比拟稠密的局部,而对于user的形容,则须要大量的泛化特色,用户序列行为的引入和建模,可大大加强样本之间的辨别性,从而晋升模型的分类性能。因而咱们引入用户建模模块来表征用户趣味。 从模型的整体构造上,咱们不扭转ESMM的学习范式,咱们只对生成ctr logits、cvr logits的构造做改良,整体模型构造如图: 其中Deep Interest Transformer构造如下图: 从整体上看,咱们能够看出,对于ctr 工作和cvr工作,每个工作都有各自的main net和bias net;用户趣味建模模块学习出的用户向量被两个工作所共享,即interest transformer 作为一个信息抽取模块,抽取的信息与其余诸如cross features的表征进行concat,独特作为底层的共享信息。 2.2.1 用户行为序列建模咱们认为用户的行为与其下一个点击的商品具备相关性,或是雷同类目、品牌或系列等重要属性。为了拆解和剖析用户行为序列与举荐商品的相关性对举荐效率的影响,咱们以商品的三级类目为剖析维度,如下: 咱们以tab商品流线上用户的行为日志进行剖析,绘出target item 的三级类目与用户行为序列商品的三级类目标关系对举荐效率的影响,如下图: 横坐标是形容举荐商品的类目与用户行为序列的商品的类目,其序列中雷同三级类目标行为商品数量;纵坐标则是pvctr;从整体趋势上来看,target item的类目与用户行为序列中的商品类目越相干,pvctr越高。当然,从直觉上,点击序列越长(用户活跃度越高)是否点击率就越高,为此咱们剖析了序列长度与pvctr的关系,如下图: 显然,用户活跃度的偏差也影响了pvctr,但通过比照,能够显著看出,用户活跃度对pvctr的影响,其趋势是小的(斜率);而举荐商品的类目与用户行为序列中的商品类目相关性的趋势是绝对显著的。 而如何去建模打分商品与用户行为序列的相关性,attention显然是一种牢靠的办法,self-attention能够建模用户行为序列中的各个商品之间的相关性,而target-attention则是建模候选商品与用户行为序列的相关性的办法。 模型中的Deep Interest Transformer 是学习用户表征的构造,咱们选取用户的行为序列:实时购买、点击立刻购买、珍藏、点击商品行为,7天内的购买、点击立刻购买、珍藏、点击商品行为,交融出一个长达120长度的用户行为序列,超出长度局部做截断,有余的长度进行默认填充。 Deep Interest Transformer 首先对用户的行为序列进行multi-head self-attention,以此学习序列中各个元素间的相关性,此为对用户序列进行encode;对于待打分商品,咱们称其为target item,咱们进行decode时,是将target item 的embedding示意作为attention中的Q,而用户序列的encode示意的向量作为attention中的K、V,此为target-attention,即对于不同的打分item,计算该item与用户行为序列中的元素的相关性,因而对于不同的target item,其所激活的用户行为序列的元素有所不同,从而生成不同的用户趣味向量,最终将无效的辨别不同target item的打分。 2.2.2 bias 网络举荐零碎中存在各种各样的bias,对于tab商品流,咱们从几个维度来剖析用户自身的bias,如用户的性别、应用设施、注册地。 比照图省略,图意为,不同的用户群体存在着不同的偏差,如男性用户对酒饮、手表类目点击率较高而女性用户则在美妆和女装类目点击率较高;Android用户对数码类目点击率较高而iOS用户低;咱们抉择国内东南西北四个具备代表性的地区(上海、广东、四川、北京)进行剖析,发现诸如酒饮、潮玩、配饰等类目,具备显著的地区偏差。为显式地建模这种bias,咱们为每个工作减少了一个bias net,每个工作独自减少了一个网络进行建模,其输入的logits与主网络进行相加。bias net 在此阶段中,咱们只用了用户的特色作为bias net 的输出。这个独自的网络是用于建模用户本身的bias,比方有些用户偏差于逛逛但不点击,有些用户却又具备较高的点击率,即活跃度的差别等等。在这种状况下,应用一个独自的bias net去建模这种用户本身与举荐后果无关的bias,是一种绝对于单纯减少bias特色在主网络中学习而言更无效的办法。 更个别的来讲,bias net不仅仅局限于仅用user embedding进行输出。举荐零碎有许多bias,这些bias如果单纯的作为特色用以主网络输出,成果将不如独自用一个bias net来学习这些偏差。bias net不仅能够建模用户对于position的点击偏差, 还能够建模用户对于工夫特色的偏差,能够更个别的将用户向量和各种偏差特色的示意进行concat,而后输出bias net 进行学习。 ...

July 7, 2022 · 1 min · jiezi

关于算法:RCGI-专栏-海外社交市场调研之应用篇

RCGI(RongCloud Global Insight)是融云行业研究院特地推出的剖析洞察专栏,聚焦社交、泛娱乐行业,立足寰球视线,解析用户需要,洞悉市场走势。关注【融云寰球互联网通信云】理解更多 此前的专栏文章中,咱们以“地区”为标签与大家一起梳理了寰球各大区总览,以及发达地区、倒退地区的社交市场特色等社交出海要害信息。 本文将重点关注“利用”,从寰球出名的综合类社交利用及以某一个性感动用户、关上市场的特色类社交利用两方面,开掘社交利用身上那些值得出海开发者们参考的胜利因素。 特色玩家变现小王子 Kakao TalkKakao Talk 是来自韩国的一款社交聊天软件,为寰球 1 亿多用户提供服务,目前已在 200 多个国家应用,反对 12 种语言。 除了文字信息、图片和音视频外,Kakao 还反对多人聊天、收费电话、变声等性能,当用户不在线时,能以短信的模式来告诉用户。 Kakao 以理论电话号码来治理好友,能够通过手机通讯录主动匹配好友。电子商务、付费表情、Plus Friend 广告和游戏平台独特形成了 Kakao 的独特气质,也是其次要盈利模式。 电子商务2010 年 12 月,KaKao 针对韩国地区用户推出 Gift 服务,用户能够在利用内购买咖啡或巧克力等小商品的优惠券发送给敌人,敌人凭借这些优惠券到线下实体商店中兑换。 尽管这些商品客单价不高,但对敌人之间增进感情提供了一个新渠道。约 320 家品牌商的 7700 个商品应用该性能。据理解,到了情人节,该性能的单月营收能够达到 20 亿韩元(约 1040 万元)。 付费表情在表情商店中,除了收费的表情,还有公司本人制作、开发者或者其它企业提供的相干产品表情,用户应用这些更丰盛的表情须要付费。7 月份的数据显示,付费表情的单日平均收入约 1 亿韩元(52 万元)。 Plus Friend 广告Plus Friend 性能与公众号相似,包含娱乐明星、品牌商户等账号。 用户抉择关注这些账号后,会承受到他们发来的广告等信息。这时,企业就须要向 KaKao 领取肯定的费用。KaKao Plus Friend 中的广告客户达到了 200 家,吸引了 6600 万用户的关注。 游戏平台2014 年 7 月份上线游戏平台,KaKao 的韩国用户能够在该平台看到诸多游戏利用。 通过 KaKao 的用户关系链,用户在玩游戏时能看到 KaKao 好友的排名,也能够相互分享战绩。最重要的是,游戏里增加了道具性能,有道具时游戏能力持续玩上来,用户能够花钱买,也能够让敌人赠送。 ...

July 5, 2022 · 2 min · jiezi

关于算法:运筹优化工具ortools解读与实践MIP求解器与CPSAT求解器对比

1.前言前文咱们提到,CP-SAT不仅能够解决束缚布局问题,还能够解决整数布局、混合整数布局等指标优化问题,并在前文中用车间调度案例做了阐明。 本文次要比照两种不同的求解器的差别,咱们从一个案例说起。 2.调配问题的两种解法问题假如一家出租车公司有四个客户在等车,四个出租车司机(工人)能够接他们,工作是给每个客户调配一名司机去接他们。工作的老本是司机接一个特定客户所破费的工夫。问题是,如何将司机调配给客户,以最小化总等待时间。 如下图所示,右边的节点示意worker(司机)。左边的节点示意工作(客户),这些边示意将工作人员调配给工作的所有可能办法。 用表格模式示意如下: MIP问题求解底层采纳SCIP求解器 from ortools.linear_solver import pywraplpdef main(): # 数据,存储不同work-task匹配时的cost costs = [ [90, 80, 75, 70], [35, 85, 55, 65], [125, 95, 90, 95], [45, 110, 95, 115], [50, 100, 90, 100], ] num_workers = len(costs) num_tasks = len(costs[0]) # SCIP求解器. solver = pywraplp.Solver.CreateSolver('SCIP') # 决策变量 # x[i, j] 存储0-1值, 如果将worker i 和 task j进行匹配,则设置为1. x = {} for i in range(num_workers): for j in range(num_tasks): x[i, j] = solver.IntVar(0, 1, '') # 束缚1:一个worker 最多安顿一个task. for i in range(num_workers): #solver本身提供sum等针对var的数值操作 solver.Add(solver.Sum([x[i, j] for j in range(num_tasks)]) <= 1) # 束缚2:一个task只安顿给1个worker. for j in range(num_tasks): solver.Add(solver.Sum([x[i, j] for i in range(num_workers)]) == 1) # 指标函数 objective_terms = [] for i in range(num_workers): for j in range(num_tasks): objective_terms.append(costs[i][j] * x[i, j]) solver.Minimize(solver.Sum(objective_terms)) # Solve status = solver.Solve() # Print solution. if status == pywraplp.Solver.OPTIMAL or status == pywraplp.Solver.FEASIBLE: print(f'Total cost = {solver.Objective().Value()}\n') for i in range(num_workers): for j in range(num_tasks): # Test if x[i,j] is 1 (with tolerance for floating point arithmetic). if x[i, j].solution_value() > 0.5: print(f'Worker {i} assigned to task {j}.' + f' Cost: {costs[i][j]}') else: print('No solution found.')if __name__ == '__main__': main()CP-SAT求解from ortools.sat.python import cp_modeldef main(): # 数据,存储不同work-task匹配时的cost costs = [ [90, 80, 75, 70], [35, 85, 55, 65], [125, 95, 90, 95], [45, 110, 95, 115], [50, 100, 90, 100], ] num_workers = len(costs) num_tasks = len(costs[0]) # CP-SAT model = cp_model.CpModel() # 变量 x = [] for i in range(num_workers): t = [] for j in range(num_tasks): t.append(model.NewBoolVar(f'x[{i},{j}]')) x.append(t) # Constraints # Each worker is assigned to at most one task. for i in range(num_workers): model.AddAtMostOne(x[i][j] for j in range(num_tasks)) # Each task is assigned to exactly one worker. for j in range(num_tasks): model.AddExactlyOne(x[i][j] for i in range(num_workers)) # Objective objective_terms = [] for i in range(num_workers): for j in range(num_tasks): objective_terms.append(costs[i][j] * x[i][j]) model.Minimize(sum(objective_terms)) # Solve solver = cp_model.CpSolver() status = solver.Solve(model) # Print solution. if status == cp_model.OPTIMAL or status == cp_model.FEASIBLE: print(f'Total cost = {solver.ObjectiveValue()}') print() for i in range(num_workers): for j in range(num_tasks): if solver.BooleanValue(x[i][j]): print( f'Worker {i} assigned to task {j} Cost = {costs[i][j]}') else: print('No solution found.')if __name__ == '__main__': main()3.比照适用性实践上, ...

July 5, 2022 · 2 min · jiezi

关于算法:运筹优化工具ortools解读与实践CPSAT应用案例

上一篇文章咱们介绍了CP-SAT的简略用法,以及CP-SAT蕴含的不同变量、束缚函数。实际出真知,本篇文章将用几个例子加深对CP-SAT应用的了解。 1.员工排班问题形容医院主管须要为四名护士创立一个为期三天的时间表,但必须满足以下条件: 每天被分成三个8小时的班次。 每天,每个轮班调配给一名护士,没有护士的工作超过一班。 在三天的工作期间,每个护士至多要上两班。 代码及解读from ortools.sat.python import cp_modelclass NursesPartialSolutionPrinter(cp_model.CpSolverSolutionCallback): def __init__(self, shifts, num_nurses, num_days, num_shifts, sols): cp_model.CpSolverSolutionCallback.__init__(self) self._shifts = shifts self._num_nurses = num_nurses self._num_days = num_days self._num_shifts = num_shifts self._solutions = set(sols) self._solution_count = 0 #回调函数,每产生一个solution会调用一次回调函数。这里对回调函数进行重写。 def on_solution_callback(self): self._solution_count += 1 if self._solution_count in self._solutions: print('Solution %i' % self._solution_count) for d in range(self._num_days): print('Day %i' % d) for n in range(self._num_nurses): is_working = False for s in range(self._num_shifts): if self.Value(self._shifts[(n, d, s)]): is_working = True print(' Nurse %i works shift %i' % (n, s)) if not is_working: print(' Nurse {} does not work'.format(n)) print() def solution_count(self): return self._solution_countdef main(): # Data. num_nurses = 4 # 护士数量 num_shifts = 3 # 每天班次 num_days = 3 # 一共要排多少天班 all_nurses = list(range(num_nurses)) all_shifts = list(range(num_shifts)) all_days = list(range(num_days)) # 创立cp-sat求解器 model = cp_model.CpModel() # 创立0-1布尔变量变量,shifts[(n, d, s)]:示意护士n被调配到第d天的第s个班次 shifts = {} for n in all_nurses: for d in all_days: for s in all_shifts: shifts[(n, d, s)] = model.NewBoolVar('shift_n%id%is%i' % (n, d, s)) # 增加束缚,每个班次都必须有一名护士 for d in all_days: for s in all_shifts: model.Add(sum(shifts[(n, d, s)] for n in all_nurses) == 1) # 增加束缚,每个护士一天最多只能做一个班次 for n in all_nurses: for d in all_days: model.Add(sum(shifts[(n, d, s)] for s in all_shifts) <= 1) # 如何尽可能均匀地调配护士轮班,因为三天有九班,咱们能够给四名护士每人调配两班。 # 之后还会有一个班次,能够调配给任何护士。 # 以下代码确保每位护士在三天的工作期间至多上两班。 # min_shifts_per_nurse 每个护士至多调配的班次数量 # max_shifts_per_nurse 每个护士至少调配的班次数量 min_shifts_per_nurse = (num_shifts * num_days) // num_nurses max_shifts_per_nurse = min_shifts_per_nurse + 1 for n in all_nurses: num_shifts_worked = sum( shifts[(n, d, s)] for d in all_days for s in all_shifts) model.Add(min_shifts_per_nurse <= num_shifts_worked) model.Add(num_shifts_worked <= max_shifts_per_nurse) # 求解问题 solver = cp_model.CpSolver() # 展现后果(只展现5条后果) a_few_solutions = range(5) solution_printer = NursesPartialSolutionPrinter( shifts, num_nurses, num_days, num_shifts, a_few_solutions) solver.SearchForAllSolutions(model, solution_printer) # 统计分析. print() print('Statistics') print(' - conflicts : %i' % solver.NumConflicts()) print(' - branches : %i' % solver.NumBranches()) print(' - wall time : %f ms' % solver.WallTime()) print(' - solutions found : %i' % solution_printer.solution_count())if __name__ == '__main__': main()2.车间调度问题形容作业车间中,在多台机器上解决多个作业。每个作业由一系列工作组成,这些工作必须依照给定的程序执行,并且每个工作必须在特定的机器上进行解决。例如,该工作能够是生产单个消费品,例如汽车。问题是将工作安顿在机器上,以最小化打算的长度——所有作业实现所需的工夫。 ...

July 2, 2022 · 4 min · jiezi

关于算法:力扣之买卖股票的最佳时机

题目形容给定一个数组 prices ,它的第 i 个元素 prices[i] 示意一支给定股票第 i 天的价格。 你只能抉择 某一天 买入这只股票,并抉择在 将来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你能够从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。 示例 1: 输出:[7,1,5,3,6,4]输入:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 留神利润不能是 7-1 = 6, 因为卖出价格须要大于买入价格;同时,你不能在买入前卖出股票。示例 2: 输出:prices = [7,6,4,3,1]输入:0解释:在这种状况下, 没有交易实现, 所以最大利润为 0。力扣原题目地址:https://leetcode.cn/problems/...思路剖析对于这道题目,能够两次循环暴力求后果,不过不太好,此处不说暴力求解后果的代码形式(附在最初)。 咱们个别遇到一个简单问题的时候,能够把简单问题进行简化拆解,在解决简化拆解问题的时候,寻找法则、发现法则,最终在简单问题上应用咱们之前发现的简化问题类似的法则,从而解决之 比方老板上来就让咱们制作一个原子弹,啊,不会啊。没关系咱们先钻研一下,如何制作一个手榴弹。反正都是蛋嘛,都是爆炸用的,总是有相通之处,手榴弹制作进去了,原子弹也就快了。这个比喻不太失当,反正是那个意思,大家自行领会哈 ^_^浏览题目当前咱们大略晓得需要如下: 要想取得最高收益,就必须在低位买进、高位卖出 即:找到数组中的最大值,最小值,最大减最小就是最高收益股票是,先买后卖。所以买股票的工夫靠前、卖股票的工夫靠后 即:最小值的地位索引要小于最大值的地位索引问题是,咱们临时不晓得那天买进股票最低,那天最高???罗唆,咱们就假如,头一天股票最低,3块钱就能买,前面股票涨涨跌跌,然而,始终没有低于3块的。所以头一天买进最划算。咱们以5天为周期,刷卡付款头一天买了。于是就模仿定义一个数组:let arr = [3,8,6,12,9],接下来,咱们把问题转化成: 已知第一天买的股价最低,前面的每一天都比第一天股价高,求那一天卖掉最多能赚多少钱 简单问题拆解之简化于是咱们依据需要,能够写出上面的代码: let arr = [3, 8, 6, 12, 9]function maxProfit(prices) { // 1. 假如初始收益为0,前面每一天的价格减去第一天的买入价格就是收益 let maxProfitValue = 0 for (let i = 1; i < prices.length; i++) { // 2. 只有收益大的(收益大的记在本子上,收益小的划掉不要) maxProfitValue = Math.max(maxProfitValue, prices[i] - 3) } // 3. 最终失去一个最大收益,并返回 return maxProfitValue;}console.log( maxProfit(arr) ); // 9上述代码 maxProfitValue = Math.max(maxProfitValue, prices[i] - 3)咱们能够换一下写法,因为3是第一天的价格,所以换成arr[0] 即: ...

July 1, 2022 · 2 min · jiezi

关于算法:运筹优化工具ortools解读与实践ortools求解CP问题

1.前言如前文所说,束缚布局(CP)指求解满足各项束缚的可行解的问题。与线性规划、整数布局不同,束缚布局更加关注可行解,没有明确的优化指标。典型的场景包含员工排班问题、N皇后问题。CP问题尽管没有指标函数,但能够通过指标增加到束缚的形式放大到更易于治理的子集,变相解决整数布局问题。 ortools提供了 CP-SAT 求解器,其应用办法与MPSolver相似。接下来,咱们看看CP-SAT是如何解决CP问题以及MIP问题的。 2.求解CP问题问题如下: 有变量x, y,z,取值范畴均为为 0, 1, 2,约束条件: x ≠ y,求满足条件的x,y,z组合。代码及解说如下,这里采纳硬编码方式。 #引入cp_model,便于后续构建CP-SAT求解器对应模型from ortools.sat.python import cp_model#回调类,每失去一个后果均执行on_solution_callback函数class VarArraySolutionPrinter(cp_model.CpSolverSolutionCallback): """Print intermediate solutions.""" def __init__(self, variables): cp_model.CpSolverSolutionCallback.__init__(self) self.__variables = variables self.__solution_count = 0 def on_solution_callback(self): self.__solution_count += 1 for v in self.__variables: print('%s=%i' % (v, self.Value(v)), end=' ') print() def solution_count(self): return self.__solution_countdef SearchForAllSolutionsSampleSat(): """Showcases calling the solver to search for all solutions.""" # 创立模型 model = cp_model.CpModel() # 创立变量 num_vals = 3 x = model.NewIntVar(0, num_vals - 1, 'x') y = model.NewIntVar(0, num_vals - 1, 'y') z = model.NewIntVar(0, num_vals - 1, 'z') # 创立束缚. model.Add(x != y) # 创立求解器并求解. solver = cp_model.CpSolver() # 定义回调对象 solution_printer = VarArraySolutionPrinter([x, y, z]) # 批改求解器参数:枚举所有后果 solver.parameters.enumerate_all_solutions = True # 求解过程 status = solver.Solve(model, solution_printer) print('Status = %s' % solver.StatusName(status)) print('Number of solutions found: %i' % solution_printer.solution_count())SearchForAllSolutionsSampleSat()3.求解MIP问题问题如下: ...

June 29, 2022 · 4 min · jiezi

关于算法:力扣之两数之和

题目形容给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。 你能够假如每种输出只会对应一个答案。然而,数组中同一个元素在答案里不能反复呈现。 你能够按任意程序返回答案。 示例 1: 输出:nums = [2,7,11,15], target = 9输入:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2: 输出:nums = [3,2,4], target = 6输入:[1,2]示例 3: 输出:nums = [3,3], target = 6输入:[0,1]力扣原题目地址:https://leetcode.cn/problems/...咱们来看一下解决方案...四种计划,层层递进,次要还是思路... 计划一,间接两层循环判断值是否相等var twoSum = function (nums, target) { for (let i = 0; i < nums.length; i++) { // j=i+1即:下一项==以后项+1 因为要一直和下一项相加看看是否等于target for (let j = i + 1; j < nums.length; j++) { if (nums[i] + nums[j] === target) { return [i, j] } } } };这种形式能够了解为暴力破解的形式,要循环两次工夫复杂度为O(n) * O(n)即为O(n²),太慢了,咱们看看有没有优化形式计划二,应用数组判断另一个值是否存在思路:咱们曾经晓得两数之和的target了,同时在遍历的时候,也能拿到一个数nums[i],至于另外一个数,咱们能够总和减去一个数即:otherVal = target - nums[i],而后再看看另外一个数otherVal是否在这个数组外面,当然不能间接看,间接看又得循环一遍了,所以咱们能够新定义一个数组,把数组中的树一次追加进去,直到发现新数组中的某一项中有另外一个数,也就是说新数组中的这一项加上nums[i]刚好是等于target,这样的话,就实现工作了,代码如下: ...

June 28, 2022 · 2 min · jiezi

关于算法:YAYA-LIVE-CTO-唐鸿斌真正本地化要让产品没有产地属性

直播,“泰”火啦!关注【融云寰球互联网通信云】理解更多疫情让泰国旅游业蒙受重创,却也为另一个产业的倒退按下了减速键,那就是以直播为代表的线上娱乐业。泰国作为国内互联网出海的热门市场,吸引了不少直播产品布局扎根。 他们中有的早就实现当地建设,在疫情下克服出差、防疫等难题,迎接用户涌入和营收增长。还有一类企业,疫情后果决入局,依附成熟打法和坚定信念,紧紧抓住下半场的市场红利,比方直播老将杨卫东开办的 YAYA LIVE。 YAYA LIVE 在 2020 年底上线,仅一个月便吸引上千名当地网红、多位当红明星成为签约主播,一度力压 Hago、MICO 等利用,位列泰国直播滞销榜 TOP3。 这背地,是整个团队深厚的行业积攒和对系统打法的高效执行。这套方法论,总结自他们在海内市场的多场硬仗。而今,YAYA LIVE 又带着这套打法进入了印尼市场,开启另一个故事。当然,成熟模式的多地复制,也并非手到擒来,尤其是身为后起之秀面临并不广大的市场空间时。 躬身入局,后来者如何打出差别和特色?出海风起,寰球布局怎么应答市场新挑战? 作为陪伴 YAYA LIVE 一路走来的通信云合作伙伴,咱们有幸请到 YAYA LIVE CTO 唐鸿斌深刻聊聊一路走来的种种。唐鸿斌YAYA LIVE CTO 置信能够为关注海内市场,意欲寰球倒退的企业带来参考和启发。 搭乘时光机,出海东南亚直播行业在国内曾经倒退了十几年,造成了技术提供、设施提供、MCN 机构和直播平台为主的产业链条,积淀出了带货、广告、礼物“变现三宝”,甚至扭转了国内的待业市场场面。 主播成了很多年轻人的幻想职业,数据显示,我国主播账号过亿,直播这一创作者经济状态的微小吸引力可见一斑。艾媒征询数据显示,2021 年我国的在线直播用户规模达到 6.35 亿人,五年间以席卷之势实现了翻倍增长。而当咱们把时针拨回到 YAYA LIVE 上线的 2020 年,国内这一数据也曾经高达 5.87 亿,进入了充沛竞争且用户增长见顶的艰难模式。 领有多年直播行业从业教训,简直经验了行业倒退整个过程的唐鸿斌认为,“直播这个行业如果还有什么机会的话,那肯定是出海带来的”。于是他作为 CTO 退出 YAYA LIVE,开启了东南亚直播市场的征战之旅。创作者经济,内容为先。在这方面,YAYA LIVE 从一开始就制订了十分欠缺的产品和品牌策略。YAYA LIVE 聚焦凋谢、时尚、热衷娱乐的泰国年轻人群体,打造高端内容为外围的直播品牌。 在获客形式上,相较买量投放的短期规模增长,YAYA LIVE 抉择了另一条更具长期价值的路线——明星单干。 YAYA LIVE 签约泰国年轻人群体中好感度十分高的“一线大花”TAEW(道妹)负责代言人,道妹在 YAYA LIVE 上开直播,在社交媒体上为其宣传引流,迅速圈定了一批高质量主播和用户,造成口口相传的好口碑。(泰国三台演员道妹代言 YAYA LIVE) 在品牌调性上,不同于公众此前对于直播这种家养、草根内容生态的偏见意识,尤其是局部平台在变现压力下动作走形造成的粗鄙风尚,YAYA LIVE 有严格的主播面试培训制度和内容监管体系,着重疏导主播生成趣味、娱乐、衰弱的优质内容,先后策动了歌手较量、舞蹈较量、宋干节(泰国传统节日,又称泰国泼水节)传统服饰 Cosplay 等官网流动。 在功能设计上,YAYA LIVE 交融了直播+短视频+语聊房+社交的内容模式,以及 PK、礼物、游戏等晋升活跃度的性能。 ...

June 28, 2022 · 1 min · jiezi

关于算法:MindSpore易点通分布式并行经验总结

1 简略介绍现如今数据的存储越来越多,想要进步算力的话,其实咱们能够进步分布式计算。所谓分布式计算就是在两个或多个软件相互共享信息,这些软件既能够在同一台计算机上运行,也能够在通过网络连接起来的多台计算机上运行。分布式并行训练,能够升高对内存、计算性能等硬件的需要,是进行训练的重要优化伎俩。 而咱们昇思MindSpore的个性之一就是交融了数据并行、模型并行和混合并行,构建一种易用高效的分布式并行训练模式,让算法人员不再须要关注算法模型到底须要用哪种模式训练。能够简化分布式并行编程,串行代码实现分布式训练,对用户屏蔽并行细节,并且放弃高性能;计算逻辑上放弃和单卡串行流程统一;实现上对立数据并行和模型并行,一套框架反对多种并行模式;联合集群拓扑优化性能。 2 解决方案介绍了这么多,当初就让咱们具体来看看论坛中的小伙伴们在分布式并行方面遇到了哪些问题并且如何解决的吧~ 同学A应用了BERT的masked language model预训练方法,应用数据并行和模型并行进行训练,训练过程中发现loss并不降落,定位问题发现dataset生成数据时有个随机mask的操作,在不同过程两头随机后果会不统一。 参考链接:https://bbs.huaweicloud.com/f... 同学B在docker内装置nccl时,因为一开始建设容器的时候没有设置容许共享内存,应用nccl-tests测试会进行报错。 参考链接:https://bbs.huaweicloud.com/f... 同学C在Ascend上进行多机/多卡训练时遇到load task fail报错,首先能够查看其它卡的plog,而后设置缩短每张卡的最大期待时长。 参考链接:https://bbs.huaweicloud.com/f... 同学D 在MindSpore并行模式配置时,谬误应用了semi_parallel模式。 参考链接:https://bbs.huaweicloud.com/f... 同学E 也遇到了上述相似问题,PyNative配置为semi_auto_parallel模式时遇到报错。 参考链接:https://bbs.huaweicloud.com/f... 同学F误认为并行反对非2的幂次方的并行切分进而报错。 参考链接:https://bbs.huaweicloud.com/f... 3 实际剖析 3.1 整体概述当然用户们对MindSpore的分布式并行模块也有本人的整体认知和了解:https://bbs.huaweicloud.com/f...; https://bbs.huaweicloud.com/f... 3.2 并行个性同时半自动并行和全自动并行这两大个性的应用办法也被用户们悉数把握。 比方采纳半自动并行模式,展现了一个从数据到模型的并行转换的案例。 https://bbs.huaweicloud.com/f... 而后仅用一行代码实现了单机脚本的全自动分布式并行。 https://bbs.huaweicloud.com/f... 3.3 分布式训练通信办法有总体的认知,具体算子用法当然也不会少啦! 比方MindSpore分布式并行训练中的Broadcast、AllGather、ReduceScatter以及AllReduce分布式训练通信办法。 1.Broadcast——汇合通信原语相干操作被封装py文件中,对该文件中波及汇合通信的内容进行具体查看解析:https://bbs.huaweicloud.com/f... 2.AllGather——对于散发在所有过程上的一组数据来说,Allgather会收集所有数据到所有过程上:https://bbs.huaweicloud.com/f... 3.ReduceScatte——实现通信算子的主动微分,为AllGather提供反向算子:https://bbs.huaweicloud.com/f... 4.AllReduce——Allreduce将归约值并将后果调配给所有过程:https://bbs.huaweicloud.com/f... 3.4 硬件平台辨别这里有个知识点须要揭示大家留神!分布式并行因为其硬件平台的不同有的时候也会有点小扭转。 比方在GPU硬件平台上,MindSpore分布式并行训练的通信应用的是NCCL,采纳的多过程通信库是OpenMPI。 参考链接:https://bbs.huaweicloud.com/f... 而对于Ascend AI处理器,MindSpore分布式并行训练的通信应用了华为汇合通信库HCCL。 参考链接:https://bbs.huaweicloud.com/f... 3.5 大V博文其实咱们官网也有MindSpore并行个性介绍,同时首席构架师金雪锋大佬给出了更加全面的总结,欢送大家多多关注。 AI框架的分布式并行能力的剖析和MindSpore的实际一混合并行和主动并行: https://bbs.huaweicloud.com/f... 盘古大模型的推理解决方案:增量推理+分布式推理: https://bbs.huaweicloud.com/f... 心愿这期的干货汇总可能小小地帮忙到大家,当然啦,遇到其余相干问题也欢送来咱们论坛一起交换解决,欢送各位开发者们多多奉献~

June 28, 2022 · 1 min · jiezi

关于算法:Windows-11安装TinyMS-031

张小白已经在 https://bbs.huaweicloud.com/b... 写过如何在windows 11预览版的wsl ubuntu 18.04环境中,装置TinyMS,可是有网友非要装置在Windows上。这也不是不能够,然而家喻户晓,MindSpore Windows版本还不反对GPU(CUDA)。然而既然有用户要这么玩,那张小白也就试一试吧。 依据 https://tinyms.readthedocs.io... 的形式装置: 进入Anaconda Prompt,创立conda python3.7.5的环境: 7.jpg conda create -n tinyms python=3.7.5 1.png 按Y持续: 2.jpg 急躁期待下载及装置完结后,进入conda环境: conda activate tinyms 3.jpg 装置tinyms: pip install tinyms==0.3.1 -i http://mirrors.aliyun.com/pyp... --trusted-host=mirrors.aliyun.com 4.jpg 5.jpg 装置结束后,进行验证: python下输出: import tinyms as tsfrom tinyms.primitives import tensor_add x = ts.ones([2, 3])y = ts.ones([2, 3])print(tensor_add(x, y))6.jpg 看到最初很多2,示意装置胜利。 注:如果遇到以下问题: 提醒说: error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsof...咱们依据出错提醒,关上 Microsoft C++ 生成工具 - Visual Studio ...

June 28, 2022 · 1 min · jiezi

关于算法:windows10下基于Anaconda3的Mindspore170的安装经验

前言最近想体验一下1.7.0版本,之前是1.6.1版本 而且过后没有做环境治理,所以在调用的时候,有时候会和主机里的其它环境抵触 于是想着趁着换一台主机就在Anaconda环境里重装一下 装置过程进入cmd 为mindspore创立一个环境起名为mindspore conda create -n mindspore python=3.9.0(留神Python版本,之前默认的它会装置3.9.12导致又重装) 而后进入该环境 conda activate mindspore 在官网找到对应的版本 能够选用pip装置也能够选用conda装置,在此我选用conda装置指令 复制粘贴:conda install mindspore-cpu=1.7.0 -c mindspore -c conda-forge 输出y点击回车即开始装置,装置实现会输入“done” 测验装置的有效性 输出:python -c "import mindspore;mindspore.run_check()" 输入版本号+Successfully即示意装置胜利 测试从教程里扒拉下来的主动微分代码 输入[6.]与案例后果一样,测试胜利

June 28, 2022 · 1 min · jiezi

关于算法:Mindspore高校站东北大学2022053020220601活动分享帖

1.筹备资料官网文档 下载文档 因为电脑装的是Windows10下的1.7.0 这次流动应该用的是python 3.7下的Mindspore1.6.1版本 所以我大概率要创立一个新环境(不过没关系,这对于Anaconda来说小case) 学习笔记->知乎专栏——门槛最低的深度学习疏导 From AI布道 通过下饺子的例子来引入拟合最小损失的计算,引出——梯度的方向为什么是函数值减少最快的方向? · 为什么要沿着梯度的反方向更新? 梯度方向是函数值减少最快的方向,反向就是降落最快的中央。 ·为什么梯度反方向是函数降落最快的中央? 为解答这个问题,在另一篇专栏里 采纳了由曲线->曲面偏导->曲面任意方向的斜率的递进来由浅入深这个问题 最终从数学的角度证实了当与偏导方向夹角为0°的时候,函数变化率最大,回升趋势; 180°的时候,函数变化率最大,降落趋势。在解决了这个问题后 把该例子回升到图像处理的难度 引入了One-Hot来作为实在标签的示意。 最初把难度降级到动物园图像分类 因为RGB的三像素示意,引入了卷积的概念, 同样的操作【链式法则】反向更新梯度后计算Loss 间接进进入6.1号 狗和面包的分类 第一步:Python 3.7.5 的装置(我是采纳在Anaconda中建设一个新环境) 第二步 mindspore1.6.1装置 第三步 装置Mindvision 第四步 mindspore 与mindvision测试 第五步 下载筹备资料 第六步:把297行案例代码换成 from mindspore.train.callback import TimeMonitor 运行 infer.py文件 依照操作部署到手机端,测试后果

June 28, 2022 · 1 min · jiezi