关于lstm,有个非常好的博客。
前向更新公式为:
依照上文的后向传播的推导方式,可以得到, 前向更新,请见代码中#sooda注释
部分:
后向更新:
注意点:
本文代码可以参考gist
LSTM的后向推导说是推导,基本上没有一个公式。注重理解。
cs231上有一篇关于非常好的文章, 讲得非常好。 一个例子: \[f(x,y) = \frac{x + \sigma(y)}{\sigma(x) + (x+y)^2}\]
1 | x = 3 # example values |
对应的后向传播为:
1 | # backprop f = num * invden |
python拥有matplotlib、Numpy、sklearn、keras等大量的库,像pandas、sklearn、matplotlib这些库都是做数据处理、数据分析、数据建模和绘图的库,基本上机器学习中对数据的爬取(scrapy)、对数据的处理和分析(pandas)、对数据的绘图(matplotlib)和对数据的建模(sklearn)在python中全都能找到对应的库来进行处理。
Beginner resources for those just starting with programming and Python
Intermediate resources for those looking to apply the basics of Python knowledge to fields like data science and web development
Advanced resources for those looking to get into concepts like deep learning and big data with Python
Exercises that help practice and cement Python skills in practice
The official Python site offers a good way to get started with the Python ecosystem and to learn Python, including a place to register for upcoming events, and documentation to get started.
An online book with a paid and a free version. The free version goes into an outline of the content and can be a useful to-do list.
3-Basic Data Types in Python – Real Python
RealPython dives into the different data types in Python in detail. Learn the difference between floating point and integers, what special characters can be used in Python and more.
4-How to Run Your Python Scripts – Real Python
This simple intro to Python scripts through the command line and text editors will get you up and running for your first Python experiments — a handy tool to get you started as you learn Python.
5-Python Tutorial: Learn Python For Free| Codecademy
Codecademy offers a free interactive course that helps you practice the fundamentals of Python while giving you instant, game-like feedback. A great device for learning Python for those who like to practice their way to expertise.
6-Google’s Python Class | Python Education | Google Developers
The official Python development class from Google’s developers. This tutorial is a mix of interactive code snippets that can be copied and run on your end and contextual text. This is a semi-interactive way to learn Python from one of the world’s leading technology companies.
7-Learn Python – Free Interactive Python Tutorial
This interactive tutorial relies on live code snippets that can be implemented and practiced with. Use this resource as a way to learn interactively with a bit of guidance.
8-Jupyter Notebook: An Introduction – Real Python
Want an easy, intuitive way to access and work with Python functions? Look no further than Jupyter Notebook. It’s much easier to work with than the command line and different cobbled together scripts. It’s the setup I use myself. This tutorial will help you get started on your path to learn Python.
W3Schools uses the same format they use to teach HTML and others with Python. Practice with interactive and text snippets for different basic functions. Use this tutorial to get a firm grounding in the language and to learn Python.
Kaggle is a platform which hosts data science and machine learning competitions. Competitors work with datasets and create as accurate of a predictive model as possible. They also offer interactive Python notebooks that help you learn the basics of Python. Choose the daily delivery option to have it become an email course instead.
11-Learning Python: From Zero to Hero – freeCodeCamp.org
This text-based tutorial aims to summarize all of the basic data and functional concepts in Python. It dives into the versatility of the language by focusing on the object and class portions of the object-oriented part of Python. By the end of it, you should have a neat summary of objects in Python as well as different data types and how to iterate or loop over them.
12-BeginnersGuide – Python Wiki
This simple tutorial on the official Python Wiki is chock-full of resources, and even includes a Chinese translation for non-English speakers looking to learn Python.
13-Python Tutorial – Tutorialspoint
Set up in a similar fashion to W3Schools, use Tutorialspoint as an alternative or a refresher for certain functions and sections.
14-Python (programming language) – Quora
The Quora community is populated with many technologists that learn Python. This section devoted to Python includes running analysis and pressing questions on the state of Python and its practical application in all sorts of different fields, from data visualization to web development.
15-Python – DEV Community – Dev.to
Dev.to has user-submitted articles and tutorials about Python from developers who are working with it every day. Use these perspectives to help you learn Python.
16-Python Weekly: A Free, Weekly Python E-mail Newsletter
If you’re a fan of weekly newsletters that summarize the latest developments, news, and which curate interesting articles about Python, you’ll be in luck with Python Weekly. I’ve been a subscriber for many months, and I’ve always been pleased with the degree of effort and dedication placed towards highlighting exceptional resources.
17-The Ultimate List of Python YouTube Channels – Real Python
For those who like to learn by video, this list of Youtube channels can help you learn in your preferred medium.
18-The Hitchhiker’s Guide to Python
Unlike the rest of the resources listed above, the Hitchhiker’s guide is much more opinionated and fixated on finding the best way to get set up with Python. Use it as a reference and a way to make sure you’re optimally set up to be using and learning Python.
19-Python: Online Courses from Harvard, MIT, Microsoft | edX
edX uses corporate and academic partners to curate content about Python. The content is often free, but you will have to pay for a verified certificate showing that you have passed a course.
Coursera’s selection of Python courses can help you get access to credentials and courses from university and corporate providers. If you feel like you need some level of certification, similar to edX, Coursera offers a degree of curation and authentication that may suit those needs.
21-Getting started with Django | Django
The official Django framework introduction will help you set up so that you can do web development in Python.
22-LEARNING PATH: Django: Modern Web Development with Django
This resource from O’Reilly helps fashion a more curated path to learning Django and web development skills in Python.
23-A pandas cookbook – Julia Evans
I learned how to clean and process data with the Pandas Cookbook. Working with it enabled me to clean data to the level that I needed in order to do machine learning and more.
It works through an example so you can learn how to filter through, group your data, and perform functions on it — then visualize the data as it needs be. The Pandas library is tailor-built to allow you to clean up data efficiently, and to work to transform it and see trends from an aggregate-level basis (with handy one-line functions such as head() or describe).
The Pandas cookbook is the perfect intro to it.
24-Newest ‘python’ Questions – Stack Overflow
The Stack Overflow community is filled with pressing questions and tangible solutions. Use it a resource for implementation of Python and your path to learn Python.
The Python subreddit offers a bunch of different news articles and tutorials in Python.
The Data Science subreddit offers tons of resources on how to use Python to work with large datasets and process it in interesting ways.
27-Data science sexiness: Your guide to Python and R
I wrote this guide for The Next Web in order to distinguish between Python and R and their usages in the data science ecosystem. Since then, Python has pushed ever-forward and taken on many of the libraries that once formed the central basis of R’s strength in data analysis, visualization and exploration, while also welcoming in the cornerstone machine learning libraries that are driving the world. Still, it serves as a useful point of comparison and a list of resources for Python as well.
28-Data Science Tutorial: Introduction to Using APIs in Python – Dataquest
One essential skill when it comes to working with data is to access the APIs services like Twitter, Reddit and Facebook use to expose certain amounts of data they hold. This tutorial will help walk you through an example with the Reddit API and help you understand the different code responses you’ll get as you query an API.
29-Introduction to Data Visualization in Python – Towards Data Science
Once you’re done crunching the data, you need to present it to get insights and share them with others. This guide to data visualization summarizes the data visualization options you have in Python including Pandas, Seaborn and a Python implementation of ggplot.
30-Top Python Web Development Frameworks to Learn in 2019
If you want a suite of options beyond Django to develop in Python and learn Python for web applications, look no further than this compilation. The Hacker Noon publication will often feature useful resources on Python outside of this article as well. It’s worth a follow.
31-Beginner’s Guide to Machine Learning with Python
This text-based tutorial helps introduce people to the basics of machine learning with Python. Towards Data Science, the Medium outlet with the article in question, is an excellent source for machine learning and data science resources.
32-Free Machine Learning in Python Course – Springboard
This free learning path from Springboard helps curate what you need to learn and practice machine learning in Python.
The Machine Learning subreddit oftentimes focuses on the latest papers and empirical advances. Python implementations of those advances are discussed as well.
KDNuggets offers advanced content on data science, data analysis and machine learning. Its Python section deals with how to implement these ideas in Python.
35-Learn Python – Beginner through Advanced Online Courses – Udemy
Udemy offers a selection of Python courses, with many advanced options to teach you the intricacies of Python. These courses tend to be cheaper than the certified ones, though you’ll want to look carefully at the reviews.
36-A Brief Introduction to PySpark – Towards Data Science
This introduction to PySpark will help you get started with working with more advanced distributed file systems that allow you to deal and work with much larger datasets than is possible under a single system and Pandas.
37-scikit-learn: machine learning in Python
The default way most data scientists use Python is to try out model ideas with scikit-learn: a simple, optimized implementation of different machine learning models. Learn a bit of machine learning theory then implement and practice with the scikit-learn framework.
38-The Next Level of Data Visualization in Python – Towards Data Science
This tutorial walks through more advanced versions of data visualizations and how to implement them, allowing you to take a preview of different advanced ways you can slice your data from correlation heatmaps to scatterplot matricies.
39-Machine Learning with Python | Coursera
Coursera’s selection of courses on machine learning with Python are veryw well-known. This introduction offered with IBM helps to walk you through videos and explanations of machine learning concepts.
Deeplearning.ai is Andrew Ng’s (the famous Stanford professor in AI and founder of Coursera) attempt to bring deep learning to the masses. I ended up finishing all of the courses: they offer certification and are a refreshing mix of both interactive notebooks where you can work with the different concepts and videos from Andrew Ng himself.
41-fast.ai · Making neural nets uncool again
This curated course on deep learning helps break down section-by-section aspects of machine learning. Best of all, it’s completely free. I often use fast.ai as a refresher or a deep dive into a deep learning idea I don’t quite understand.
42-Learn and use machine learning | TensorFlow Core | TensorFlow
This tutorial helps you use the high-level Keras component of TensorFlow and Google cloud infrastructure to do deep learning on a set of fashion images. It’s a great way to learn and practice your deep learning skills.
Kaggle offers a variety of datasets with user examples and upvoting to guide you to the most popular datasets. Use the examples and datasets to create your own data analysis, visualization, or machine learning model.
Practice Python has a bunch of beginner exercises that can help you ease into using Python and practicing it. Use this as an initial warmup exercise before you tackle different projects and exercises.
45-Python Exercises – W3Schools
The Python exercises on W3Schools follow the sections in their tutorials, and allow you to get some interactive practice with Python (though the exercises are in practice very simple).
HackerRank offers a bunch of exercises that require you to solve without any context. It’s the best way to practice different functions and outputs in Python in isolation (though you’ll still want to do different projects to be able to cement your Python skill.) You’ll earn points and badges as you complete more challenges. This certainly motivates me to learn more. A very useful sandbox for you to learn Python with.
Project Euler offers a variety of ever-harder programming challenges that aim to test whether you can solve mathematical problems with Python. Use it to practice your mathematical reasoning and your Pythonic abilities.
48-Writing your first Django app, part 1 | Django documentation | Django
This documentation helps you get on the ground with your first Django app, allowing you to use Python to get something up on the web. Once you’ve started with it, you can build anything you want.
49-Top 100 Python Interview Questions & Answers For 2019 | Edureka
Should you ever be in an interview where your Python skills are at question, this list of interview questions will help as a useful reminder and refresher and a good way for you to practice and cement different Python concepts.
50-6 best online courses for ethical hackers
Ethical hackers play an important role in organizations by finding and fixing vulnerabilities in systems and applications. Python is a high-level programming language that’s ideal for security professionals as it’s easy to learn and lets you create functional programs with a limited amount of code.
爬虫:requests、scrapy、selenium、beautifulSoup,这些库都是写网络爬虫需要使用到的,好好掌握这些东西,数据就有了。
数据处理:Numpy、scipy、pandas、matplotlib,这些库分别可以进行矩阵计算、科学计算、数据处理、绘图等操作,有了这些库,你就可以一步步开始把数据处理成你需要的格式。
建模:nltk、keras、sklearn,这些库主要是用于自然语言处理、深度学习和机器学习的,把这些用好了,你的模型就构建出来了。
Web开发:django、flask、tornado,这些库搞明白了,你web开发也就搞定了。
优雅简单的 HTTP 模块。
很好用的 HTML/XML 解析器。
JSON 编码解码器。
应用举例:
1
python -m json.tool src.json > dst.json
在 Vim 里格式化 JSON:
1
:%!python -m json.tool
简单实用的 HTTP 服务器。
应用举例:
1
python -m CGIHTTPServer 80
方便地进行 base64 编解码的模块。
应用举例:
1
echo aGVsbG93b3JsZA== | python -m base64 -d
则能看到输出
1
helloworld
i.e.是id est(“that is” , "in other words"。进一步解释用,意为:也就是)的缩写。目的是用来进一步解释前面所说的观点(不像后文的e.g.那样引入实例来形象化),意思是“那就是说,换句话说”。它后面最好紧跟着一个逗号,再跟一个解释。(看大量例句,发现有些句子的确省略了逗号,见例句1和例句2)
例句1:Each of these items are actionable, i. e. you can actually do them.
例句2:The film is only open to adults, i.e. people over 18.
例句3:And you have to cross reference this time/effort analysis to the results (i.e., the bugs) that the effort yielded.
e.g.是exempli gratia("for example; for instance;such as"。举例用,意为:例如)的缩写,其目的用若干例子来让前面说法更具体,更易感知。在使用中,最好把e.g.连同它的例子放在括号中,如例句2。
例句1: I like sports, e.g., football.
例句2:I like most of sports activities (e.g., football).
i.e.和e.g.的区别:
例句1:I like to eat boardwalk food, i.e., funnel cake and french fries.
例句2:I like to eat boardwalk food, e.g., funnel cake and french fries.
例句1表示只有 funnel cake and french fries这两种boardwalk食物,而且这两种我都喜欢。例句2表示我喜欢boardwalk食物,比如 funnel cake and french fries;但是诸如snow cones and corn dogs等其他类型,我也可能喜欢。
etc.是et cetera(“and so forth; and the others; and other things; and the rest; and so on"。举例用,意为:等等)的缩写。它放在列表的最后,表示前面的例子还没列举完,最后加个词“等等”。
etc.前面要有逗号。一般不要在e.g.的列表最后用etc( 在including后的列表后也不宜使用etc)。这是因为 e.g. 表示泛泛的举几个例子,并没有囊括所有的实例,其中就已经包含“等等”,如果再加一个 etc. 就多余了。
例句1: I need to go to the store and buy some pie, milk, cheese, etc.
viz.是videlicet( "namely", "towit", "precisely", "that is to say"。进一步解释用,意为:即)的缩写,与e.g.不同,viz位于同位列表之前,要把它前面单词所包含的项目全部列出。
例句1:The school offers two modules in Teaching English as a Foreign Language, viz. Principles and Methods of Language Teaching and Applied Linguistics.(该校提供两个模块用于英语作为外语的教学,即语言教学的原理方法和应用语言学。)
例句2: In this paper, a new TDNN architecture with two input variable, viz. wave form and its phase difference, is developed to reduce the grain noise.(本文提出了一种新的TDNN结构用于降低粗晶材料结构噪声,该结构具有波形及其相位差组成的双变量输入。)
et al.是et alia("and others; and co-workers"。在引用文献作者时用,意为:等其他人)的缩写。它几乎都是在列文献作者时使用,即把主要作者列出后,其它作者全放在et al. 里面。
et al.的前面不要逗号。人的场合用et al,而无生命的场合用etc.(et cetera)。
例句1: These results agree with the ones published by Pelon et al. (2002).
例句2: Clegg et al. (1995) explain that in the electronics industry linear-programming models can be used to analyse the viability of the recovered parts in remanufacturing.(克莱格等人(1995)解释说,电子行业的线性规划模型可以用来分析在再制造过程中回收零部件的可行性。)
基金委项目允许失败,需要把看不见的东西变成看得见的东西,虽然是理论,需要添加一个应用背景,从应用背景中升华思想。着重理论创新。
其中基金申请书相当于博士论文的开题报告,函评则需要体现创新点,年度报告对应于博士论文的中期进展报告。
国家自然科学基金委员会公布了集中接收申请的项目类型包括:面上项目、重点项目、部分重大项目、部分重大研究计划项目、青年科学基金项目、优秀青年科学基金项目、国家杰出青年科学基金项目、创新研究群体项目、地区科学基金项目、海外及港澳学者合作研究基金项目、部分联合基金项目、国家重大科研仪器研制项目(自由申请)、数学天元基金项目、重点国际(地区)合作研究项目和外国青年学者研究基金项目等。通过亚类说明、附注说明还可将一些资助类别进一步细化。所有这些资助类别各有侧重,相互补充,共同构成当前的自然科学基金资助体系。
青年基金一个人一辈子只能获批一次,项目3年,总共给25万左右的经费/资助强度。
面上项目,要高级职称(副教授、教授)才可以申请。资助强度80万左右(我都说的是理工科实验性的课题),时间4年。面上是大多数教授主要申请的。
国家自然科学基金申请指导与技巧-徐长庆,申请国家自然科学基金项目的一点体会,一步一步教你如何写国家基金申请书,国家自然科学基金申请书的若干建议,百份国自然标书的专家评审意见
撰写自然基金过程也是深入学习、了解国家科技政策最新发展趋势的一个好机会。清晰地知道国家未来评价学术科研人员的走向。
申请者在准备之前,
面上项目:总分大于5.5分的项目上会,上会率一般为30%。
青年项目:总分大于5分的项目上会,上会率一般为30%
会评结果不容乐观的5种情况1:
国家自然科学基金官网提供了 结题报告检索 的功能,可以结合 NSFC_conclusion_downloader 实现PDF文件的下载。
nsfc_conclusion_downloader.zip
,并解压。用以自己熟悉的方式,说清楚四个问题,最为关键。
一个好的申请书必须在上述四者间建立一条完整的逻辑链,做到环环相扣。研究内容支撑立项依据,研究方法和技术路线服务于研究内容,已有的基础保证项目成功的可靠性。
总体原则:
申请基金之前,申请人需得把大量时间花在课题调研、构思和学术积累上。
如何选题,选择什么题目,开展什么研究是来自科研人员自己的学术积累、经验和兴趣,要靠自己通过大量阅读文献结合自己从研究去领悟和选择。千万注意要避开“大牛的研究方向”,一来容易撞车,二来在比较中落后(原因自明)。再者,选题属于当前的热点,有一定积累为佳。
题目、中英文摘要、申请人及团队,就是你给评审人的第一印象。
摘录于火行的文章“到底800字科学问题属性怎么写?”
科学问题属性指的是:“鼓励探索,突出原创”、“聚焦前沿,独辟蹊径”、“需求牵引,突破瓶颈”、“共性导向,交叉共融” 这四个属性。同时这个四点属性,更像是:(1)纯原创 (2)再创新 (3)应用型(4)跨界型。
第一类(鼓励探索,突出原创):那么就说明相关的课题是纯原创,目前均未做过或实现过,重点落在从无到有表述上;
第二类(聚焦前沿、独辟蹊径):这块要说明当下前沿研究有哪些欠缺或者需要优化,申请人的想法比已有的突破、拓展在哪里;
第三类(需求牵引,突破瓶颈):这个要着重说明研究内容符合实际国家需求且应具体产业化前景,但目前的效能并未得到解决,而申请人的研究成果可能会有效地促进相关产业、技术迭代等;
第四类(共性导向,交叉融通):表述上要着重阐明自己的研究是在相关学科内的理念、技术下通过一定程度的交叉,解决共同的需求导向问题,且相应的融合会促进知识体系的发展与延伸。
假设项目研究是在再创新,是对于相应技术的优化创新,同时我的文章代表作,相应的研究基础,支撑申报的材料都更偏向于基础研究类型,这里比较符合选第二个。在回答的具体操作上,要阐明:为什么我觉得这个课题是前沿的,你的依据什么,与最前沿的相关性多大,同时也要着重说明自己的研究内容是偏应用还是基础。
举例,项目属性适合“聚焦前沿、独辟蹊径”,假设研究内容是:机器翻译(下列分布、字数,来源等仅供参考)
(1)简明扼要的讲清研究主体前沿、热点、已有研究成果(国内外研究摘选100字左右,这部分是为了后边凸显你的再创新); (2)然后对比性的论述目前研究的欠缺或者亟待优化的点:技术、对象等?(摘选创新点,100字左右); (3)具体的实现的意义:相应的算法、技术识别仍有提升空间包括但不限于优化、缺陷、拓展等 (着重落笔,整合技术路线、可行性、关键科学问题等;备注:需求产业化的,要说明对于实际产业界有什么预期经济效益,400字左右); (4)当前的工作,与自己的背景是偏向于基础研究还是应用需求(这部分务必点明一下,尽可能的说清自己的情况,这部分依据自己的个人简历背景,支撑材料情况,50字左右); (5)总结性概况,你解决了什么科学问题,点一下属性(70字左右)。
凝练、明确的、新颖的、吸引人的、科学的、有逻辑地、技术路线的清晰性、排列的规整性、布局的合理性
项目的立项依据包括研究意义、国内外研究现状及发展动态分析,需结合科学研究发展趋势来论述科学意义;或结合国民经济和社会发展中迫切需要解决的关键科技问题来论述其应用前景。附主要参考文献目录。
研究者需明确拟开展的研究究竟是个什么样的问题(what),为什么要研究它(why),从何处入手(where),有什么对策、如何破解(how),谁来做最合适(who)。使审稿人明确课题的科学问题、研究假说、研究思路及科学意义,并赞同选题的创新性、科学性、可行性和重要性。
立项依据要紧紧围绕着关键科学问题的提出、分析和解决的主线进行写作。从简要的研究背景介绍,自然的过渡到项目要解决的重要科学问题,以及针对该科学问题开展的前期工作基础是否支持科学问题可行,在此基础上还存在哪些小的科学问题(或者说需要进一步深入的研究细节)需要提出本项目继续开展研究。
按照研究内容设置段落数,如果有3个内容,立项依据有5段。第一段,总括表述研究的意义,2-4段分别对应3个研究内容进行阐述,5段总结提出科学问题/科学假设。
通过已有的文献和自己的想法结合,引出研究思路。比如,某因子A对某通路B的影响,可能是直接的,也可能是涉及中间某些其他因子C,从而起作用。需要理顺的是:① A与B的研究现状如何,和自己的研究对象有没有新意的地方,从而建立研究目标一;② A与C是否有关联,如果有,具有什么样的关联,并且A与C是否可以对B产生影响,这些都是需要明确现状,引出可能的研究思路。在明确上面的研究背景和可能性的推测之后,就是后面的思路整理,细节打磨了。
项目的研究内容、研究目标,以及拟解决的关键科学问题是申请书应该重点阐述的内容。推荐的撰写模式是先目标后内容的描述,使研究目标、内容、方案、技术路线这一系列内容的撰写符合由简到繁的逻辑关系(形成塔形结构)。
比如科技园的建设项目立项:
研究目标指这个项目最终要达到的目的(解决的问题)和基本要求,要清晰地显示项目预期成果及其意义,并从逻辑上详细阐明清楚。
针对某一个选定的体系,围绕着什么关键科学问题,用什么方法开展研究,准备理清什么规律,揭示什么机理,解决什么科学问题和学术性问题。
一般研究目标最好为一段精辟的、宏观的用专业术语表达的文字,而不具体分点。对于某些规模较大项目,研究目标也可以分成几点:理论方面要达到什么目的(建立了...);应用方面要达到的要求(解决了...);涉及研发类型的方法技术方面要达到的指标等。
设计研究内容应当紧密围绕项目选题中的科学问题或关键技术问题,组织设计具体、细化的研究框架。不仅写“做什么”,更应该写出“怎么研究”及“具体的研究思路”。
拟解决的关键科学问题是项目申请书的核心所在,必然具有一定的深度。对于拟解决的关键问题和技术瓶颈要有清晰的认识,抓准要研究的1~3个关键问题,设想好解决步骤。
关键科学问题的内涵是什么呢?在我看来,得满足:(1)若向前推进一步或解决之,有重要意义;(2)属于制约某具体学科领域科学发展的“瓶颈”问题,一旦找到正确的“突破口”或开启“那把锁”的“钥匙”,则势若破竹,能深入揭示隐藏在“黑暗”中的自然现象演化奥秘。虽然自然现象的演化受多种因素影响,但往往“万变不离其宗”,找到了这个“宗”,就等于找到了“突破口”或“钥匙”。
撰写研究方案应围绕研究内容(紧扣研究内容),聚焦关键科学问题(能圆满解答关键科学问题),以清晰的研究思路(指导思想),从研究方法、技术路线、实验手段、关键技术等方面,详述步骤、高招、窍门、可行性等。
申请人需要对方案的总体设想和具体细节两方面都要有所把握。充分体现务实态度和切实可行性。
研究方案和研究内容对应。拟采取的研究方案比研究内容更加具体,类似于科研论文的实验部分,但比科研论文的实验部分更加笼统(没那么细),涵盖的工作量也更大。
可行性分析可以从理论可行、方法可行、实验室保障、人员保障主要4个方面介绍。项目的可行性分析要有论点、论据和论证,阐明你的设计方案、研究方法、技术路线能否实现预期的研究目标。
项目可行性大致由两部分组成:
创新点应在充分查阅文献资料的基础上提出,认真思考、仔细鉴别、深入挖掘课题的区别、特色和创新性,切记不要想当然。
客观实际的将创新归并到如下几类:理论创新、方法创新、应用创新、集成创新。主要集中于方法的创新、理论的创新和预期结果的创新,主要体现在“选题”和“研究方法路线”两方面,强调“科学性”(学术性)方面的创新或“应用价值”方面的创新性。
年度研究计划是指列出在每年度拟开展的实验、数据分析、论文撰写、国际合作和学术交流等工作。
预期研究结果通常分成两部分描述:
研究基础是指与本项目相关的研究工作积累和已取得的研究工作成绩。展示自己在相关研究领域以及在这个课题上的学术积累,指出学术研究思路,证明自己在该领域开展了大量系统研究,发表了系列论文(并且这些论文得到同行的正面引用),在国际学术会议作了邀请报告,有能力做好申请的课题,即要回答“为何我能做”。
没有研究基础,可以通过这一部分的适当阐述获得基础。比如,我申请方向没有已发表成果,那我就要找在这方面发表成果的学者作为我的参与者。
工作条件包括已具备的实验条件,尚缺少的实验条件和拟解决的途径,包括利用国家实验室、国家重点实验室和部门重点实验室等研究基地的计划与落实情况。
工作条件涉及软硬件条件:
正在承担的与本项目相关的科研项目情况是指申请人正在承担的与本项目相关的科研项目情况,包括国家自然科学基金的项目和国家其他科技计划项目,要注明项目的名称和编号、经费来源、起止年月、与本项目的关系及负责的内容等。
完成国家自然科学基金项目情况是指对申请人负责的前一个已结题科学基金项目(项目名称及批准号)完成情况、后续研究进展及与本申请项目的关系加以详细说明。另附该已结题项目研究工作总结摘要(限500字)和相关成果的详细目录。这将有助于评审人判断申请人负责的前一个已结题科学基金项目是否达到了预期的效果,以此来预测申请人这次如果获得资助,能否取得预期的成绩。
一方面,研究者应执行好每一个获批的自然科学基金项目,多出成果;另一方面,研究者应撰写好结题报告,包括工作总结摘要。
人才计划分国家的、部委的、地方的等几个级别。国家的嘛,主要是青年千人(小千人)、千人计划(大千人)、百人计划、长江、杰青、优青、新世纪人才等等。地方上还会有一些省市级的杰出青年、学术带头人、某某人才、某某学者。
Gama J, Žliobaitė I, Bifet A, et al. A survey on concept drift adaptation[J]. ACM computing surveys (CSUR), 2014, 46(4): 44.
Shalev-Shwartz S. Online learning and online convex optimization[J]. Foundations and Trends® in Machine Learning, 2012, 4(2): 107-194.
Žliobaitė I, Pechenizkiy M, Gama J. An overview of concept drift applications[M]//Big data analysis: new algorithms for a new society. Springer, Cham, 2016: 91-114.
Concept Drift:
We can distinguish two learning modes: offline learning and online learning.
In offline learning the whole training data must be available at the time of model training. Only when training is completed the model can be used for predicting.
不同理解方式:
1 | initialize all weights to random value |
优点:
缺点:
不同理解方式:
1 | initialize all weights to random value |
在监督学习的在线方法下,对于多层感知器突触权值的调整是以样例-样例为基础的,用来最小化的代价函数是全体瞬时误差能量。和批量学习一样,在线学习的学习曲线是通过足够大量的随机选取的初始条件上的总体平均来计算的。对于给定的网络结构,在线学习下获得的学习曲线和批量学习下获得的学习曲线有着很大的不同。
给定训练样本以随机的方式呈现给网络,在线学习的使用使得在多维权值空间中的搜索事实上是随机的;正是由于这个原因,在线学习方法有时被称为随机方法。
优点:
增量式算法就是每当新增数据时,并不需要重建所有的知识库,而是在原有知识库的基础上,仅做由于新增数据所引起的更新,这更加符合人的思维原理。一个增量学习算法应同时具有以下特点:
decremental learning,即抛弃“价值最低”的保留的训练样本。这两个概念在incremental and decremental svm这篇论文里面可以看到具体的操作过程。
Cauwenberghs G, Poggio T. Incremental and decremental support vector machine learning[C]//Advances in neural information processing systems. 2001: 409-415.
Gâlmeanu H, Andonie R. Implementation issues of an incremental and decremental SVM[C]//International Conference on Artificial Neural Networks. Springer, Berlin, Heidelberg, 2008: 325-335.
两种典型在线机器学习算法:Perceptron、MIRA,他们都属于线性分类算法族,它们具有相同的模型形式。在学习阶段,算法对于每个类别,通过训练数据估计一个参数向量w。在推理阶段,算法在给定一组参数向量w和数据x的条件下,以w和x的乘积作为数据与该类的相似度度量。
假设样例按照到来的先后顺序依次定义为\(((x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),\cdots,(x^{(m)},y^{(m)}))\)。\(X\)为样本特征,\(y\)为类别标签。我们的任务是到来一个样例\(x\),给出其类别结果\(y\)的预测值,之后我们会看到\(y\)的真实值,然后根据真实值来重新调整模型参数,整个过程是重复迭代的过程,直到所有的样例完成。
我们的假设函数为:
\[\begin{equation} h_{\theta}(x) = g(\theta^T x) \end{equation}\]
其中\(x\)是\(n+1\)维特征向量,最后一维为常量\(1\),\(\theta\)是\(n+1\)维参数权重,最后一维表示Bias。函数\(g\)用来将\(\theta^Tx\)计算结果映射到\(-1\)和\(1\)上。具体公式如下:
\[\begin{equation} \begin{split} g(z) = \left \lbrace \begin{array}{cc} 1 & \text{if} \ z \geq 0 \\ -1 & \text{if} \ z < 0 \end{array} \right. \end{split} \end{equation}\]
这个也是logistic回归中\(g\)的简化形式。
现在我们提出一个在线学习算法如下:
新来一个样例\((x,y)\),我们先用从之前样例学习到的\(h_{\theta}(x)\)来得到样例的预测值\(y\),如果\(h_{\theta}(x) = y\)(即预测正确),那么不改变\(\theta\),反之
\[\begin{equation} \theta := \theta + yx \end{equation}\]
也就是说,如果对于预测错误的样例,\(\theta\)进行调整时只需加上(实际上为正例)或者减去(实际负例)样本特征\(x\)值即可。\(\theta\)初始值为向量0。这里我们关心的是\(\theta^Tx\)的符号,而不是它的具体值。调整方法非常简单。然而这个简单的调整方法还是很有效的,它的错误率不仅是有上界的,而且这个上界不依赖于样例数和特征维度。
下面定理阐述了错误率上界:
定理(Block and Novikoff): 给定按照顺序到来的\((x^{(1)},y^{(1)}),(x^{(2)},y^{(2)},\cdots,(x^{(m)},y^{(m)}))\)样例。假设对于所有的样例\(||x^{(i)} \leq D\),也就是说特征向量长度有界为\(D\)。更进一步,假设存在一个单位长度向量\(u\)且\(y^{(i)}(u^Tx^{(i)})\geq \gamma\)。也就是说对于\(y=1\)的正例,\(u^Tx^{(i)} \geq \gamma\),反例\(u^Tx^{(i)} \leq -\gamma\),\(u\)能够有\(\gamma\)的间隔将正例和反例分开。那么感知算法的预测的错误样例数不超过\(({D \over \gamma})^2\)。
根据对SVM的理解,这个定理就可以阐述为:如果训练样本线性可分,并且几何间距至少是\(\gamma\),样例样本特征向量最长为\(D\),那么感知算法错误数不会超过\(({D \over \gamma})^2\)。这个定理是62年提出的,63年Vapnik提出SVM,可见提出也不是偶然的,感知算法也许是当时的热门。
定理证明
感知算法只在样例预测错误时进行更新,定义\(\theta^{(k)}\)是第\(k\)次预测错误时使用的样本特征权重,\(\theta^{(1)} = \vec{0}\) 初始化为\(\vec{0}\)向量。假设第\(k\)次预测错误发生在样例\((x^{(i)},y^{(i)})\)上,利用\(\theta^{(k)}\)计算\(y^{(i)}\)值时得到的结果不正确。也就是说下面的公式成立:
\[\begin{equation} (x^{(i)})^T\theta^{(k)}y^{(i)} \leq 0 \end{equation}\]
根据感知算法的更新方法,我们有\(\theta^{(k+1)} = \theta^{(k)} + y^{(i)}x^{(i)}\)。这时候,两边都乘以\(u\)得到:
\[\begin{equation} \begin{split} (\theta^{(k+1)})^Tu &= (\theta^{(k)})^u + y^{(i)}(x^{(i)})^Tu \\ &\geq (\theta^{(k)})^Tu + \gamma \end{split} \end{equation}\]
这个式子是个递推公式,就像等差数列一样\(f_{n+1}=f_n+d\)。由此我们可得
\[\begin{equation} (\theta^{(k+1)})^Tu \geq k\gamma \end{equation}\]
因为初始\(\theta\)为\(\vec{0}\)。
下面我们利用前面推导出的\((x^{(i)})^T\theta^{(k)}y^{(i)} \leq 0\)和\(||x^{(i)}|| \leq D\)得到
\[\begin{equation} \begin{split} ||\theta^{(k+1)}||^2 &= ||\theta^{(k)} + y^{(i)}x^{(i)}||^2 \\ &= ||\theta^{k}||^2 + ||x^{(i)}||^2 + 2y^{(i)}(x^{(i)})^T\theta^{(i)} \\ &\leq ||\theta^{k}||^2 + ||x^{(i)}||^2 \\ &\leq ||\theta^{k}||^2 + D^2 \end{split} \end{equation}\]
也就是说\(\theta^{(k+1)}\)的长度平方不会超过\(\theta^{(k)}\)与\(D\)的平方和。
又是一个等差不等式,得到:
\[\begin{equation} ||\theta^{k+1}||^2 \leq kD^2 \end{equation}\]
两边开根号得:
\[\begin{equation} \begin{split} \sqrt{k}D & \geq ||\theta^{(k+1)}|| \\ & \geq (\theta^{(k+1)})^Tu \\ & \geq k\gamma \end{split} \end{equation}\]
其中第二步可能有点迷惑,我们细想\(u\)是单位向量的话:
\[\begin{equation} z^Tu = ||z||||u||cos \phi \leq ||z||||u|| \end{equation}\]
因此上面的不等式成立,最后得到:
\[\begin{equation} k \leq (D/\gamma)^2 \end{equation}\]
也就是预测错误的数目不会超过样本特征向量\(x\)的最长长度除以几何间隔的平方。实际上整个调整过程中\(\theta\)就是\(x\)的线性组合。
首先定义一个含有n个样本的集合\(X=\{X_1,\ldots,X_n\}\),
均值描述的是样本集合的中间点,它告诉我们的信息是很有限的,而标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均。标准差描述的就是这种“散布度”。之所以除以\(n-1\)而不是除以\(n\),是因为这样能使我们以较小的样本集更好的逼近总体的标准差,即统计上所谓的“无偏估计”。
但我们应该注意到,标准差和方差一般是用来描述一维数据的,但现实生活我们常常遇到含有多维数据的数据集。协方差就是这样一种用来度量两个随机变量关系的统计量,我们可以仿照方差的定义:
\[var(X)=\frac{\sum_{i=1}^n (X_{i}-\bar{X})(X_{i}-\bar{X})}{n-1}\]
来度量各个维度偏离其均值的程度,标准差可以这么来定义:
\[cov(X,Y)=cov(Y,X)=var(X)=\frac{\sum_{i=1}^n (X_{i}-\bar{X})(Y_{i}-\bar{Y})}{n-1}\]
如果结果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义)。如果为0,也是就是统计上说的“相互独立”。
协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如\(n\)维的数据集就需要计算\(\frac{n!}{(n-2)!* 2}\)个协方差,那自然而然的我们会想到使用矩阵来组织这些数据。给出协方差矩阵的定义:
\[C_{n\times n}=(c_{i,j},c_{i,j}=cov(Dim_{i},Dim_{j}))\]
假设数据集有\(\{x,y,z\}\)三个维度,则协方差矩阵为
可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。
1 | % 方法一 |
综上,机器学习模型对于数据的处理可以被大致归类到两个方向1:
这个不是一个严谨的科学划分,是一种直观的理解。如果所使用的模型拥有对于数据的简化、特征表示和抽取能力,我们都可以认为它是有表示学习的特性。狭义的特征工程指的是处理缺失值、特征选择、维度压缩等各种预处理手段,而从更大的角度看主要目的是提高数据的表示能力。对于数据的人为提炼使其有了更好的表达,这其实是人工的表示学习。
传统的机器学习方法主要依赖人工特征处理与提取,而深度学习依赖模型自身去学习数据的表示。
深度学习的层层网络可以从数据中自动学习到有用的、高度抽象的特征,而最终目的是为了帮助分类层做出良好的预测。深度学习的一大特点是其对数据的分布式表示(distributed representation)(也和稀疏性表示等其他特性有关),最直观的例子可以是nlp
中的word2vec
,每个单词不再是割裂的而互相有了关联。类似的,不少网络中的参数共享就是分布式表示,不仅降低了参数量需求也提高对于数据的描述能力。仅看分类层的话,深度学习和其他的机器学习似乎没有天壤之别,但正因为有了种种良好的表示学习能力使其有了过人之处。
在数据量不够的时候,自动特征抽取的方法往往不如人为的特征工程。当使用者对于数据和问题有深刻的理解时,人工的特征工程往往效果更好。同时也值得注意,表示学习的另一好处是高度抽象化的特征往往可以被应用于相关的领域上,这也是我们常说的迁移学习(transfer learning)的思路。比如有了大量猫的图片以后,不仅可以用于预测一个物体是不是猫,也可以用于将抽取到的特征再运用于其他类似的领域从而节省数据开销。
从某个角度来看,表示学习有“嵌入式的特征选择”(embedded feature selection)的特性,其表示学习嵌入到了模型中。举个简单的例子,决策树模型在训练过程中可以同时学习到不同特征的重要性,而这个过程是建模的一部分,是一种嵌入式的特征选择。
首先对于模型选择有一定的帮助:当我们数据量不大,且对于数据非常理解时,人为的特征处理也就是特征工程是合适的。比如去掉无关数据、选择适合的数据、合并数据、对数据做离散化等。 当数据量较大或者我们的人为先验理解很有限时,可以尝试表示学习,如依赖一气呵成的深度学习,效果往往不错。
]]>经典的卡尔曼滤波只适用于线性且满足高斯分布的系统,但实际工程中并不是这么简单,比如飞行器在水平运动时有可能伴随着自身的自旋,此时的系统并不是线性的,这时就需要应用扩展卡尔曼滤波(EKF)来解决这种情况1。
在扩展卡尔曼滤波器(Extended Kalman Filter,简称EKF)中状态转换和观测模型不需要是状态的线性函数,可替换为(可微的)函数。函数f可以用来从过去的估计值中计算预测的状态,相似的,函数h可以用来以预测的状态计算预测的测量值。然而f和h不能直接的应用在协方差中,取而代之的是计算偏导矩阵(Jacobian)。
\[{ {x} }_{k}=f({ {x} }_{k-1},{ {u} }_{k},{ {w} }_{k})\]
当前状态的概率分布是关于上一状态和将要执行的控制量的二元函数,再叠加一个高斯噪声,测量值同样是关于当前状态的函数叠加高斯噪声。具体表达式如下: \(g(u_t, x_{t-1})\) 和 \(h(x_t)\) 可以是非线性的函数。
为了用经典卡尔曼滤波器的思想来解决非线性系统中的状态估计问题,首先要做的就是把 \(g(u_t, x_{t-1})\) 和 \(h(x_t)\) 用泰勒级数展开,将其线性化,只取一次项为一阶EKF滤波。具体如下:
\(g(u_t, x_{t-1})\) 在上一状态估计的最优值处取一阶导数,\(h(x_t)\) 在当前时刻预测值处取一阶导数,得到G和H分别相当于Kalman Filter中的A和C。
在每一步中使用当前的估计状态计算Jacobian矩阵,这几个矩阵可以用在卡尔曼滤波器的方程中。这个过程,实质上将非线性的函数在当前估计值处线性化了。
这样一来,卡尔曼滤波器的等式为(非线性离散方程,对于非线性连续微分方程来说,需要先一阶近似离散):
\[{\hat { {x} } }_{k|k-1}=f({ {x} }_{k-1},{ {u} }_{k},0)\]
使用Jacobians矩阵更新模型:
\[ {F}_{k}=\left.{\frac {\partial f}{\partial { {x} } } }\right\vert _{ {\hat {x} }_{k-1|k-1},{ {u} }_{k} } \]
\[ { {H} }_{k}=\left.{\frac {\partial h}{\partial { {x} } } }\right\vert _{ {\hat{x} }_{k|k-1} } \]
状态矩阵A的雅克比矩阵:
观测矩阵H的雅克比矩阵:
Extended Kalman Filter五条黄金公式 :
\[{\displaystyle {\tilde { {y} } }_{k}={ {z} }_{k}-h({\hat { {x} } }_{k|k-1},0)}\]
\[{\displaystyle { {S} }_{k}={ {H} }_{k}{ {P} }_{k|k-1}{ {H} }_{k}^{T}+{ {R} }_{k} }\]
\[{\displaystyle { {K} }_{k}={ {P} }_{k|k-1}{ {H} }_{k}^{T}{ {S} }_{k}^{-1} }\]
\[{\displaystyle {\hat { {x} } }_{k|k}={\hat { {x} } }_{k|k-1}+{ {K} }_{k}{\tilde { {y} } }_{k} }\]
\[{\displaystyle { {P} }_{k|k}=(I-{ {K} }_{k}{ {H} }_{k}){ {P} }_{k|k-1} }\]
如同扩展卡尔曼滤波器(EKF)一样, UKF的预测过程可以独立于UKF的更新过程之外,与一个线性的(或者确实是扩展卡尔曼滤波器的)更新过程合并来使用;或者,UKF的预测过程与更新过程在上述中地位互换亦可。
1 | % author : Perry.Li @USTC |
模型的结构风险函数包括了经验风险项和正则项,如式\(\eqref{Structural-risk-function}\)所示。其中,前面的均值函数表示的是经验风险函数,L代表的是损失函数,后面的\(\Phi\)是正则化项(regularizer)或者叫惩罚项(penalty term),它可以是L1,也可以是L2,或者其他的正则函数。整个式子表示的意思是找到使目标函数最小时的θ值。
\[\begin{equation}\theta^* = \arg \min_\theta \frac{1}{N}{}\sum_{i=1}^{N} L(y_i, f(x_i; \theta)) + \lambda\ \Phi(\theta)\end{equation}\label{Structural-risk-function}\]
损失函数大致可分为两类:分类问题的损失函数和回归问题的损失函数1。在实际应用中,选取损失函数会受到诸多因素的制约,比如是否有异常值、机器学习算法的选择、梯度下降的时间复杂度、求导的难易程度以及预测值的置信度等等。因此,不存在一种损失函数适用于处理所有类型的数据。
均方误差(MSE)是最常用的回归损失函数,计算方法是求预测值与真实值之间距离的平方和。它只考虑误差的平均大小,不考虑其方向。但由于经过平方,与真实值偏离较多的预测值会比偏离较少的预测值受到更为严重的惩罚。再加上 MSE 的数学特性很好,这使得计算梯度变得更容易。
平均绝对误差(MAE,也称L1损失)是另一种用于回归模型的损失函数。MAE是目标值和预测值之差的绝对值之和。其只衡量了预测值误差的平均模长,而不考虑方向,取值范围也是从0到正无穷(如果考虑方向,则是残差/误差的总和——平均偏差(MBE))。
平均偏差误差(mean bias error):与其它损失函数相比,这个函数在机器学习领域没有那么常见。它与 MAE 相似,唯一的区别是这个函数没有用绝对值。用这个函数需要注意的一点是,正负误差可以互相抵消。尽管在实际应用中没那么准确,但它可以确定模型存在正偏差还是负偏差。
Huber损失,平滑的平均绝对误差。Huber损失对数据中的异常点没有平方误差损失那么敏感。它在0也可微分。本质上,Huber损失是绝对误差,只是在误差很小时,就变为平方误差。误差降到多小时变为二次误差由超参数δ(delta)来控制。当Huber损失在[0-δ,0+δ]之间时,等价为MSE,而在[-∞,δ]和[δ,+∞]时为MAE。
Log-cosh是另一种应用于回归问题中的,且比L2更平滑的的损失函数。它的计算方式是预测误差的双曲余弦的对数。优点:对于较小的x,log(cosh(x))近似等于(x^2)/2,对于较大的x,近似等于abs(x)-log(2)。这意味着‘logcosh’基本类似于均方误差,但不易受到异常点的影响。它具有Huber损失所有的优点,但不同于Huber损失的是,Log-cosh二阶处处可微。但Log-cosh损失也并非完美,其仍存在某些问题。比如误差很大的话,一阶梯度和Hessian会变成定值,这就导致XGBoost出现缺少分裂点的情况。(许多机器学习模型如XGBoost,就是采用牛顿法来寻找最优点。而牛顿法就需要求解二阶导数(Hessian)。因此对于诸如XGBoost这类机器学习框架,损失函数的二阶可微是很有必要的。)
当我们更关注区间预测而不仅是点预测时,分位数损失函数就很有用。使用最小二乘回归进行区间预测,基于的假设是残差(y-y_hat)是独立变量,且方差保持不变。如何选取合适的分位值取决于我们对正误差和反误差的重视程度。损失函数通过分位值(γ)对高估和低估给予不同的惩罚。
仿真对比的一些观察结果2:
Hinge Loss/多分类 SVM 损失:简言之,在一定的安全间隔内(通常是 1),正确类别的分数应高于所有错误类别的分数之和。因此 hinge loss 常用于最大间隔分类(maximum-margin classification),最常用的是支持向量机。尽管不可微,但它是一个凸函数,因此可以轻而易举地使用机器学习领域中常用的凸优化器。
交叉熵损失/负对数似然:这是分类问题中最常见的设置。随着预测概率偏离实际标签,交叉熵损失会逐渐增加。
]]>可能不少人觉得此处获取较好模型是指模型评价,但是模型评价与模型选择是两个不同的概念,代表两个不同的阶段:
从定义看,两者的目标不同,模型评价是模型选择的后一步。换句话说,模型选择是在某个模型类中选择最好的模型,而模型评价对这个最好的模型进行评价。
模型评价可以比较多个模型类中的最佳模型,然后从中挑选出最佳模型,亦或者进行模型融合再进行评价。
随着机器学习普及,大家都有了 “训练 - 验证 - 评价” 的思维,这其实就是完整重现模型选择、模型评价的过程。如下图我们将数据集分成三个不相交的集合来做模型选择和模型评价:
使用训练集、验证集目的就是做模型选择,测试集自然是做模型评价。这三个集合的划分,并没有严格的准则,根据样本大小不同而做不同的选择,但是一个原则是测试集需要保持未知和与训练集、验证集的独立性。
最标准的方法自然在训练集上训练模型,然后在验证集上获取预测误差,该误差也被称作“样本外(extra-sample)误差”,可真实反映出模型的样本外的预测能力,最后选择最小预测误差所对应的模型作为最佳模型即可。但通常而言,独立的验证集我们也没有,手头仅有的信息就是训练集,那么要想估计测试误差或者其期望曲线,就只能在训练集上做文章,一般而言可能仅有两种思路:
对模型选择和模型评价的指导可以凝缩为一句话:根据已知的训练集和验证集在特定模型空间中进行模型选择,获取合适复杂度的模型,然后在多种模型空间做模型选择获取多种模型,最后的最优模型需要通过多个独立未知的测试集来做模型评价决定,否则很容易导致模型过拟合。(这实际上就是一个完整而规范的机器学习过程。)
从 “偏移 - 方差” 分解可以看到,在有限的模型空间中,对某个模型类控制好模型的复杂度非常重要,否则不容易获取较好(包含稳定与预测误差小两方面)的预测模型,这便是模型选择阶段的工作。
在模型选择阶段,比较适合于不同模型的优点,我们可以分析不同的指标参数,如统计意义的参数,R-square,Adjusted R-square,AIC,BIC以及误差项,另一个是Mallows’Cp准则。这个主要是通过将模型与所有可能的子模型进行对比(或谨慎选择他们),检查在你的模型中可能出现的偏差。常见的指标有 AIC 准则、BIC 准则、CV 值、结构风险上界等比较普适的准则。
而在模型评价阶段,我们可以根据分类、回归、排序等不同问题关心的问题选择不同的评价指标,多与模型选择时的损失不同:(1)分类:ROC、AUC、TPR、FPR、F1 score;(2)排序:DCG、NDCG;(3)回归:RMSE、MAE、Deviance。
根据具体业务,实际的评价指标有很多种,最好的方式当然是模型选择时即设计其损失函数即为评价指标,但是通常而言这些指标包含了某些非线性变化,优化起来难度颇大,因此实际模型选择仍是选用经典的那些损失函数,而模型评价则会与其略有不同。
一般而言模型选择准则有如下几种:
一个模型的落地流程如下:
在这个调参过程中主要有 2 个难点:
业界常用的搜索超参数方法主要有网格搜索、随机搜索和贝叶斯优化。
网格搜索(Grid Search)是指在所有候选的参数选择中,通过循环遍历尝试每一种可能性,表现最好的参数就是最终的结果。
举个例子,有两类超参数,每类超参数有 3 个待探索的值,对它们进行笛卡尔积后得到 9 个超参数组合,通过网格搜索使用每种组合来训练模型,并在验证集上挑选出最好的超参数。
网格搜索算法思路及实现方式都很简单,但经过笛卡尔积组合后会扩大搜索空间,并且在存在某种不重要的超参数的情况下,网格搜索会浪费大量的时间及空间做无用功,因此它只适用于超参数数量小的情况。
针对网格搜索的不足,Bengio 等人提出了随机搜索(Random Search)方法1。随机搜索首先为每类超参数定义一个边缘分布,通常取均匀分布,然后在这些参数上采样进行搜索。
随机搜索虽然有随机因素导致搜索结果可能特别差,但是也可能效果特别好。总体来说效率比网格搜索更高,但是不保证一定能找到比较好的超参数。
举个简单的例子,假设关于模型最优超参数组合的函数是一维曲线,由于它是一个黑盒无法直到具体的函数形式,但是可以输入某些值并得到输出。我们随机尝试了 4 个超参数,并得到了对应的性能指标,如下图所示2。
那么问题来了,最优超参数可能在哪里?下一个待探索的超参数是哪个?而每个人猜测的是不一样的,因此每次生成的函数也不同:
可以看到大部分都认为最优超参数是在第 3 个点附近, 由于开始时在右侧采点的离线指标是最差的,所以先验认为最优超参数在这里的可能性不大。接着把这个过程取极限,就会得到一个关于最优超参数的概率分布。假设每个分布都是高斯分布,那么得到的是一个高斯过程,其中高斯分布的均值为 0,方差大概为 5。
这样无论我们猜测最优超参数是取哪个值,总能得到一个关于超参数好坏的描述,即是均值和方差,这里实际上我们用一个无限维的高斯过程来模拟黑盒的超参数搜索的目标函数形式。
总结来说,超参数搜索问题其实是一个黑盒优化问题,贝叶斯优化通过无限维的高斯过程来描述黑盒,在这个高斯过程中可以得到每一组输入超参数的均值和方差。
得到了均值和方差则解决了上文提到的第一个问题:「最优超参数可能在哪里?」,那么下一个待探索的超参数是哪个?这其实是一个 E&E 问题(探索与利用问题),是稳妥地在目前已有的最大值附近搜索还是在不确定性大的地方搜索?后者效果可能很差,但也可能有意想不到的收获。而 Acquisition function 正是平衡 E&E 问题的方式。
可以看出贝叶斯优化(Bayesian Optimization)是通过 acquisition function 平衡均值和方差,做 E&E 问题探索下一个可能的最优超参数。
如上方图所示,虚线代表关于最优超参数的真实函数形式(但实际上它是个黑盒,不知道其具体形式),实线代表当前最好的超参所在位置,两条浅灰线表示的是当前点的方差。
下方图表示已知的和待探索超参数的 Expected Improvement,此时很多地方都有希望能取得比当前最好值更好的超参数,主要需要探索,我们首先选择 0.0 点作为下一个待探索的超参数。
可以看到,此时 0.0 点的方差变为 0。继续寻找下一个待探索的超参数,选择 1.0。
如图,1.0 点的方差变为 0,经过两次探索我们注意到不需要再探索右侧区域,因为我们在右边得到的超参数效果比左边的差。继续选择下一个超参数位置,选择 0.25 点左右的位置。
按照 EI 方法,依次寻找下一个待探索的超参数,这次我们选择的超参数位置大概在 0.7 点。
选择 0.7 点的超参数效果比之前选择的更好,此时 Expected Improvement acquision 建议应该加大在 0.7 附近搜索的力度。
经过几轮探索之后发现最优超参数应该在 0.8 点附近。
Support Vector Regression, which evolved from the support vector classification for doing regression tasks by introduction of the \(\varepsilon\)-insensitive loss function, is a data-driven machine learning methodology.
The parameter \(C\) controls the trade-off between the complexity of the function and the frequency in which errors are allowed. The parameter \(\sigma\) affects the mapping transformation of the input data to the feature space and controls the complexity of the model, thus, it is important to select suitable parameters, and the value of parameter \(\sigma\) should be selected more carefully than \(C\) .
Li, S., Fang, H. & Liu, X., 2018. Parameter optimization of support vector regression based on sine cosine algorithm. Expert Systems with Applications, 91, pp.63–77. Available at: http://dx.doi.org/10.1016/j.eswa.2017.08.038.
Li, S., Fang, H., 2017. A WOA-based algorithm for parameter optimization of support vector regression and its application to condition prognostics. 2017 36th Chinese Control Conference (CCC). Available at: http://dx.doi.org/10.23919/chicc.2017.8028516.
The matlab samples for svm parameter selection can be found in my Source repository.
To be continued...
]]>机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。为此,机器学习主要关注于模式识别。机器学习有助于识别数据集内的模式,并因此尝试根据现有数据进行预测。深度学习是一种实现机器学习的技术1。
一个简单的数学建模,我们需要考虑的是:1. 要做什么?2. 怎么做?3. 这样做合理吗?4. 如果这样做,假设那些可以改变?5. 这样做需要用到那些模型?6. 这种模型简洁吗?7. 确定了这种模型,怎么求解?8. 求解出来了,与现实合理吗?9. 在这个模型中,存在什么缺点,怎么去优化?10. 总结。
目前机器学习已经在数据挖掘、计算机视觉、自然语言处理、生物特征识别、搜索引擎、DNA序列测序、战略游戏和机器人等多个方面都得到了运用。
华盛顿大学 eScience Institute 和 Institute for Neuroengineering 的数据科学博士后 Michael Beyeler2介绍了如何依靠已有的方法(模型选择和超参数调节)去指导你更好地去选择算法。
机器学习算法可以分成两类。离线学习和在线学习。在线机器学习指每次通过一个训练实例学习模型的学习方法。
主动学习(active learning),指的是这样一种学习方法:有的时候,有类标的数据比较稀少而没有类标的数据是相当丰富的,但是对数据进行人工标注又非常昂贵,这时候,学习算法可以主动地提出一些标注请求,将一些经过筛选的数据提交给专家进行标注。这个筛选过程也就是主动学习主要研究的地方了,怎么样筛选数据才能使得请求标注的次数尽量少而最终的结果又尽量好。
主动学习的过程大致是这样的,有一个已经标好类标的数据集K(初始时可能为空),和还没有标记的数据集U,通过K集合的信息,找出一个U的子集C,提出标注请求,待专家将数据集C标注完成后加入到K集合中,进行下一次迭代。
按wiki上所描述的看,主动学习也属于半监督学习的范畴了,但实际上是不一样的,半监督学习和直推学习(transductive learning)以及主动学习,都属于利用未标记数据的学习技术,但基本思想还是有区别的。
如上所述,主动学习的“主动”,指的是主动提出标注请求,也就是说,还是需要一个外在的能够对其请求进行标注的实体(通常就是相关领域人员),即主动学习是交互进行的。而半监督学习,特指的是学习算法不需要人工的干预,基于自身对未标记数据加以利用。
它与半监督学习一样不需要人工干预,不同的是,直推学习假设未标记的数据就是最终要用来测试的数据,学习的目的就是在这些数据上取得最佳泛化能力。相对应的,半监督学习在学习时并不知道最终的测试用例是什么。也就是说,直推学习其实类似于半监督学习的一个子问题,或者说是一个特殊化的半监督学习,所以也有人将其归为半监督学习。
所谓强化学习就是智能系统从环境到行为映射的学习,以使奖励信号(强化信号)函数值最大,强化学习不同于连接主义学习中的监督学习,主要表现在教师信号上,强化学习中由环境提供的强化信号是对产生动作的好坏作一种评价(通常为标量信号),而不是告诉强化学习系统RLS(reinforcement learning system)如何去产生正确的动作。由于外部环境提供的信息很少,RLS必须靠自身的经历进行学习。通过这种方式,RLS在行动-评价的环境中获得知识,改进行动方案以适应环境。
在这种学习模式下,输入数据作为对模型的反馈,不像监督模型那样,输入数据仅仅是作为一个检查模型对错的方式,在强化学习下,输入数据直接反馈 到模型,模型必须对此立刻作出调整。设计一个回报函数(reward function),如果learning agent(如上面的四足机器人、象棋AI程序)在决定一步后,获得了较好的结果,那么我们给agent一些回报(比如回报函数结果为正),得到较差的结果,那么回报函数为负。比如,四足机器人,如果他向前走了一步(接近目标),那么回报函数为正,后退为负。如果我们能够对每一步进行评价,得到相应的回报函数,那么就好办了,我们只需要找到一条回报值最大的路径(每步的回报之和最大),就认为是最佳的路径。
常见的应用场景包括动态系统以及机器人控制等。常见算法包括Q-Learning以及时间差学习(Temporal difference learning)
在传统的机器学习的框架下,学习的任务就是在给定充分训练数据的基础上来学习一个分类模型;然后利用这个学习到的模型来对测试文档进行分类与预测。然而,我们看到机器学习算法在当前的Web挖掘研究中存在着一个关键的问题:一些新出现的领域中的大量训练数据非常难得到。我们看到Web应用领域的发展非常快速。大量新的领域不断涌现,从传统的新闻,到网页,到图片,再到博客、播客等等。传统的机器学习需要对每个领域都标定大量训练数据,这将会耗费大量的人力与物力。而没有大量的标注数据,会使得很多与学习相关研究与应用无法开展。其次,传统的机器学习假设训练数据与测试数据服从相同的数据分布。然而,在许多情况下,这种同分布假设并不满足。通常可能发生的情况如训练数据过期。这往往需要我们去重新标注大量的训练数据以满足我们训练的需要,但标注新数据是非常昂贵的,需要大量的人力与物力。从另外一个角度上看,如果我们有了大量的、在不同分布下的训练数据,完全丢弃这些数据也是非常浪费的。如何合理的利用这些数据就是迁移学习主要解决的问题。迁移学习可以从现有的数据中迁移知识,用来帮助将来的学习。
迁移学习(Transfer Learning)的目标就是将从一个环境中学到的知识用来帮助新环境中的学习任务。因此,迁移学习不会像传统机器学习那样作同分布假设。举一个通俗的例子,一个会下象棋的人可以更容易的学会下围棋;一个认识桌子的人可以更加容易的认识椅子;
在迁移学习方面的工作目前可以分为以下三个部分:同构空间下基于实例的迁移学习,同构空间下基于特征的迁移学习与异构空间下的迁移学习。基于实例的迁移学习有更强的知识迁移能力,基于特征的迁移学习具有更广泛的知识迁移能力,而异构空间的迁移具有广泛的学习与扩展能力。
迁移学习即一种学习对另一种学习的影响,它广泛地存在于知识、技能、态度和行为规范的学习中。任何一种学习都要受到学习者已有知识经验、技能、态度等的影响,只要有学习,就有迁移。迁移是学习的继续和巩固,又是提高和深化学习的条件,学习与迁移不可分割。对于人工智能的发展路径,很多人可能对基于大数据的人工智能很熟悉,但其实还有基于小样本的尝试和迁移,这也是人工智能的一种路径。
总结了机器学习研究者和从业者的宝贵经验34,其中包括需要避免的陷阱、值得关注的重点问题、常见问题的答案:
The Who’s Who Of Machine Learning, And Why You Should Know Them
机器学习里所说的“算法”与程序员所说的“数据结构与算法分析”里的“算法”略有区别。前者更关注结果数据的召回率、精确度、准确性等方面,后者更关注执行过程的时间复杂度、空间复杂度等方面。 当然,实际机器学习问题中,对效率和资源占用的考量是不可或缺的。
『数学基础』『典型机器学习算法』『编程基础』三个并行的部分,是因为机器学习是一个将数学/算法理论和工程实践紧密结合的领域,需要扎实的理论基础帮助引导数据分析与模型调优,同时也需要精湛的工程开发能力去高效化地训练和部署模型和服务。(每一个算法,要在训练集上最大程度拟合同时又保证泛化能力,需要不断分析结果和数据,调优参数,这需要我们对数据分布和模型底层的数学原理有一定的理解。)。具备了机器学习的必要条件,剩下的就是怎么运用它们去做一个完整的机器学习项目。其工作流程如下: 抽象成数学问题—— 获取数据——特征预处理与特征选择——训练模型与调优——模型诊断——模型融合——上线运行。
入门系列:
个人博客系列:
部分网址需要科学上网配置。
人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。简言之,人类智能由三个部分构成。如果所有三个部分都可以在一台机器上复制或近似复制,那么我们就拥有了一个人工智能系统。
工程师Narasimha Prasanna HN撰写的技术博文“what-is-artificial-general-intelligence”主要介绍人工智能的概念,当前人工智能的水平,以及什么是强人工智能,当前实现强人工智能的方向。
人们一般认为机器学习拥有三根重要的柱石:非监督学习、监督学习、强化学习,这三个部分基本上包含了机器学习研究与应用的方方面面。在非监督学习中,算法的目标是对数据进行有效的归纳总结,我们可以把这一过程视为模型将输入的x数据转换为了可以归纳表示输入信息的低维度输出z。而对于监督学习来说、我们需要通过输入数据x预测出输出数据的某一特征y,这是我们最为熟悉的机器学习方法了,主要包括回归和分类两大分支。而对于强化学习来说,对于特定的输入x对应着两个输出分别是action和reward。强化学习的目标就是在给定输入的情况下尽可能地选择出能使r(奖励)最大的a(行为)。有很多问题可以用强化学习来解决,从游戏中的在线决策到网络世界中的最大化收益都可以通过这样的方式来获取较好的解决方案。
在An Outsider’s Tour of Reinforcement Learning(中文)里作者将强化学习归结成了一种预测分析的模式,而在随后的文章里则是以优化控制的形式展开的。
描述性分析指的是通过归纳数据使其具有更好的可解释性,非监督学习就是一种很好的描述性分析方法,而预测分析的目标则是基于现在的数据估计未来的结果,而最终的规范性分析(prescriptive analytics)则旨在指导行动以保证结果。强化学习恰恰就属于最后一个范畴。而最大的挑战则来自于规范性分析。这一类模型的目标十分清晰:强化学习和规范性分析需要分析输入并决定要采取的行动和明确对应的奖励。规范性分析所面对的新数据来源于不确定的环境中,随后需要作出决策并利用这些决策影响环境。这样的系统会在好的决策下获得丰厚的奖励,而在糟糕的决策后则面临着灾难性的结果。但由于反馈来源于复杂的相互联系中使其在理论上难以研究。
强化学习令人不解的原因主要在于它需要我们利用一种在通常机器学习中不常用的核心概念去思考。首先你需要考虑时变的统计学模型并理解数据中的依赖只是暂时的相关而已;第二、你应该理解统计学习问题中的反馈效应,每一次行为后对于结果的观测分布,强化学习系统必须适应这些分布。
凸优化之所以如此重要,是因为:
标准优化问题
凸优化知识体系包括了1:
最速梯度下降法解决的问题是无约束优化问题,而所谓的无约束优化问题就是对目标函数的求解,没有任何的约束限制的优化问题。
牛顿法思想: 用目标函数的二阶泰勒展开近似该目标函数,通过求解这个二次函数的极小值来求解凸优化的搜索方向。
牛顿法推导:凸优化(七)——牛顿法
我们可以看出,牛顿法和最速梯度的不同就是在于最速梯度下降法的迭代方向是梯度的负方向,迭代步长根据一维搜索得到。而牛顿法的迭代方向为上述推导的牛顿步径,迭代步长可以看为定值1。
牛顿法的优缺点:
前向算法的作用是计算输入层结点对隐藏层结点的影响,也就是说,把网络正向的走一遍:输入层—->隐藏层—->输出层,计算每个结点对其下一层结点的影响。
例如,我们要算结点h1的值,那么就是:
\[net_{h_{1}}=i_{1}\times w_{1}+i_{2}\times w_{2}+b_{1} \times 1\]
是一个简单的加权求和。这里稍微说一下,偏置项和权重项的作用是类似的,不同之处在于权重项一般以乘法的形式体现,而偏置项以加法的形式体现。
而在计算结点\(o_1\)时,结点\(h_1\)的输出不能简单的使用\(net_{h1}\)的结果,必须要计算激活函数,激活函数,不是说要去激活什么,而是要指“激活的神经元的特征”通过函数保留并映射出来。以sigmoid函数为例,\(h_1\)的输出:
\[out_{h_{1}}=\frac{1}{1+e^{-net_{h_{1}}}}\]
\[net_{o_{1}}=out_{h_{1}}\times w_{5}+out_{h_{2}}\times w_{6}+b_{2}\times 1\]
\[out_{o_{1}}=\frac{1}{1+e^{-net_{o_{1}}}}\]
按照上面的步骤计算出\(out_{o_{2}}\),则\([out_{o_{1}},out_{o_{2}}]\)就是整个网络第一次前向运算之后得到的结果。
在实际情况中,因为是随机给定的权值,很大的可能(几乎是100%)得到的输出与实际结果之间的偏差非常的大,这个时候我们就需要比较我们的输出和实际结果之间的差异,将这个残差返回给整个网络,调整网络中的权重关系。这也是为什么我们在神经网络中需要后向传播的原因。其主要计算步骤如下:
为什么要归一化?不同的算法,在归一化中得到的好处各不相同。不过目前大部算法,都比较需要归一化,特别是常用的梯度下降法(或梯度下降的衍生方法)。
关于使用matlab工具箱:
先放结论1:HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用的对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全,会有中间人篡改公钥的可能性,所以客户端与服务器不直接使用公钥,而是使用数字证书签发机构颁发的证书来保证非对称加密过程本身的安全。这样通过这些机制协商出一个对称加密算法,就此双方使用该算法进行加密解密。从而解决了客户端与服务器端之间的通信安全问题。
我们先从一个聊天软件说起,我们要实现A能发一个hello消息给B。要实现A发给B的hello消息包,即使被中间人拦截到了,也无法得知消息的内容。
如果使用非对称加密算法,我们的客户端A,B需要一开始就持有公钥。
第三方机构的公钥怎么跑到了客户端的机器中呢?现实中,浏览器和操作系统都会维护一个权威的第三方机构列表(包括它们的公钥)。因为客户端接收到的证书中会写有颁发机构,客户端就根据这个颁发机构的值在本地找相应的公钥。
区块链就是一个数据库,记载了所有的交易,用作中央记账系统。每笔交易的核心,就是一句话,比如"张三向李四转移了1个比特币"。为了证明这句话可信,张三为它加上了数字签名。任何人都可以用张三的公钥,证明这确实是张三本人的行为。另一方面,其他人无法伪造张三的数字签名,所以不可能伪造这笔交易。矿工们收到这句话,首先验证数字签名的可信性,然后验证张三确实拥有这些比特币(每一笔交易都有上一笔交易的编号,用来查询比特币的来源)。验证通过以后,就着手把这句话写入区块链了。一旦写入区块链,所有人就都可以查询到,因此这笔比特币就被认为,从张三转移到了李四。区块链的作用就是把这句话永久保存下来了,让任何人都可以查看,并且任何人(包括张三本人在内)都无法再修改了。
分布式数据库并非新发明,但是,区块链有一个革命性特点。区块链没有管理员,它是彻底无中心的。每个节点都是平等的,都保存着整个数据库。你可以向任何一个节点,写入/读取数据,所有节点最后都会同步,保证区块链一致。
区块链奇妙的地方在于怎么才能保证数据是可信。区块链由一个个区块(block)组成。区块很像数据库的记录,每次写入数据,就是创建一个区块。每个区块包含区块头(Head)和区块体(Body)。区块头包含了当前区块的多项元信息,如Hash值。正是通过这种联动机制,区块链保证了自身的可靠性,数据一旦写入,就无法被篡改。
由于必须保证节点之间的同步,所以新区块的添加速度不能太快。你永远只能在最新区块的后面,生成下一个区块。区块链的设计是,平均每10分钟,全网才能生成一个新区块,一小时也就六个。也就是说,只有通过极其大量的计算,才能得到当前区块的有效 Hash,从而把新区块添加到区块链。由于计算量太大,所以快不起来。这个过程就叫做采矿(mining),计算 Hash 的机器就叫做矿机,操作矿机的人就叫做矿工。
如果两个人同时向区块链写入数据,也就是说,同时有两个区块加入,因为它们都连着前一个区块,就形成了分叉。这时应该采纳哪一个区块呢?现在的规则是,新节点总是采用最长的那条区块链。如果区块链有分叉,将看哪个分支在分叉点后面,先达到6个新区块(称为"六次确认")。按照10分钟一个区块计算,一小时就可以确认。
区块链作为无人管理的分布式数据库,从2009年开始已经运行了8年,没有出现大的问题。这证明它是可行的。但是,为了保证数据的可靠性,区块链也有自己的代价。一是效率,数据写入区块链,最少要等待十分钟,所有节点都同步数据,则需要更多的时间;二是能耗,区块的生成需要矿工进行无数无意义的计算,这是非常耗费能源的。
目前,区块链最大的应用场景(可能也是唯一的应用场景),就是以比特币为代表的加密货币。
样本不平衡往往会导致模型对样本数较多的分类造成过拟合,即总是将样本分到了样本数较多的分类中;除此之外,一个典型的问题就是 Accuracy Paradox,这个问题指的是模型的对样本预测的准确率很高,但是模型的泛化能力差。其原因是模型将大多数的样本都归类为样本数较多的那一类。
针对样本的不平衡问题,有以下几种常见的解决思路:
8 Tactics to Combat Imbalanced Classes in Your Machine Learning Dataset
In classification, how do you handle an unbalanced training set?
搜集更多的数据,从而让正负样本的比例平衡,这种方法往往是最被忽视的方法,然而实际上,当搜集数据的代价不大时,这种方法是最有效的。
但是需要注意,当搜集数据的场景本来产生数据的比例就是不平衡时,这种方法并不能解决数据比例不平衡问题。
改变评判指标,也就是不用准确率来评判和选择模型,原因就是我们上面提到的 Accuracy Paradox 问题。实际上有一些评判指标就是专门解决样本不平衡时的评判问题的,如准确率,召回率,F1值,ROC(AUC),Kappa 等。
根据这篇文章,ROC 曲线具有不随样本比例而改变的良好性质,因此能够在样本比例不平衡的情况下较好地反映出分类器的优劣。
关于评判指标更详细的内容可参考文章: Classification Accuracy is Not Enough: More Performance Measures You Can Use
对数据采样可以有针对性地改变数据中样本的比例,采样一般有两种方式:over-sampling 和 under-sampling,前者是增加样本数较少的样本,其方式是直接复制原来的样本,而后者是减少样本数较多的样本,其方式是丢弃这些多余的样本。
通常来说,当总样本数目较多的时候考虑 under-sampling,而样本数数目较少的时候考虑 over-sampling。
关于数据采样更详细的内容可参考 Oversampling and undersampling in data analysis
合成样本(Synthetic Samples)是为了增加样本数目较少的那一类的样本,合成指的是通过组合已有的样本的各个 feature 从而产生新的样本。
一种最简单的方法就是从各个 feature 中随机选出一个已有值,然后拼接成一个新的样本,这种方法增加了样本数目较少的类别的样本数,作用与上面提到的 Over-sampling 方法一样,不同点在于上面的方法是单纯的复制样本,而这里则是拼接得到新的样本。
这类方法中的具有代表性的方法是 SMOTE(Synthetic Minority Over-sampling Technique),这个方法通过在相似样本中进行 feature 的随机选择并拼接出新的样本。
关于 SMOTE 更详细的信息可参考论文 SMOTE: Synthetic Minority Over-sampling Technique
改变样本权重指的是增大样本数较少类别的样本的权重,当这样的样本被误分时,其损失值要乘上相应的权重,从而让分类器更加关注这一类数目较少的样本。