Worked on this page.

--HG--
extra : convert_revision : svn%3Afdd8eb12-d10e-0410-9acb-85c331704f74/trunk%403466
This commit is contained in:
Davis King 2010-02-15 01:16:55 +00:00
parent b90b5f15d0
commit e766b30d71

View File

@ -9,6 +9,23 @@
<!-- ************************************************************************* --> <!-- ************************************************************************* -->
<body> <body>
<br/><br/>
<p>
One of the major goals of dlib is to have documentation that enables
someone to easily make use of its various components. Ideally,
you would read a short description of something, understand it immediately,
and begin using it in your application without any difficulty. Obviously, this
depends partly on the background of the user. For example, if you have
never written software before then it probably isn't going to be this easy.
</p>
<p>
This page contains references to books, along with my commentary, which explain most of
the subjects needed to understand the various parts of the library. In most cases these are
the books I learned from during the process
of creating dlib. As always, if you disagree with anything or think I have left out an important
text then shoot me an <a href="mailto:davis@dlib.net">email</a>.
</p>
<br/><br/> <br/><br/>
@ -16,33 +33,84 @@
<ul> <ul>
<h3>C++</h3> <h3>C++</h3>
<ul> <ul>
<li> <i>Programming: Principles and Practice Using C++</i> by Bjarne Stroustrup </li> <li> <i>Programming: Principles and Practice Using C++</i> by Bjarne Stroustrup
<li> <i>Effective C++: 55 Specific Ways to Improve Your Programs and Designs</i> (3rd Edition) by Scott Meyers </li> <ul> This is the sort of book you would use in a freshman introduction-to-programming class.
<li> <i>More Effective C++: 35 New Ways to Improve Your Programs and Designs</i> by Scott Meyers </li> So if you are just beginning to study programming and interested in C++ then I think
<li> <i>The C++ Standard Library: A Tutorial and Reference</i> by Nicolai M. Josuttis </li> it is probably safe to say this is one of the best books you could read. It is both
<li> <a href="http://stdcxx.apache.org/doc/stdlibref/index.html">Apache C++ Standard Library Reference</a></li> recent (2009) and written by the creator of C++. </ul> <br/>
</li>
<li> <i>Effective C++: 55 Specific Ways to Improve Your Programs and Designs</i> (3rd Edition) by Scott Meyers
<ul> This is a great intermediate level C++ book. Most people have heard the jokes about
how easy it is to shoot yourself in the foot with C++. This book explains many things you
need to know about the language to avoid doing so on a regular basis. So if you are
writing C++ software then this is a MUST read. I would go as far as to claim that
you are a danger to the C++ software you touch unless you know what is in this book.
I'm not kidding. However, the book isn't just about the quirks of C++. It also discusses many general
software engineering ideas which have wide applicability. So in this
respect it is a great book for any software developer to read.
</ul><br/>
</li>
<li> <i>More Effective C++: 35 New Ways to Improve Your Programs and Designs</i> by Scott Meyers
<ul> Consider this an expansion to Effective C++. If you are going to read the above
book then you would almost certainly benefit from reading this one as well.
</ul><br/>
</li>
<li> <i>The C++ Standard Library: A Tutorial and Reference</i> by Nicolai M. Josuttis
<ul> If you are going to buy a reference book on the C++ standard library then this
is the one to get. I think you
will find it is better than any of the available online references. So if you find
yourself frustrated with the online resources, then this is the book for you.
</ul><br/>
</li>
<li> <a href="http://stdcxx.apache.org/doc/stdlibref/index.html">Apache C++ Standard Library Reference</a>
<ul> What I said aside, this is a good online reference. I often find myself referring to it
when I do not have the Josuttis book on hand.
</ul><br/>
</li>
</ul> </ul>
<h3>Multithreading</h3> <h3>Multithreading</h3>
<ul> <ul>
<li> <i>Programming with POSIX(R) Threads</i> by David R. Butenhof </li> <li> <i>Programming with POSIX Threads</i> by David R. Butenhof
<ul> When I was an undergrad, this book was my main resource for learning about multithreading.
It was enjoyable to read (as are all the books on this list I think) and covered everything
in great depth without becoming overbearing. Also, despite what the title may suggest,
this book is useful for understanding multithreading broadly, not just multithreading
on POSIX systems.
</ul><br/>
</li>
</ul> </ul>
<h3>Network Programming</h3> <h3>Network Programming</h3>
<ul> <ul>
<li> <i>Unix Network Programming, Volume 1: The Sockets Networking API</i> (3rd Edition) <li> <i>Unix Network Programming, Volume 1: The Sockets Networking API</i> (3rd Edition)
by W. Richard Stevens</li> by W. Richard Stevens
<ul> A lot of people call this book the network programming Bible and
this praise is well deserved. If you want a deep understanding of how computer networks
function, including the Internet, then this is the book to read. As with
the Butenhof book above, this is excellent even for people who do not
intend to write software for Unix systems.
</ul><br/>
</li>
</ul> </ul>
<h3>WIN32 Programming</h3> <h3>WIN32 Programming</h3>
It has been a long time since I needed to refer to these two books. However,
they contained information that I couldn't find elsewhere no matter
how hard I looked. So I recommend them in case you need to create or understand
some low level win32 code.
<br/>
<br/>
<ul> <ul>
<li> <i>Win32 Programming</i> by Brent E. Rector and Joseph M. Newcomer <li> <i>Win32 Programming</i> by Brent E. Rector and Joseph M. Newcomer </li>
<li> <i>Programming Windows</i> by Charles Petzold </li>
<li> <a href="http://msdn.microsoft.com/en-us/library/default.aspx">MSDN Library</a>
<ul> This is Microsoft's online reference documentation. It is very large and sometimes
confusing. But at the end of the day you should be able to find the documentation
for just about every function in the entire Windows API.
</ul><br/>
</li> </li>
<li>
<i>Programming Windows</i> by Charles Petzold
</li>
<li> <a href="http://msdn.microsoft.com/en-us/library/default.aspx">MSDN Library</a> is great </li>
</ul> </ul>
</ul> </ul>
@ -53,26 +121,79 @@
<h2>Computer Science: Algorithms and Data Structures</h2> <h2>Computer Science: Algorithms and Data Structures</h2>
<ul> <ul>
<li> <i>Introduction to Algorithms</i> by Cormen, Leiserson, Rivest and Stein <li> <i>Introduction to Algorithms</i> by Cormen, Leiserson, Rivest and Stein
<ul> You should get this book if you are looking for a good discussion of the classic computer science
algorithms and data structures (e.g. most of the components on the <a href="containers.html">containers</a>
page).
</ul><br/>
</li>
<li> <i>Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching</i>
(3rd Edition) by Robert Sedgewick
<ul> This is another good algorithms book. If you are going to get only one book on this
subject then get the one above. However, when I was learning about these topics I
used both these books and on many occasions I found it helpful to read the description
of an algorithm or data structure in both. Where one description was a little vague or
confusing the other generally filled in the gaps.
</ul><br/>
</li> </li>
<li> <i>Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching</i> (3rd Edition) by Robert Sedgewick </li>
</ul> </ul>
<h2>Lossless Data Compression</h2> <h2>Lossless Data Compression</h2>
<ul> <ul>
<li> <i>Text Compression</i> by Bell, Cleary, and Witten </li> <li> <i>Text Compression</i> by Bell, Cleary, and Witten
<ul> When I was studying data compression this was my most useful
resource. So if you are looking to understand how lossless data compression
algorithms work then this is the book you want. It is completely self-contained
and an absolute joy to read. Note that contrary to one of the reviews on
amazon.com, the book <i>Managing Gigabytes</i> is not the second edition of this book;
if this topic interests you then be sure you get the 318 page
book published in 1990.
</ul><br/>
</li>
</ul> </ul>
<h2>General Math</h2> <h2>General Math</h2>
<ul> <ul>
<li> <i>Calculus: Single and Multivariable</i> by Hughes-Hallett, Gleason, and McCallum </li> <li> <i>Linear Algebra Done Right</i> by Sheldon Jay Axler
<li> <i>Linear Algebra Done Right</i> by Sheldon Jay Axler </li> <ul> If a matrix seems like an arbitrary grid of numbers or you find that
<li> <i>Numerical Linear Algebra</i> by Trefethen and Bau </li> you are confused by vectors, matrices, and the various things
<li> <i>Introduction to Real Analysis</i> (third edition) by Bartle and Sherbert </li> that get done with them then this book will change your whole view of this subject.
It doesn't teach you any algorithms. Instead, it will give you a general
framework in which to think about all this stuff. Once you have that down
everything else will start to make a lot more sense. If all goes well
you will even start to agree with the following: linear algebra is beautiful. :)
</ul><br/>
</li>
<li> <i>Numerical Linear Algebra</i> by Trefethen and Bau
<ul> While <i>Linear Algebra Done Right</i> is fairly abstract, this book by
Trefethen and Bau will
explain some of the actual algorithms that are often used.
This is a great second book if you find that you want to know know more about
the SVD, LU decomposition, or various other algorithms involving linear algebra.
</ul><br/>
</li>
<li> <i>Calculus: Single and Multivariable</i> by Hughes-Hallett, Gleason, and McCallum
<ul>
Some of the books below will require and understanding of basic calculus. So
I'm recommending this book. It was the book I used as an undergrad and I
remember it being alright. That isn't exactly a glowing review so if you
are really considering buying a calculus book you may want to check out
other reviews before picking this one.
</ul><br/>
</li>
<li> <i>Introduction to Real Analysis</i> (third edition) by Bartle and Sherbert
<ul> At some level real analysis is like a really rigorous repeat of calculus.
So if you already have an undergraduate education in calculus and
you are reading things that seem reminiscent of calculus but involve
stuff you haven't seen before (e.g. sup, inf, "sets of numbers")
then you may be in need of a real analysis book. This one is quite good and should
be accessible to someone with the usual undergraduate computer science math background.
</ul><br/>
</li>
</ul> </ul>
@ -80,36 +201,88 @@
<h2>Optimization</h2> <h2>Optimization</h2>
The subject of linear algebra is fundamental to optimization. So you must be familiar
with the contents of a book like <i>Linear Algebra Done Right</i> if you are going to study
this area. You will also need to know how to find the derivative of a function and
understand what a derivative is all about. So you will need to know a little bit of
calculus. Finally, once in a while you will need to know a little bit about real
analysis. Ultimately, what you need all depends on how deep you want to go.
<ul> <ul>
<li> <i>Practical Methods of Optimization</i> (second edition) by R. Fletcher 1987 </li> <li> <i>Practical Methods of Optimization</i> (second edition) by R. Fletcher 1987
<li> <i>Numerical Optimization</i> by Jorge Nocedal and Stephen Wright 2006 </li> <ul> I love this book. When I got it I literally spent my weekends sitting around
<li> <i>Introduction to Derivative-Free Optimization</i> by Conn, Scheinberg, and Vicente </li> reading it for hours. It is a fascinating and well written introduction to
the subject of optimization. I cannot recommend it highly enough.
</ul><br/>
</li>
<li> <i>Numerical Optimization</i> by Jorge Nocedal and Stephen Wright 2006
<ul> This is a more recent text on optimization that is also very good. It
covers many algorithms not covered by the above book.
</ul><br/>
</li>
<li> <i>Introduction to Derivative-Free Optimization</i> by Conn, Scheinberg, and Vicente
<ul> If you want to understand algorithms like <a href="algorithms.html#find_min_bobyqa">BOBYQA</a>
then this is a good recent book on the subject. Note that a book like <i>Practical Methods of Optimization</i>
is almost certainly a prerequisite for reading this book. As an aside, BOBYQA is not discussed in this book but
its predecessor, NEWUOA is.
</ul><br/>
</li>
</ul> </ul>
<h2>Machine Learning</h2> <h2>Machine Learning</h2>
<ul> <ul>
<li> <i>Artificial Intelligence: A Modern Approach </i> (3rd Edition) by Stuart Russell and Peter Norvig</li> <li> <i>Artificial Intelligence: A Modern Approach </i> (3rd Edition) by Stuart Russell and Peter Norvig
<li> <i>Learning with Kernels: Support Vector Machines, Regularization, Optimization, and Beyond </i> by Bernhard Schlkopf and Alexander J. Smola</li> <ul> This book is about the much broader field of AI but it contains an excellent introduction
to machine learning and it also covers other useful topics like <a href="bayes.html">bayesian networks</a>.
Moreover, it is very well written and self-contained. So you don't need any particular
background to be able to learn from it.
</ul><br/>
</li>
<li> <i>Learning with Kernels: Support Vector Machines, Regularization, Optimization, and Beyond </i>
by Bernhard Schlkopf and Alexander J. Smola
<ul> Most of the machine learning tools in dlib are implementations of various kernel methods.
So if you want a book that covers this topic in great depth as well as breadth then this is
probably the book for you. The most important prerequisite for this book is linear
algebra. Virtually everything in this book depends on linear algebra in a fundamental way.
<p>
The second important subject is optimization. Whenever you see the text
mention the KKT conditions, duality, "primal variables", or quadratic programming it
is talking about ideas from optimization. A good book which will explain all this to you
is <i>Practical Methods of Optimization</i>. Note that this book calls the KKT conditions
just the "KT" conditions. They are talking about the same thing. Also, duality
is something that comes up a lot in optimization but in the context of machine learning
usually people are talking about a particular form known as the Wolfe Dual.
</p>
It would also be good (but not critical) to be familiar with real analysis.
</ul><br/>
</li>
<li> <i>Kernel Methods for Pattern Analysis </i> by John Shawe-Taylor and Nello Cristianini <li> <i>Kernel Methods for Pattern Analysis </i> by John Shawe-Taylor and Nello Cristianini
<ul> asdfsdf alskd flaksjd flaskdj flskaj flaskd flkjs flk sadfl asdflkj as <ul> This is another good book about kernel methods. If you have to choose between
df aslkdfj asldkfj asldkf lkds flkajs dflkja sdflkj asdlkjf alsdkj flsakjd fasdjl f this book and <i>Learning with Kernels</i> I would go with <i>Learning with Kernels</i>. However, it is
aslkdfj alskdf alsdkjf lksjadklajsd fklsadj fljkas dfklja sdlfkj asdlkfj asdlkj sadlkjf </ul> <br/> </li> good to have both since reading different presentations of difficult subjects
usually makes learning them easier.
</ul><br/>
</li>
<li> The Journal of Machine Learning Research and NIPS </li>
</ul> </ul>
<h2>Image Processing</h2> <h2>Image Processing</h2>
<ul> <ul>
<li> <i>Digital Image Processing</i> by Rafael C. Gonzalez and Richard E. Woods </li> <li> <i>Digital Image Processing</i> by Rafael C. Gonzalez and Richard E. Woods
<ul> This is a terrific introduction to digital image processing if you are looking
for a place to start learning about this subject.
By and large this book doesn't require any special prerequisites. Sometimes
calculus shows up, but not too much.
</ul><br/>
</li>
</ul> </ul>
</body> </body>