程序员怎么学数学(做程序员数学要达到什么水平)

http://www.itjxue.com  2023-04-14 13:57  来源:未知  点击次数: 

程序员怎样学数学

First: programmers don't think they need to know math. I hear that so often; I hardly know anyone who disagrees. Even programmers who were math majors tell me they don'拿雀t really use math all that much! They say it's better to know about design patterns, object-oriented methodologies, software tools, interface design, stuff like that. 首先:程序员不认为他们需要了解数学.我常常听到这样的话;我不知道还有没有不同意的.甚至于以前是主修数学的程序员也告诉我他们真的不是常常使用到数学!他们说更重要的是要去了解设计模式,面向对象原理,软件工具,界面设计,以及一些其他类似的东西. And you know what? They're absolutely right. You can be a good, solid, professional programmer without knowing much math. 你了解吗?他们完全正确.你不需要了解很多数学你就能做个很棒,很专业的程序员. But hey, you don't really need to know how to program, either. Let's face it: there are a lot of professional programmers out there who realize they're not very good at it, and they still find ways to contribute. 但是呢,同时你也不是真的需要知道如何来编程.我们要面对的是:有很多专业的程序员,他们认识到他们不是非常擅长数学,但他们还是寻找方法去提升. If you're suddenly feeling out of your depth, and everyone appears to be running circles around you, what are your options? Well, you might discover you're good at project management, or people management, or UI design, or technical writing, or system administration, any number of other important things that "programmers" aren't necessarily any good at. You'll start filling those niches (because there's always more work to do), and as soon as you find something you're good at, you'll probably migrate towards doing it full-time. 如果你突然觉得自己好烂,周围的人都远远的超过你消袜早,你会怎么想呢?好,你可能会发现自己善于项目管理,或人事管理,或界面设计,或技术写作,或系统管理,还有许多其他程序员不必去精通的.你会开始堆积那些想法(因为工作永远干不完),当你发现一些你能掌握的东西时,你很可能会转移去全职的做这个好模工作. In fact, I don't think you need to know anything, as long as you can stay alive somehow. 实际上,我认为有些东西你不需要了解,当前你还能够赖以生存的话. So they're right: you don't need to know math, and you can get by for your entire life just fine withoutit. 所以他们是对的:你不需要了解数学,并且没有数学你也能过的很好. But a few things I've learned recently might surprise you: 但是最近我学到一些东西可能会让你也感到惊喜:They teach math all wrong in school. Way, WAY wrong. If you teach yourself math the right way, you'll learn faster, remember it longer, and it'll be much more valuable to you as a programmer. 学校里教数学的方式都错了.仅仅是教学的方法错了,不是教数学本身错.如果你以正确的方式学习数学的话,你会学的更快,记住这点,对你,作为一个程序员来说很有价值.Knowing even a little of the right kinds of math can enable you do write some pretty interesting programs that would otherwise be too hard. In other words, math is something you can pick up a little at a time, whenever you have free time. 哪怕了解一点点相关的数学知识,就能让你写出可爱有趣的程序,否则会有些小难度.换句话讲,数学是可以慢慢学的,只要你有时间.Nobody knows all of math, not even the best mathematicians. The field is constantly expanding, as people invent new formalisms to solve their own problems. And with any given math problem, just like in programming, there's more than one way to do it. You can pick the one you like best. 没人能了解所有的数学,就是最棒的数学家也不是.当人们发明新的形式去解决自己的问题时,数学领域就不断的扩展.一些给出的数学问题,也正如编程,不止一种方法可以去解决他.你可以挑个你最喜欢的方式.Math is... ummm, please don't tell anyone I said this; I'll never get invited to another party as long as I live. But math, well... I'd better whisper this, so listen up: (it's actually kinda fun.) 数学是......嗯,请别告诉别人我说过这个哈;当然我也不指望谁能邀请我参加这样的派对,在我还活着的时候.但是,数学其实就是......我还是小声的说吧,听好了:(她其实就是一种乐趣啦!) The Math You Learned (And Forgot) 你学到的数学(和你忘了的数学) Here's the math I learned in school, as far as I can remember: 这儿是我能记得的在学校学到的数学: Grade School: Numbers, Counting, Arithmetic, Pre-Algebra ("story problems") 初中:数,数数,算术知识,初级代数("带问题的小故事") High School: Algebra, Geometry, Advanced Algebra, Trigonometry, Pre-Calculus (conics and limits) 高中:代数,几何,高等代数,三角学,微积分先修课 (二次曲线论和极限) College: Differential and Integral Calculus, Differential Equations, Linear Algebra, Probability and Statistics, Discrete Math 大学:微积分,微分公式,线性代数,概率和统计,离散数学 How'd they come up with that particular list for high school, anyway? It's more or less the same courses in most U.S. high schools. I think it's very similar in other countries, too, except that their students have finished the list by the time they're nine years old. (Americans really kick butt at monster-truck competitions, though, so it's not a total loss.) 上面那个关于高中数学课程单子上所列的,怎么来着?美国高中几乎都是这样的课程设置.我认为其他国家也会很相似的,除了那些在9岁之前就掌握了这些课程的学生.(美国小孩同时却在热衷于玩魔鬼卡车竞赛,虽然如此,整个来说也算不上什么大损失.) Algebra? Sure. No question. You need that. And a basic understanding of Cartesian geometry, too. Those are useful, and you can learn everything you need to know in a few months, give or take. But the rest of them? I think an introduction to the basics might be useful, but spending a whole semester or year on them seems ridiculous. 代数?是的.没问题.你需要代数.和一些理解解析几何的知识.那些很有用,并且在以后几个月里,你能学到一切你想要的,十拿九稳的.剩下的呢?我认为一个基本的介绍可能会有用,但是在这上面花整个学期或一年就显得很荒谬了. I'm guessing the list was designed to prepare students for science and engineering professions. The math courses they teach in and high school don't help ready you for a career in programming, and the simple fact is that the number of programming jobs is rapidly outpacing the demand for all other engineering roles. 我现在意识到那个书单列表原是设计来准备给那些以后要当科学家和工程师的学生的.他们在高中里所教的数学课程并不是为你的编程生涯做准备的,简单的事实是,多数的编程工作所需要的数学知识相比其他作为工程师角色的人所需要的数学增长的更快. And even if you're planning on being a scientist or an engineer, I've found it's much easier to learn and appreciate geometry and trig after you understand what exactly math is — where it came from, where it's going, what it's for. No need to dive right into memorizing geometric proofs and trigonometric identities. But that's exactly what high schools have you do. 即使你打算当一名科学家或者一名工程师,在你理解了什么是数学之后-- 数学它如何而来,如何而去,为何而生,我发现这更加容易去学习和欣赏几何学和三角学.不必去专研记住几何上的证明和三角恒等式,虽然那确实是高中学校要求你必须去做的. So the list's no good anymore. Schools are teaching us the wrong math, and they're teaching it the wrong way. It's no wonder programmers think they don't need any math: most of the math we learned isn't helping us. 所以这样的书单列表不再有什么用了.学校教给我们的不是最合适的数学,并且方式也不对.不奇怪程序员认为他们不再需要数学:我们学的大部分数学知识对我们的工作没什么大的帮助. The Math They Didn't Teach You 他们没有教给你的那部分数学 The math computer scientists use regularly, in real life, has very little overlap with the list above. For onething, most of the math you learn in grade school and high school is continuous: that is, math on the real numbers. For computer scientists, 95% or more of the interesting math is discrete: i.e., math on the integers. 在现实中,计算机科学家经常使用的数学,跟上面所列的数学仅有很小的重叠. 举个例子,你在中学里学的大部分数学是连续性的:也就是说,那是作为实数的数学.而对于计算机科学家来说,他们所感兴趣的95%也许更多的是离散性的:比如,关于整数的数学. I'm going to talk in a future blog about some key differences between computer science, software engineering, programming, hacking, and other oft-confused disciplines. I got the basic framework for these (upcoming) insights in no small part from Richard Gabriel's Patterns Of Software, so if you absolutely can't wait, go read that. It's a good book. 我打算在以后的博客中再谈一些有关计算机科学,软件工程,编程,搞些有趣的东东,和其他常常令人犯晕的训练.我已经从Richard Gabriel的软件的模式这本书中洞察到一个无关巨细的基本框架.如果你明显的等不下去的话,去读吧.是本不错的书. For now, though, don't let the term "computer scientist" worry you. It sounds intimidating, but math isn't the exclusive purview of computer scientists; you can learn it all by yourself as a closet hacker, and be just as good (or better) at it than they are. Your background as a programmer will help keep you focused on the practical side of things. 到现在为止,不要让"计算机科学家"这个词困扰到你.它听上去很可怕,其实数学不是计算机科学家所独有的领域,你也能作为一个黑客自学它,并且能做的和他们一样棒.你作为一个程序员的背景将会帮助你保持只关注那些有实践性的部分. The math we use for modeling computational problems is, by and large, math on discrete integers. Thisis a generalization. If you're with me on today's blog, you'll be studying a little more math from now on than you were planning to before today, and you'll discover places where the generalization isn't true. But by then, a short time from now, you'll be confident enough to ignore all this and teach yourself math the way you want to learn it. 我们用来建立计算模型的,大体上是离散数学.这是普遍的做法.如果正好今天你在看这篇博客,从现在起你正了解到更多的数学,并且你会认识到那样的普遍做法是不对的.从现在开始,你将有信心认为可以忽略这些,并以你想要的方式自学. For programmers, the most useful branch of discrete math is probability theory. It's the first thing they should teach you after arithmetic, in grade school. What's probability theory, you ask? Why, it's counting. How many ways are there to make a Full House in poker? Or a Royal Flush? Whenever you think ofa question that starts with "how many ways..." or "what are the odds...", it's a probability question. And as it happens (what are the odds?), it all just turns out to be "simple" counting. It starts with flipping acoin and goes from there. It's definitely the first thing they should teach you in grade school after you learn Basic Calculator Usage. 对程序员来说,最有效的离散数学的分支是概率理论.这是你在学校学完基本算术后的紧接着的课.你会问,什么是概率理论呢?你就数啊,看有多少次出现满堂彩?或者有多次是同花顺. 不管你思考什么问题如果是以"多少种途径..."或"有多大几率的...",那就是离散问题.当他发生时,都转化成"简单"的计数.抛个硬币看看...? 毫无疑问在他们教你基本的计算用法后他们会教你概率理论. I still have my discrete math textbook from college. It's a bit heavyweight for a third-grader (maybe), but it does cover a lot of the math we use in "everyday" computer science and computer engineering. 我还保存着大学里的离散数学课本.可能他只占了三分之一的课程,但是它却涵盖了我们几乎每天计算机编程工作大部分所用到的数学. Oddly enough, my professor didn't tell me what it was for. Or I didn't hear. Or something. So I didn't pay very close attention: just enough to pass the course and forget this hateful topic forever, because I didn't think it had anything to do with programming. That happened in quite a few of my comp sci courses in college, maybe as many as 25% of them. Poor me! I had to figure out what was important on my own, later, the hard way. 也真是够奇怪的,我的教授从没告诉我数学是用来干吗的.或者我也从来没有听说过.种种原因吧.所以我也从没有给以足够的注意:只是考试及格然后把他们都忘光,因为我不认为她还和编程有啥关系.事情变化是我在大学学完一些计算机科学的课程之后,也许是25%的课程.可怜啊!我必须弄明白什么对于自己来说是最重要的,然后再是向深度发展. I think it would be nice if every math course spent a full week just introducing you to the subject, in themost fun way possible, so you know why the heck you're learning it. Heck, that's probably true for every course. 我想,如果每门数学课都花上整整一周的时间,而只是介绍让你如何入门的话,那将非常不错,这是最有意思的一种假设,那么你知道了你正学习的对象是哪种怪物了.怪物,大概对每一门课都合适. Aside from probability and discrete math, there are a few other branches of mathematics that are potentially quite useful to programmers, and they usually don't teach them in school, unless you're a math minor. This list includes: 除了概率和离散数学外,还有不少其他的数学分支,可能对程序员相当的有用,学校通常不会教你的,除非你的辅修科目是数学.这些数目列表包括:Statistics, some of which is covered in my discrete math book, but it's really a discipline of its own. A pretty important one, too, but hopefully it needs no introduction. 统计学,其中一些包括在我的离散数学课里,她的某些训练只限于她自身.自然也是相当重要的,但想学的话不需要什么特别的入门. Algebra and Linear Algebra (i.e., matrices). They should teach Linear Algebra immediately after algebra. It's pretty easy, and it's amazingly useful in all sorts of domains, including machine learning. 代数和线性代数(比如,矩阵).他们会在教完代数后立即教线性代数.这也简单,这但相当多的领域非常有用,包括机器学习. Mathematical Logic. I have a really cool totally unreadable book on the subject by Stephen Kleene, the inventor of the Kleene closure and, as far as I know, Kleenex. Don't read that one. I swear I've tried 20 times, and never made it past chapter 2. If anyone has a recommendation for a better introduction to this field, please post a comment. It's obviously important stuff, though. 数理逻辑.我有相当完整的关于这门学科的书没有读,是Stephen Kleene写的,克林闭包的发明者,我所知道的还有就是Kleenex.这个就不要读了.我发誓我已经尝试了不下20次,却从没有读完第二章.如果哪位牛掰有什么更好的入门建议的话可以给我推荐.虽然,这明显是非常重要的一部分.Information Theory and Kolmogorov Complexity. Weird, eh? I bet none of your high schools taught either of those. They're both pretty new. Information theory is (veeery roughly) about data compression, and Kolmogorov Complexity is (also roughly) about algorithmic complexity. I.e., how small you can you make it, how long will it take, how elegant can the program or data structure be, things like that. They're both fun, interesting and useful. 信息理论和柯尔莫戈洛夫复杂性理论.真不可思议,不是么?我敢打赌没哪个高中会教你其中任何一门课程.她们都是新兴的学科.信息理论是(相当相当相当相当难懂)关于数据压缩,柯尔莫戈洛夫复杂性理论是(同样非常难懂)关于算法复杂度的.也就是说,你要把它压缩的尽量小,你所要花费的时间也就变的越长,同样的,程序或数据结构要变得多优雅也有同样的代价.他们都很有趣,也很有用.There are others, of course, and some of the fields overlap. But it just goes to show: the math that you'll find useful is pretty different from the math your school thought would be useful. 当然,也有其他的一些因素,某些领域是重复的.也拿来说说吧:你所发现有用的那部分数学,不同于那些你在学校里认为有用的数学. What about calculus? Everyone teaches it, so it must be important, right? 那微积分呢?每个人都学它,所以它也一定是重要的,不对吗?

计算机专业应该怎样学数学

计算机专业应该怎样学数学?想了解更多的信息吗,和我一起看看吧!以下是我分享给大家的计算机专业学数学的方法,希望可以帮到你!

计算机专业学数学的方法

学习计算机,你需要有一定的数学及英语基础,在硬件方面最好有一些电路电子基础。

掌握几门开发语言是必须的,一般从C语言学起,然后学一门面向对象的语言,一般是C++或者Java。

算法与数据结构也是必须学的。数据结构的链表、队列、栈、树、图等都是重要内容,还有算法中的排序、查找、搜索等。

数据库也是必学的,SQL语句、数据库范式等等,学的较多的是SQL Sever和MySQL。

计算机组成原理以及计算机系统结构等关于计算机硬件组成的课。

计算机操作系统也是必学科目。现在的课本大都以Linux为例讲解操作系统,包括进程管理、文件操作等内容。

计算机网络当然也不能少。网络分层来讲解,包括物理层、数据链路层、网络层、传输层等。

数学对计算机专业的重要性

经常听人说要学好计算机必须学好数学,在编程中有用到数学了吗?

不少人答案中指出的:在实践中数学无处不在。其实这些数学都不是每个计算机专业学生必备的知识。

理由是,计算机已经深入到各个领域了森旦碧,而在每个领域的应迟余用中,自然要学会,并且懂得那个领域的知识,这些知识便包括了数学。

先说专业外的应用,我做工程模拟,那我自然要会卷积,拉普拉斯变换;而我做社交网络分析,图论就显得更重要了。而这些与计算机本身是无关的,是与实践领域相关的。PHP程序员大概就不需要这些数学,但他们也是属于计算机专业的。

软件工程专业涉及到的数学,特点是具体、直观、离散、实用。 Knuth 的《具体数学》定位就非常好。除非是理论计算机方向,一般程序员需要的「数学」其实是指具体的算法和技巧,基本算是「应用数学」而已。

再说被分到计算机内此举的学科,有人说机器学习需要大量的数学。即便是机器学习的科研工作者,用这些工具的,也大都是数学出身的,爱做分析性质研究的家伙。工程师学好线代和统计就差不多了,而这类工程师,其实可以被看作是做特殊应用的。更夸张地推一步,量子计算机也算是计算机专业的一个边缘分支。难道可以因此说:学好量子力学对计算机专业很重要吗?

然而,学好数学是没有坏处的。学好数学不是每个计算机专业的必须要求,但是学好数学的学生可以在更广阔的领域内大展拳脚。希望成为研究人员的话,那数学确实是要尽可能多地学。

很多和计算机挂钩的领域确实用到大量数学,尤其是研究方向。但是如果各个领域的人都出来秀一把虐过自己的数学,那恐怕是会吓走不少想学计算机,但数学不是很强的人。而实际上计算机专业大部分人是用不到多少数学的。而且就业方面的信息显示,全球范围内计算机专业学生还是供应不足的。

计算机专业考研方向

1、计算机应用技术

研究方向:计算机网络、实时计算机应用、CIMS、计算机图形学、并行计算、网络信息安全、数据库、情感计算、数据挖掘、分布式计算、知识工程、计算机视觉、自动推理、机器学习、草图理解、网络性能分析与协议设计、网络管理与安全、计算机图形学、信息可视化、基于GPU的高性能计算、复杂系统(应急、物流、海洋)领域工程、基于SOA的空间信息共享与业务协同、语义搜索引擎、自然语言处理、机器翻译、搜索引擎、空中交通信息系统与控制、民航信息与决策支持系统、智能交通系统理论与技术等。

专业特点:计算机应用技术是针对社会与各种企事业单位的信息化需求,通过对计算机软硬件与网络技术的选择、应用和集成,对信息系统进行需求分析、规划和设计,提供与实施技术与解决方案,创建优化的信息系统,并对其运行实行有效的技术维护和管理的学科。

培养这方面人才所涉及的知识面包括:数学与信息技术基础、程序设计基础、系统平台技术、计算机网络、信息管理与安全、人机交互、集成程序开发、系统架构与集成、Web与数字媒体技术、工程实施、职业操守等。培养目标是为企事业单位和政府机构提供首席信息官及承担信息化建设核心任务的人才,并提供为IT企业提供系统分析人才。

科研状况:本专业是天津市第一个计算机类博士点,主要从事计算机技术在其它领域应用中核心技术问题研究及相关信息系统开发。近年来在计算机集成制造(CIMS)、计算机辅助教学、虚拟现实技术应用、计算机工业控制、电子商务等方向承担国家863项目及重大项目、国家自然科学基金十余项。承担省部级及横向科研课题近百项。为国家和天津市的信息化建设做出了重要贡献。

近几年报考简况:本专业从80年代初开始招生,至今已为国家培养出硕士学位研究生300多名。近年来,报考人数和录取名额逐年同步增加。

硕士期间主要课程及论文要求:主要课程:高等计算机网络、计算理论、排队论及在计算机中的应用、应用组合数学、软件体系结构、面向对象方法学、分布式计算机系统、并行计算、高级计算机图形学、高级人工智能、模式识别与理解、机器学习、密码学与信息安全、统一建模语言。

论文要求:论文选题涉及计算机在各领域应用的理论研究、尖端技术开发、以及在国民经济各个领域的应用研究。论文应能全面反映本学科发展动态、具有科学性、先进性和一定的创新性。对于理论研究课题,要求达到较高的理论水平和创新;对于系统设计、系统开发及系统应用课题,要求指导理论正确,实现技术先进,设计新颖,所设计的系统应能付诸实现、具有实际应用价值并能够带来明显的社会经济效益。

就业方向:本专业培养的研究生具有坚实的计算机科学与技术的理论基础,全面掌握计算机应用领域的理论和工程方法,能很好地胜任高等院校、科研院所、大型企事业单位、高新技术产业等的教学、科研、系统设计、产品开发、应用系统集成等工作。

2、计算机软件与理论

研究方向:计算理论、算法理论; 软件工程、中间件、智能软件、计算环境;并行计算、网格计算、普及计算;密码学、信息安全、数据理论;图形图象算法、可视化方法;人工智能应用基础;理论计算机科学其他方向

专业特点:计算机软件与理论专业涉及计算机科学与技术的基本理论和方法,强调计算、算法、软件、设计等概念,主要的领域包括计算理论、算法与复杂性、程序设计语言、软件设计与理论、数据库系统、人工智能、操作系统与编译理论、信息安全理论与方法、图形学与可视化计算、以网络为中心的计算等。

科研状况:计算机软件与理论专业是我院重点发展,进步较快的专业。近年来承担国家863、自然科学基金、,以及省部级项目多项。在网络信息安全、中间件技术、并行计算、网格计算、计算机图形学等方面取得了多项前沿性成果。

近几年报考简况:本专业从96年代初开始招生,至今已为国家培养出硕士学位研究生50多名。近年来,报考人数和录取名额逐年同步增加。

硕士期间主要课程及论文要求:主要课程:计算理论、应用组合数学、软件体系结构、面向对象方法学、分布式计算机系统、并行计算、高级计算机图形学、高级人工智能、模式识别与理解、机器学习、密码学与信息安全、统一建模语言。

论文要求:论文选题涉及计算机软件的理论研究、尖端技术开发、以及在国民经济各个领域的应用研究。论文应能全面反映本学科发展动态、具有科学性、先进性和一定的创新性。对于理论研究课题,要求达到较高的理论水平和创新;对于系统设计、系统开发及系统应用课题,要求指导理论正确,实现技术先进,设计新颖,所设计的系统应能付诸实现、具有实际应用价值并能够带来明显的社会经济效益。

就业方向:本专业培养的研究生具有坚实的计算机科学与技术的理论基础,全面掌握计算机软件的理论方法,以及软件工程、信息系统、并行计算、普及计算等等的软件系统开发技术,能很好地胜任高等院校、科研院所、大型企事业单位、高新技术产业等的教学、科研、系统设计、产品开发、应用系统集成等工作。

3、计算机系统结构

研究方向:分布式计算机系统、计算机网络系统与全球个人计算系统、真实感图形生成与虚拟现实技术

专业特点:计算机系统结构(原名计算机组织与系统结构)专业全面研究各种类型的计算机系统(从单机到网络)的构成、硬件与软件的联系与功能匹配、计算机系统性能评价与改进等。该专业的研究课题涉及高性能处理机系统结构、多机系统、并行计算与分布式计算系统、计算机系统性能评价、VLSL设计、容错计算技术、计算机接口技术、计算机网络系统与通信系统、移动计算、全球个人计算系统等。

科研状况:本专业近年来承担多项国家科委、国家教委、国家计委及天津市自然科学基金项目,并有多项科研获奖。其中G.T9112计算机解密系统获北京市公安局科技进步二等奖,表面高度复杂实体的CAM获国家科委科技进步二等奖。目前承担国家自然科学基金项目“面向ASIC的真实感图形算法和系统结构的研究”、国家高科技863项目“用于建筑环境仿真设计的分布式多用户虚拟现实系统”、天津自然科学基金项目“分布式多用户VR开发系统平台的研究”和一大批为企事业单位开发的横向科研项目。

近几年报考简况:本专业从80年代初开始招生,至今已为国家培养出硕士学位研究生50多名。近年来,报考人数和录取名额逐年同步增加。

硕士期间主要课程及论文要求:主要课程:应用数学、外语、高等计算机网络、排队论及在计算机中的应用、计算理论、现代计算机体系结构、计算机综合实验、计算机控制及应用、计算机网络研究热点问题、计算机系统仿真、量子计算、密码学与信息安全、面向对象方法学、嵌入式系统设计、统一建模语言、图象/模式识别与理解、机器学习、软件体系结构。

论文要求:论文选题涉及计算机系统结构的理论研究、尖端技术开发、以及在国民经济各个领域的应用研究。论文应能全面反映本学科发展动态、具有科学性、先进性和一定的创新性。对于理论研究课题,要求达到较高的理论水平和创新;对于系统设计、系统开发及系统应用课题,要求指导理论正确,实现技术先进,设计新颖,所设计的系统应能付诸实现、具有实际应用价值并能够带来明显的社会经济效益。

就业方向:本专业培养的研究生具有坚实的计算机科学与技术的理论基础,全面掌握计算机系统结构、计算机工程、网络工程、嵌入式系统等的应用开发技术、能很好地胜任高等院校、科研院所、大型企事业单位、高新技术产业等的教学、科研、系统设计、产品开发、应用系统集成等工作。

猜你喜欢:

1. 大学计算机专业排名

2. 计算机专业大学排名

3. 计算机专业面试自我介绍一分钟

4. 计算机专业大学排名

5. 计算机专业大学排名榜单

程序员必备的一些数学基础知识

作为一个标准的程序员,应该有一些基本的数学素养,尤其现在很多人在学习人工智能相关知识,想抓住一波人工智能的机会。很多程序员可能连这样一些基础的数学问题都回答盯手启不上来。

作为一个傲娇的程序员,应该要凯如掌握这些数学基础知识,才更有可能码出一个伟大的产品。

向量 向量(vector)是由一组实数组成的有序数组,同时具有大小和方向。一个n维向量a是由n个有序实数组成,表示为 a = [a1, a2, · · · , an]

矩阵

线性映射 矩阵通常表示一个n维线性空间v到m维线性空间w的一个映射f: v - w

注:为了书写方便, X.T ,表示向量X的转置。 这里: X(x1,x2,...,xn).T,y(y1,y2,...ym).T ,都是列向量。分别表示v,w两个线性空间中的两个向量。A(m,n)是一个 m*n 的矩阵,描述了从v到w的一个线性映射。

转置 将矩阵行列互换。

加法 如果A和B 都为m × n的矩阵,则A和B 的加也是m × n的矩阵,其每个元素是A和B相应元素相加。 [A + B]ij = aij + bij .

乘法 如A是k × m矩阵和B 是m × n矩阵,则乘积AB 是一个k × n的矩阵。

对角矩阵 对角矩阵是一个主对角线之外的元素皆为0的矩阵。对角线上的元素可以为0或其他值。一个n × n的对角矩阵A满足: [A]ij = 0 if i ?= j ?i, j ∈ {1, · · · , n}

特征值与特征矢量 如果一个标量λ和一个非零向量v满足 Av = λv, 则λ和v分别称为矩阵A的特征值和特征向量。

矩阵分解 一个矩阵通常可以用一些比较“简单”的矩阵来表示,称为矩阵分解。

奇异值分解 一个m×n的矩阵A的奇异值分解

其中U 和V 分别为m × m和n×n 的正交矩阵,Σ为m × n的对角矩阵,其对角 线上的元素称为奇异值(singular value)。

特征分解 一个n × n的方块矩阵A的特征分解(Eigendecomposition)定义为

其中Q为n × n的方块矩阵,其每一列都为A的特征向量,^为对角阵,其每一 个对角元素为A的特征值。 如果A为对称矩阵,则A可以被分解为

其中Q为正交阵。

导数 对于定义域和值域都是实数域的函数 f : R → R ,若f(x)在点x0 的某个邻域?x内,极限

存在,则称函数f(x)在点x0 处可导, f'(x0) 称为薯拿其导数,或导函数。 若函数f(x)在其定义域包含的某区间内每一个点都可导,那么也可以说函数f(x)在这个区间内可导。连续函数不一定可导,可导函数一定连续。例如函数|x|为连续函数,但在点x = 0处不可导。

加法法则

y = f(x),z = g(x) 则

乘法法则

链式法则 求复合函数导数的一个法则,是在微积分中计算导数的一种常用方法。若 x ∈ R,y = g(x) ∈ R,z = f(y) ∈ R ,则

Logistic函数是一种常用的S形函数,是比利时数学家 Pierre Fran?ois Verhulst在 1844-1845 年研究种群数量的增长模型时提出命名的,最初作为一种生 态学模型。 Logistic函数定义为:

当参数为 (k = 1, x0 = 0, L = 1) 时,logistic函数称为标准logistic函数,记 为 σ(x) 。

标准logistic函数在机器学习中使用得非常广泛,经常用来将一个实数空间的数映射到(0, 1)区间。标准 logistic 函数的导数为:

softmax函数是将多个标量映射为一个概率分布。对于 K 个标量 x1, · · · , xK , softmax 函数定义为

这样,我们可以将 K 个变量 x1, · · · , xK 转换为一个分布: z1, · · · , zK ,满足

当softmax 函数的输入为K 维向量x时,

其中,1K = [1, · · · , 1]K×1 是K 维的全1向量。其导数为

离散优化和连续优化 :根据输入变量x的值域是否为实数域,数学优化问题可以分为离散优化问题和连续优化问题。

无约束优化和约束优化 :在连续优化问题中,根据是否有变量的约束条件,可以将优化问题分为无约束优化问题和约束优化问题。 ### 优化算法

全局最优和局部最优

海赛矩阵

《运筹学里面有讲》,前面一篇文章计算梯度步长的时候也用到了: 梯度下降算法

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

梯度下降法

梯度下降法(Gradient Descent Method),也叫最速下降法(Steepest Descend Method),经常用来求解无约束优化的极小值问题。

梯度下降法的过程如图所示。曲线是等高线(水平集),即函数f为不同常数的集合构成的曲线。红色的箭头指向该点梯度的反方向(梯度方向与通过该点的等高线垂直)。沿着梯度下降方向,将最终到达函数f 值的局部最优解。

梯度上升法

如果我们要求解一个最大值问题,就需要向梯度正方向迭代进行搜索,逐渐接近函数的局部极大值点,这个过程则被称为梯度上升法。

概率论主要研究大量随机现象中的数量规律,其应用十分广泛,几乎遍及各个领域。

离散随机变量

如果随机变量X 所可能取的值为有限可列举的,有n个有限取值 {x1, · · · , xn}, 则称X 为离散随机变量。要了解X 的统计规律,就必须知道它取每种可能值xi 的概率,即

称为离散型随机变量X 的概率分布或分布,并且满足

常见的离散随机概率分布有:

伯努利分布

二项分布

连续随机变量

与离散随机变量不同,一些随机变量X 的取值是不可列举的,由全部实数 或者由一部分区间组成,比如

则称X 为连续随机变量。

概率密度函数

连续随机变量X 的概率分布一般用概率密度函数 p(x) 来描述。 p(x) 为可积函数,并满足:

均匀分布 若a, b为有限数,[a, b]上的均匀分布的概率密度函数定义为

正态分布 又名高斯分布,是自然界最常见的一种分布,并且具有很多良好的性质,在很多领域都有非常重要的影响力,其概率密度函数为

其中, σ 0,μ 和 σ 均为常数。若随机变量X 服从一个参数为 μ 和 σ 的概率分布,简记为

累积分布函数

对于一个随机变量X,其累积分布函数是随机变量X 的取值小于等于x的概率。

以连续随机变量X 为例,累积分布函数定义为:

其中p(x)为概率密度函数,标准正态分布的累计分布函数:

随机向量

随机向量是指一组随机变量构成的向量。如果 X1, X2, · · · , Xn 为n个随机变量, 那么称 [X1, X2, · · · , Xn] 为一个 n 维随机向量。一维随机向量称为随机变量。随机向量也分为离散随机向量和连续随机向量。 条件概率分布 对于离散随机向量 (X, Y) ,已知X = x的条件下,随机变量 Y = y 的条件概率为:

对于二维连续随机向量(X, Y ),已知X = x的条件下,随机变量Y = y 的条件概率密度函数为

期望 对于离散变量X,其概率分布为 p(x1), · · · , p(xn) ,X 的期望(expectation)或均值定义为

对于连续随机变量X,概率密度函数为p(x),其期望定义为

方差 随机变量X 的方差(variance)用来定义它的概率分布的离散程度,定义为

标准差 随机变量 X 的方差也称为它的二阶矩。X 的根方差或标准差。

协方差 两个连续随机变量X 和Y 的协方差(covariance)用来衡量两个随机变量的分布之间的总体变化性,定义为

协方差经常也用来衡量两个随机变量之间的线性相关性。如果两个随机变量的协方差为0,那么称这两个随机变量是线性不相关。两个随机变量之间没有线性相关性,并非表示它们之间独立的,可能存在某种非线性的函数关系。反之,如果X 与Y 是统计独立的,那么它们之间的协方差一定为0。

随机过程(stochastic process)是一组随机变量Xt 的集合,其中t属于一个索引(index)集合T 。索引集合T 可以定义在时间域或者空间域,但一般为时间域,以实数或正数表示。当t为实数时,随机过程为连续随机过程;当t为整数时,为离散随机过程。日常生活中的很多例子包括股票的波动、语音信号、身高的变化等都可以看作是随机过程。常见的和时间相关的随机过程模型包括贝努力过程、随机游走、马尔可夫过程等。

马尔可夫过程 指一个随机过程在给定现在状态及所有过去状态情况下,其未来状态的条件概率分布仅依赖于当前状态。

其中X0:t 表示变量集合X0, X1, · · · , Xt,x0:t 为在状态空间中的状态序列。

马尔可夫链 离散时间的马尔可夫过程也称为马尔可夫链(Markov chain)。如果一个马尔可夫链的条件概率

马尔可夫的使用可以看前面一篇写的有意思的文章: 女朋友的心思你能猜得到吗?——马尔可夫链告诉你 随机过程还有高斯过程,比较复杂,这里就不详细说明了。

信息论(information theory)是数学、物理、统计、计算机科学等多个学科的交叉领域。信息论是由 Claude Shannon最早提出的,主要研究信息的量化、存储和通信等方法。在机器学习相关领域,信息论也有着大量的应用。比如特征抽取、统计推断、自然语言处理等。

在信息论中,熵用来衡量一个随机事件的不确定性。假设对一个随机变量X(取值集合为C概率分布为 p(x), x ∈ C )进行编码,自信息I(x)是变量X = x时的信息量或编码长度,定义为 I(x) = ? log(p(x)), 那么随机变量X 的平均编码长度,即熵定义为

其中当p(x) = 0时,我们定义0log0 = 0 熵是一个随机变量的平均编码长度,即自信息的数学期望。熵越高,则随机变量的信息越多;熵越低,则信息越少。如果变量X 当且仅当在x时 p(x) = 1 ,则熵为0。也就是说,对于一个确定的信息,其熵为0,信息量也为0。如果其概率分布为一个均匀分布,则熵最大。假设一个随机变量X 有三种可能值x1, x2, x3,不同概率分布对应的熵如下:

联合熵和条件熵 对于两个离散随机变量X 和Y ,假设X 取值集合为X;Y 取值集合为Y,其联合概率分布满足为 p(x, y) ,则X 和Y 的联合熵(Joint Entropy)为

X 和Y 的条件熵为

互信息 互信息(mutual information)是衡量已知一个变量时,另一个变量不确定性的减少程度。两个离散随机变量X 和Y 的互信息定义为

交叉熵和散度 交叉熵 对应分布为p(x)的随机变量,熵H(p)表示其最优编码长度。交叉熵是按照概率分布q 的最优编码对真实分布为p的信息进行编码的长度,定义为

在给定p的情况下,如果q 和p越接近,交叉熵越小;如果q 和p越远,交叉熵就越大。

(责任编辑:IT教学网)

更多

推荐杀毒防毒文章