Optimization techniques are at the heart of the solution to a number of real world problems. A number of optimization techniques have been developed during the years and each of them find their application according to the problem characteristics. This course will concentrate on recognizing common convex optimization problems that arise in real world applications and their key charachteristics as well as different approaches to solve them. Several optimization problems will be formally described and illustrated with examples. We will study approaches for unconstrained and equality constrained optimization (stochastic gradient descent, Newton's method and coordinate descent), interior-point methods for solving inequality-constrained problems, as well as extensions and improvements of classical optimization methods like Quasi-Newton, conjugate gradient and cutting plane methods. All of those methods will be illustrated with proactical applications mainly in the area of machine learning.