├── .gitignore ├── README.md ├── build.sh ├── build └── templater.js ├── data ├── assignments.yml ├── lectures.yml ├── site-instructions.md └── this-week.yml ├── deploy.sh ├── favicon.ico ├── fonts ├── glyphicons-halflings-regular.woff └── glyphicons-halflings-regular.woff2 ├── images ├── barber-1x.jpg ├── barber-2x.jpg ├── barber-3x.jpg ├── barber-original.jpg ├── bishop-1x.jpg ├── bishop-2x.jpg ├── bishop-3x.jpg ├── bishop-original.jpg ├── boyd-1x.jpg ├── boyd-2x.jpg ├── boyd-original.jpg ├── geron-original.jpg ├── hastie-1x.png ├── hastie-2x.jpg ├── hastie-3x.jpg ├── hastie-original.jpg ├── james-1x.jpg ├── james-2x.jpg ├── james-3x.jpg ├── james-original.jpg ├── murphy-1x.jpg ├── murphy-2x.jpg ├── murphy-3x.jpg ├── murphy-original.jpg ├── people │ ├── aakash.JPG │ ├── david.jpg │ ├── julia.jpg │ ├── mihir.jpg │ ├── mingsi.jpg │ ├── sanyam.jpg │ ├── sreyas.png │ ├── tingyan.jpeg │ ├── xintian.jpeg │ └── yi.jpg ├── provost-fawcett-original.jpg └── shalev-shwartz-original.jpg ├── index.hbs ├── package-lock.json ├── package.json ├── scripts └── navigation.js ├── styles ├── colors.styl ├── phone.styl ├── style.styl └── tablet-and-phone.styl ├── syllabusDS-GA1003-Spring2019.docx ├── syllabusDS-GA1003-Spring2019.pdf └── templates ├── _assignment-details.hbs ├── assignments.hbs ├── lectures.hbs └── this-week.hbs /.gitignore: -------------------------------------------------------------------------------- 1 | # Node 2 | package-lock.json 3 | node_modules 4 | 5 | # Misc 6 | styles 7 | index.html 8 | 9 | # Build site 10 | out 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DS-GA 1003 Website 2 | 3 | ## Editing, rebuilding, and deploying this page 4 | 5 | ### Building locally: quickstart 6 | 7 | Be sure to have [Node.js](https://iojs.org/) 7.x+ installed. 8 | 9 | Run `npm install` in the project root. This will install some build tools we use. 10 | 11 | Run `npm run build-in-place` to do the templating and stylesheet compilation in-place. You can then view the site by simply opening `index.html`. 12 | 13 | Run `./build.sh` to do a local build into the `out/` directory. You can then preview the site at `out/index.html`. This should usually be the same as just `index.html`, but it is good to check before committing, since this "local deploy" process is slightly more complicated than the in-place build process. 14 | 15 | ### How to edit content 16 | The file index.hbs is usually what you should edit, basically as though you were editing an HTML file. The final HTML is generated with some JavaScript processing that pulls in data from the YAML files in the data directory -- basically the information in the lectures and assignments tables. 17 | 18 | ### Deployment 19 | Run the script `./deploy.sh` from the root directory of the project to build and deploy the page to GitHub. The script does the following: 1) Pulls down the gh-pages branch into a folder called "out" in the project root directory. (GitHub serves webpages from gh-pages branches.) Then it runs `npm run build` which compiles the page and puts the output into out. Then the revised out folder is committed and pushed back to the gh-pages branch, ready to be served. 20 | 21 | ### Technologies used 22 | 23 | [Stylus](https://learnboost.github.io/stylus/) is used for styling. 24 | 25 | [Handlebars](http://handlebarsjs.com/) is used for templating. `index.hbs` is minimally templated, mostly delegating to the partials in `templates/`. Those pull their data from `data/`. The logic that ties them all together is in `build/templater.js`. 26 | 27 | The site is intended to be responsive, which we accomplish with per-device stylesheets and media queries in the HTML. 28 | 29 | ### Things to Keep in Mind 30 | 31 | While editing you should be using an [EditorConfig](http://editorconfig.org/) plugin for your text editor to enforce a few basic stylistic things. 32 | 33 | We are trying to maintain a reasonable HTML document outline (so, don't use `
` as if it were `
`). To preview the document outline, use the [HTML 5 Outliner tool](https://gsnedders.html5.org/outliner/). 34 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e # exit with nonzero exit code if anything fails 3 | 4 | ## TODO migrate to gulp probably 5 | 6 | # clear and re-create the out directory 7 | rm -f index.html 8 | rm -rf styles/*.css 9 | 10 | npm run build-in-place 11 | 12 | mkdir -p out/styles/ 13 | cp index.html favicon.ico out/ 14 | cp styles/*.css out/styles/ 15 | 16 | cp -r images fonts scripts out/ 17 | 18 | echo "" 19 | find out/ -print 20 | echo "" 21 | -------------------------------------------------------------------------------- /build/templater.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const path = require('path'); 3 | const yaml = require('js-yaml'); 4 | const fs = require('fs'); 5 | const handlebarsFactory = require('handlebars'); 6 | const moment = require('moment'); 7 | const assert = require('assert'); 8 | const toSlug = require('slugg'); 9 | 10 | const SLIDES = 'Slides'; 11 | const NOTES = 'Notes'; 12 | const REFERENCES = 'References'; 13 | 14 | const TEMPLATES_DIR = path.resolve(__dirname, '../templates'); 15 | 16 | doTemplating(process.argv[2], process.argv[3]); 17 | 18 | function doTemplating(input, output) { 19 | const handlebars = handlebarsFactory.create(); 20 | registerHelpers(handlebars); 21 | registerPartials(handlebars); 22 | 23 | const template = compileTemplate(handlebars, input); 24 | const documents = parseDocuments(); 25 | 26 | // Uncomment to see documents; useful while tweaking the templates 27 | // console.log(require("util").inspect(documents, { depth: Infinity })); 28 | 29 | fs.writeFileSync(output, template(documents)); 30 | } 31 | 32 | function compileTemplate(handlebars, input) { 33 | return handlebars.compile(fs.readFileSync(input, { encoding: 'utf-8' })); 34 | } 35 | 36 | function parseDocuments() { 37 | const lectures = yaml.safeLoad(fs.readFileSync(path.resolve(__dirname, '../data/lectures.yml'))); 38 | 39 | // Normalize the data 40 | for (const lecture of lectures) { 41 | for (const event of Object.values(lecture.Events)) { 42 | ensureArrayExists(event, SLIDES); 43 | ensureArrayExists(event, NOTES); 44 | ensureArrayExists(event, REFERENCES); 45 | } 46 | } 47 | 48 | let assignmentsFrontmatter, assignments; 49 | let i = 0; 50 | yaml.safeLoadAll(fs.readFileSync(path.resolve(__dirname, '../data/assignments.yml')), doc => { 51 | switch (i) { 52 | case 0: 53 | assignmentsFrontmatter = doc; 54 | break; 55 | case 1: 56 | assignments = doc; 57 | break; 58 | default: 59 | throw new Error('Cannot have more than two documents in assignments.yaml'); 60 | } 61 | ++i; 62 | }); 63 | 64 | for (const assignment of assignments) { 65 | if (!assignment.PDF && !assignment.ZIP) { 66 | assignment.noFiles = true; 67 | } 68 | } 69 | 70 | let thisWeek = yaml.safeLoad(fs.readFileSync(path.resolve(__dirname, '../data/this-week.yml'))); 71 | 72 | if (thisWeek === null) { 73 | thisWeek = { lecture: null }; 74 | } else { 75 | // Pull data from lectures and assignments into thisWeek: 76 | const thisWeekLecture = lectures.find(l => l.Title === thisWeek['Lecture/Lab']); 77 | const thisWeekAssignment = assignments.find(a => a.Label === thisWeek.Assignment); 78 | 79 | if (thisWeekLecture === undefined) { 80 | throw new Error(`Could not find entry in lectures.yml with Title "${thisWeek['Lecture/Lab']}" specified in ` + 81 | `this-week.yaml`); 82 | } 83 | if (thisWeekAssignment === undefined) { 84 | throw new Error(`Could not find entry in assignments.yml with Label "${thisWeek['Assignment']}" specified in ` + 85 | `this-week.yaml`); 86 | } 87 | 88 | thisWeek.lecture = thisWeekLecture; 89 | thisWeek.assignment = thisWeekAssignment; 90 | } 91 | 92 | return { lectures, thisWeek, assignmentsFrontmatter, assignments }; 93 | } 94 | 95 | function registerPartials(handlebars) { 96 | for (const filename of fs.readdirSync(TEMPLATES_DIR)) { 97 | const filePath = path.resolve(TEMPLATES_DIR, filename); 98 | const partialName = path.basename(filename, '.hbs'); 99 | const contents = fs.readFileSync(filePath, { encoding: 'utf-8' }); 100 | 101 | handlebars.registerPartial(partialName, contents); 102 | } 103 | } 104 | 105 | function registerHelpers(handlebars) { 106 | handlebars.registerHelper('date', d => moment.utc(new Date(d).toISOString()).format('MMMM Do')); 107 | handlebars.registerHelper('shortDate', d => moment.utc(new Date(d).toISOString()).format('MMM D')); 108 | handlebars.registerHelper('maybeLink', v => { 109 | if (typeof v === 'string') { 110 | return v; 111 | } 112 | 113 | assert (typeof v === 'object' && v !== null, 'Links must be either strings or objects'); 114 | 115 | const keys = Object.keys(v); 116 | assert(keys.length === 1, 'Link objects must have a single key'); 117 | const key = keys[0]; 118 | 119 | return new handlebars.SafeString('' + key + ''); 120 | }); 121 | handlebars.registerHelper('lectureSlug', l => 'lecture-' + toSlug(l.Title)); 122 | handlebars.registerHelper('assignmentSlug', l => 'assignment-' + toSlug(l.Label)); 123 | } 124 | 125 | function ensureArrayExists(obj, prop) { 126 | if (!(prop in obj)) { 127 | obj[prop] = []; 128 | } 129 | } 130 | 131 | function copyArrayInto(source, dest, keyName) { 132 | if (source && source[keyName]) { 133 | dest[keyName].push(...source[keyName]); 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /data/assignments.yml: -------------------------------------------------------------------------------- 1 | Due time: 11:59 PM 2 | Submit link: "https://gradescope.com" 3 | --- 4 | - 5 | Label: Homework 0 6 | Description: Typesetting your homework 7 | Due: 2000-01-01 8 | PDF: {hw0.pdf: "https://davidrosenberg.github.io/mlcourse/Archive/2017/Homework/hw0.pdf"} 9 | ZIP: {hw0.zip: "https://davidrosenberg.github.io/mlcourse/Archive/2017/Homework/hw0.zip"} 10 | - 11 | Label: Homework 1 12 | Description: 13 | Due: 2019-02-09 14 | PDF: {hw1.pdf: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw1.pdf"} 15 | ZIP: {hw1.zip: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw1.zip"} 16 | - 17 | Label: Homework 2 18 | Description: 19 | Due: 2019-02-18 20 | PDF: {hw2.pdf: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw2.pdf"} 21 | ZIP: {hw2.zip: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw2.zip"} 22 | - 23 | Label: Homework 3 24 | Description: 25 | Due: 2019-02-25 26 | PDF: {hw3.pdf: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw3.pdf"} 27 | ZIP: {hw3.zip: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw3.zip"} 28 | - 29 | Label: Homework 4 30 | Description: 31 | Due: 2019-03-08 32 | PDF: {hw4.pdf: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw4.pdf"} 33 | ZIP: {hw4.zip: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw4.zip"} 34 | - 35 | Label: Homework 5 36 | Description: 37 | Due: 2019-04-05 38 | PDF: {hw5.pdf: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw5.pdf"} 39 | ZIP: {hw5.zip: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw5.zip"} 40 | - 41 | Label: Homework 6 42 | Description: 43 | Due: 2019-04-29 44 | PDF: {hw6.pdf: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw6.pdf"} 45 | ZIP: {hw6.zip: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw6.zip"} 46 | - 47 | Label: Homework 7 48 | Description: 49 | Due: 2019-05-10 50 | PDF: {hw7.pdf: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw7.pdf"} 51 | ZIP: {hw7.zip: " https://davidrosenberg.github.io/mlcourse/Archive/2019/Homework/hw7.zip"} 52 | -------------------------------------------------------------------------------- /data/lectures.yml: -------------------------------------------------------------------------------- 1 | - 2 | Title: Week 0 3 | Events: 4 | 2000-01-01: 5 | Label: ML Prereqs 6 | # Video: "https://youtu.be/U6M0m9c9_Js" 7 | Slides: 8 | - {Black Box Machine Learning: "https://bloomberg.github.io/foml/#lecture-1-black-box-machine-learning"} 9 | - {Evaluating Classifiers: "https://bloomberg.github.io/foml/#lecture-14-performance-evaluation"} 10 | Notes: 11 | - {Géron's Machine Learning Landscape: "https://github.com/ageron/handson-ml/blob/master/01_the_machine_learning_landscape.ipynb"} 12 | - {Géron's End-to-End Machine Learning: "https://github.com/ageron/handson-ml/blob/master/02_end_to_end_machine_learning_project.ipynb"} 13 | References: 14 | - Provost and Fawcett book 15 | - {"Géron Ch 1,2": "https://getit.library.nyu.edu/go/9443019"} 16 | - 17 | Title: Week 1 18 | Events: 19 | 2019-01-29: 20 | Label: Lecture 21 | Slides: 22 | - {Course Logistics and Overview: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/01a.course-logistics.pdf"} 23 | - {Statistical Learning Theory: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/01b.intro-stat-learning-theory.pdf"} 24 | # - {Stochastic Gradient Descent: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/01c.SGD.pdf"} 25 | - {Excess Risk Decomposition: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/01c.excess-risk-decomposition.pdf"} 26 | Notes: 27 | - {Conditional Expectations: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/conditional-expectations.pdf"} 28 | - {SLT Concept Check Questions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/1-Lec-Check.pdf"} 29 | - {SLT Concept Check Solutions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/1-Lec-Check_sol.pdf"} 30 | References: 31 | # - {"Bottou's SGD Tricks": "http://leon.bottou.org/papers/bottou-tricks-2012"} 32 | 2019-01-30: 33 | Label: Lab 34 | Slides: 35 | - {Gradients and Directional Derivatives: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/1-gradients-Slides.pdf"} 36 | Notes: 37 | - {Gradients and Directional Derivatives: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/1-gradients-Notes_sol.pdf"} 38 | - {Gradient Concept Check Questions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/1-Lab-Check.pdf"} 39 | - {Gradient Concept Check Solutions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/1-Lab-Check_sol.pdf"} 40 | - {Directional Derivatives and Approximation (Short): "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/directional-derivative.pdf"} 41 | References: 42 | - {Barnes "Matrix Differentiation" notes: "http://www.atmos.washington.edu/~dennis/MatrixCalculus.pdf"} 43 | - 44 | Title: Week 2 45 | Events: 46 | 2019-02-05: 47 | Label: Lecture 48 | Slides: 49 | - {Stochastic Gradient Descent: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/02a.SGD.pdf"} 50 | - {Gradient Descent: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/02b.gradient-descent.pdf"} 51 | - {L1 and L2 regularization: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/02c.L1L2-regularization.pdf"} 52 | Notes: 53 | - {PreLecture Concept Check Questions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/2-PreLec-Check.pdf"} 54 | - {PreLecture Concept Check Solutions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/2-PreLec-Check_sol.pdf"} 55 | - {Completing the Square: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/completing-the-square.pdf"} 56 | - {'Excess Risk, Stochastic Gradient Descent and L1/L2 Questions': "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/2-Lec-Check.pdf"} 57 | - {'Excess Risk, Stochastic Gradient Descent and L1/L2 Solutions': "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/2-Lec-Check_sol.pdf"} 58 | References: 59 | - "HTF Ch. 3" 60 | 2019-02-06: 61 | Label: Lab 62 | Slides: 63 | # - {Grouping and Elastic Net: "https://davidrosenberg.github.io/mlcourse/Archive/2017/Lectures/3a.elastic-net.pdf"} 64 | - {STL & Excess Risk Decomposition Demo Questions (ipynb) : "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/2-STL_Lab-Questions.ipynb"} 65 | - {STL & Excess Risk Decomposition Demo Answers (ipynb) : "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/2-STL_Lab-Answers.ipynb"} 66 | References: 67 | # - "HTF 3.4" 68 | - 69 | Title: Week 3 70 | Events: 71 | 2019-02-12: 72 | Label: Lecture 73 | Slides: 74 | - {Elastic Net and Correlation: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/03a.elastic-net.pdf"} 75 | - {Loss Functions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/03b.loss-functions.pdf"} 76 | Notes: 77 | - {Elastic Net correlation theorem: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/elastic-net-theorem.pdf"} 78 | - {Lasso and Elastic Net (ipynb): "https://github.com/davidrosenberg/mlcourse/blob/gh-pages/Notebooks/Lasso%20and%20Elastic%20Net/lasso_and_elastic_net.ipynb"} 79 | References: 80 | - "HTF 3.4" 81 | - {'Mairal, Bach, and Ponce on Sparse Modeling': "https://arxiv.org/pdf/1411.3230v2.pdf"} 82 | 2019-02-13: 83 | Label: Lab 84 | Slides: 85 | - {Subgradient Descent: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/03c.subgradient-descent-lasso.pdf"} 86 | Notes: 87 | - {"Subgradients": "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/4-Subgradients-Notes_sol.pdf"} 88 | - {Subgradients and Lagrangian Duality Questions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/3-Lab-Check.pdf"} 89 | - {Subgradients and Lagrangian Duality Solutions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/3-Lab-Check_sol.pdf"} 90 | References: 91 | - {'Boyd subgradient notes': "http://web.stanford.edu/class/ee364b/lectures.html"} 92 | 93 | 94 | - 95 | Title: Week 4 96 | Events: 97 | 2019-02-19: 98 | Label: Lecture 99 | Slides: 100 | - {Lagrangian Duality and Convex Optimization: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/04a.convex-optimization.pdf"} 101 | - {Support Vector Machines: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/04b.SVM.pdf"} 102 | - {SVM and Complementary Slackness: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/04c.SVM-ComplementarySlackness.pdf"} 103 | - {Kernel Methods: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/04d.kernel-methods.pdf"} 104 | # - {Lagrangian Duality in 10 Minutes (Optional)): "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/04d.lagrangian-duality-in-ten-minutes.pdf"} 105 | Notes: 106 | - {Pre-lecture warmup for SVM and Lagrangians: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/svm-lecture-prep.pdf"} 107 | - {SVM Insights from Duality: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/SVM-main-points.pdf"} 108 | # - {Subgradients and Lagrangian Duality Questions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/4-Lec-Check.pdf"} 109 | # - {Subgradients and Lagrangian Duality Solutions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/4-Lec-Check_sol.pdf"} 110 | References: 111 | - {Support Vector Machines (Optional): "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/svm-notes.pdf"} 112 | - {Extreme Abridgement of BV (Optional): "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/convex-optimization.pdf"} 113 | 2019-02-20: 114 | Label: Lab 115 | Slides: 116 | - {Geometric Derivation of SVMs: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/3-SVM-Slides.pdf"} 117 | # - {Features: "https://github.com/davidrosenberg/mlcourse/blob/gh-pages/Labs/4-Features/tex/04e.features.pdf"} 118 | Notes: 119 | - {Geometric Derivation of SVMs: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/3-SVM-Notes_sol.pdf"} 120 | - {Uniqueness of SVM Solution: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/UniquenessOfSVM.pdf"} 121 | # - {Simplest Example: "https://github.com/davidrosenberg/mlcourse/blob/gh-pages/Notebooks/Features/simple_feature_transformations.ipynb"} 122 | # - {Ingesting text with BOW: "https://github.com/davidrosenberg/mlcourse/blob/gh-pages/Notebooks/Features/test_BOW.ipynb"} 123 | # - {Polynomial features: "https://github.com/davidrosenberg/mlcourse/blob/gh-pages/Notebooks/Features/polynomial_feature_comparison.ipynb"} 124 | # - {Vector quantization with k-means: "https://github.com/davidrosenberg/mlcourse/blob/gh-pages/Notebooks/Features/vector_quantization.ipynb"} 125 | References: 126 | # - {Feature Engineering for Machine Learning by Casari and Zheng: "https://www.safaribooksonline.com/library/view/feature-engineering-for/9781491953235/"} 127 | - 128 | Title: Week 5 129 | Events: 130 | 2019-02-26: 131 | Label: Lecture 132 | Slides: 133 | - {The Representer Theorem and Kernelization: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/05a.representer-theorem.pdf"} 134 | - {Kernel Methods: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/05b.kernel-methods.pdf"} 135 | Notes: 136 | - {Kernel Concept Check Questions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/5-Lab-Check.pdf"} 137 | - {Kernel Concept Check Solutions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/5-Lab-Check_sol.pdf"} 138 | References: 139 | - "SSBD Chapter 16" 140 | - {"A Survey of Kernels for Structured Data": "http://homepages.rpi.edu/~bennek/class/mmld/papers/p49-gartner.pdf"} 141 | 2019-02-27: 142 | Label: Lab 143 | Slides: 144 | - {Kernel Methods Continued: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/5-kernel-methods-continued.pdf"} 145 | - 146 | Title: Week 6 147 | Events: 148 | 2019-03-05: 149 | Label: Lecture 150 | Slides: 151 | - {CitySense: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/05b.citysense.pdf"} 152 | - {Maximum Likelihood: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/05c.MLE.pdf"} 153 | - {Conditional Probability Models: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/06a.conditional-probability-models.pdf"} 154 | Notes: 155 | - {"Exponential Distribution Example (First part)": "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/conditional-exponential-distributions.pdf"} 156 | - {Conditional Model Questions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/10-Lab-Check.pdf"} 157 | - {Conditional Model Solutions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/10-Lab-Check_sol.pdf"} 158 | 2019-03-06: 159 | Label: Lab 160 | Slides: 161 | - {Review for Midterm: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/midterm-review.pdf"} 162 | - 163 | Title: Week 7 164 | Events: 165 | 2019-03-12: 166 | Label: Midterm Exam 167 | 2019-03-13: 168 | Label: Lab 169 | Slides: 170 | - {Review for MLE and Conditional Model: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/Review-MLE-Conditional-probability-densities.pdf"} 171 | - 172 | Title: Week 8 173 | Events: 174 | 2019-03-26: 175 | Label: Lecture 176 | Slides: 177 | - {'Bayesian Methods': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/08b.bayesian-methods.pdf"} 178 | - {'Bayesian Conditional Models': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/08a.bayesian-regression.pdf"} 179 | Notes: 180 | - {"Proportionality Review": "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/proportionality.pdf"} 181 | - {"Thompson Sampling for Bernoulli Bandits [Optional]": "https://davidrosenberg.github.io/mlcourse/in-prep/thompson-sampling-bernoulli.pdf"} 182 | - {"Multivariate Gaussians (draft)": "https://davidrosenberg.github.io/mlcourse/in-prep/multivariate-gaussian.pdf"} 183 | - {"Bayesian Linear Regression (draft)": "https://davidrosenberg.github.io/mlcourse/in-prep/bayesian-regression.pdf"} 184 | - {Bayesian Methods and Regression Questions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/11-Lec-Check.pdf"} 185 | - {Bayesian Methods and Regression Solutions: "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/11-Lec-Check_sol.pdf"} 186 | References: 187 | - "Barber 9.1, 18.1" 188 | - "Bishop 3.3" 189 | 2019-03-27: 190 | Label: Midterm Solution Discussion 191 | - 192 | Title: Week 9 193 | Events: 194 | 2019-04-02: 195 | Label: Lecture 196 | Slides: 197 | - {'Multiclass': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/09b.multiclass.pdf"} 198 | # - {'Classification and Regression Trees': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/10a.trees.pdf"} 199 | Notes: 200 | - {"Multiclass Questions": "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/7-Lec-Check.pdf"} 201 | - {"Multiclass Solutions": "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/7-Lec-Check_sol.pdf"} 202 | # - {"Proportionality Review": "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/proportionality.pdf"} 203 | # - {"Multivariate Gaussians (draft)": "https://davidrosenberg.github.io/mlcourse/in-prep/multivariate-gaussian.pdf"} 204 | # - {"Bayesian Linear Regression (draft)": "https://davidrosenberg.github.io/mlcourse/in-prep/bayesian-regression.pdf"} 205 | 206 | References: 207 | - "SSBD Chapter 17" 208 | - {In Defense of One-Vs-All Classification: "http://www.jmlr.org/papers/v5/rifkin04a.html"} 209 | - {Reducing Multiclass to Binary: "http://www.jmlr.org/papers/volume1/allwein00a/allwein00a.pdf"} 210 | # - "JWHT 8.1 (Trees)" 211 | # - "HTF 9.2 (Trees)" 212 | 213 | 2019-04-03: 214 | Label: Lab 215 | Slides: 216 | - {'Structured-Prediction-and-Bayesian-Recap': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/structured_prediction_bayesian_recap.pdf"} 217 | Notes: 218 | # - {"Multiclass Questions": "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/7-Lec-Check.pdf"} 219 | # - {"Multiclass Solutions": "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/7-Lec-Check_sol.pdf"} 220 | References: 221 | # - "SSBD Chapter 17" 222 | # - {In Defense of One-Vs-All Classification: "http://www.jmlr.org/papers/v5/rifkin04a.html"} 223 | # - {Reducing Multiclass to Binary: "http://www.jmlr.org/papers/volume1/allwein00a/allwein00a.pdf"} 224 | - 225 | Title: Week 10 226 | Events: 227 | 2019-04-09: 228 | Label: Lecture 229 | Slides: 230 | - {'Classification and Regression Trees': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/10a.trees.pdf"} 231 | References: 232 | - "JWHT 8.1 (Trees)" 233 | - "HTF 9.2 (Trees)" 234 | 2019-04-10: 235 | Label: Lab 236 | Slides: 237 | - {'Multiclass and Trees Questions': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/Multiclass_trees_week10.pdf"} 238 | References: 239 | # - "JWHT 5.2 (Bootstrap)" 240 | # - "HTF 7.11 (Bootstrap)" 241 | - 242 | Title: Week 11 243 | Events: 244 | 2019-04-16: 245 | Label: Lecture 246 | Slides: 247 | - {'Intro to the Bootstrap': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/11a.bootstrap.pdf"} 248 | - {'Bagging and Random Forests': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/11b.bagging-random-forests.pdf"} 249 | - {'Adaboost': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/11c.adaboost.pdf"} 250 | Notes: 251 | - {"Trees, Bootstrap, Bagging, and RF Questions": "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/9-Lec-Check.pdf"} 252 | - {"Trees, Bootstrap, Bagging, and RF Solutions": "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/9-Lec-Check_sol.pdf"} 253 | References: 254 | - "JWHT 5.2 (Bootstrap)" 255 | - "HTF 7.11 (Bootstrap)" 256 | - "JWHT 8.2 (Bagging/RF)" 257 | - "HTF 8.7, 15, 10 (Bagging/RF)" 258 | - {A Conversation with Jerry Friedman: "https://arxiv.org/pdf/1507.08502.pdf"} 259 | 2019-04-17: 260 | Label: Lab 261 | Slides: 262 | - {'Bagging and Boosting Questions': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/bootstrap_bagging_boosting.pdf"} 263 | Notes: 264 | # - {"Gradient Boosting": "https://davidrosenberg.github.io/mlcourse/Archive/2017/Labs/9-GBM-Notes.pdf"} 265 | # - {"Boosting Questions": "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/boosting-Lec-Check.pdf"} 266 | # - {"Boosting Solutions": "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/boosting-Lec-Check_sol.pdf"} 267 | # - {"gbm.py": "https://davidrosenberg.github.io/mlcourse/Archive/2017/Labs/gbm.py"} 268 | # - {"Exponential Distribution Gradient Boosting": "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/conditional-exponential-distributions.pdf"} 269 | # - {"Poisson Gradient Boosting": "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/poisson-gradient-boosting.pdf"} 270 | References: 271 | # - {Friedman's GBM Paper: http://statweb.stanford.edu/~jhf/ftp/trebst.pdf} 272 | # - {Ridgeway's GBM Guide: http://www.saedsayad.com/docs/gbm2.pdf} 273 | # - {XGBoost Paper: http://arxiv.org/abs/1603.02754} 274 | # - {"Bühlmann and Hothorn's Boosting Paper": https://projecteuclid.org/euclid.ss/1207580163} 275 | - 276 | Title: Week 12 277 | Events: 278 | 2019-04-23: 279 | Label: Lecture 280 | Slides: 281 | - {'Gradient Boosting': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/11b.gradient-boosting.pdf"} 282 | - {'Gradient Boosting Lab': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/GBM_Lecture.pdf"} 283 | # - {'Neural Networks': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/12a.neural-networks.pdf"} 284 | # - {'Back Propagation': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/12b.backpropagation.pdf"} 285 | Notes: 286 | - {"Gradient Boosting": "https://davidrosenberg.github.io/mlcourse/Archive/2017/Labs/9-GBM-Notes.pdf"} 287 | - {"gbm.py": "https://davidrosenberg.github.io/mlcourse/Archive/2017/Labs/gbm.py"} 288 | - {"Exponential Distribution Gradient Boosting": "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/conditional-exponential-distributions.pdf"} 289 | - {"Poisson Gradient Boosting": "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/poisson-gradient-boosting.pdf"} 290 | References: 291 | - {Friedman's GBM Paper: http://statweb.stanford.edu/~jhf/ftp/trebst.pdf} 292 | - {Ridgeway's GBM Guide: http://www.saedsayad.com/docs/gbm2.pdf} 293 | - {XGBoost Paper: http://arxiv.org/abs/1603.02754} 294 | - {"Bühlmann and Hothorn's Boosting Paper": https://projecteuclid.org/euclid.ss/1207580163} 295 | # - {'Yes you should understand backprop (Karpathy)': "https://medium.com/@karpathy/yes-you-should-understand-backprop-e2f06eab496b"} 296 | # - {'Challenges with backprop (Karpathy Lecture)': "https://youtu.be/gYpoJMlgyXA?t=13m44s"} 297 | 2019-04-24: 298 | Label: Lab 299 | Slides: 300 | - {'Neural Networks': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/12a.neural-networks.pdf"} 301 | Notes: 302 | # - {"Gradient Boosting": "https://davidrosenberg.github.io/mlcourse/Archive/2017/Labs/9-GBM-Notes.pdf"} 303 | # - {"Boosting Questions": "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/boosting-Lec-Check.pdf"} 304 | # - {"Boosting Solutions": "https://davidrosenberg.github.io/mlcourse/Archive/2019/ConceptChecks/boosting-Lec-Check_sol.pdf"} 305 | # - {"gbm.py": "https://davidrosenberg.github.io/mlcourse/Archive/2017/Labs/gbm.py"} 306 | # - {"Exponential Distribution Gradient Boosting": "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/conditional-exponential-distributions.pdf"} 307 | # - {"Poisson Gradient Boosting": "https://davidrosenberg.github.io/mlcourse/Archive/2019/Notes/poisson-gradient-boosting.pdf"} 308 | References: 309 | # - {Friedman's GBM Paper: http://statweb.stanford.edu/~jhf/ftp/trebst.pdf} 310 | # - {Ridgeway's GBM Guide: http://www.saedsayad.com/docs/gbm2.pdf} 311 | # - {XGBoost Paper: http://arxiv.org/abs/1603.02754} 312 | # - {"Bühlmann and Hothorn's Boosting Paper": https://projecteuclid.org/euclid.ss/1207580163} 313 | - {"Michael Nielsen's book on Neural Nets": "http://neuralnetworksanddeeplearning.com/"} 314 | - 315 | Title: Week 13 316 | Events: 317 | 2018-04-30: 318 | Label: Lecture 319 | # Video: "https://youtu.be/tgCIAft_W24?t=48m48s" 320 | Slides: 321 | - {'Back Propagation': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/12b.backpropagation.pdf"} 322 | - {'k-Means': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/13a.k-means.pdf"} 323 | # - {'Gaussian Mixture Models': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/13b.mixture-models.pdf"} 324 | # - {'General EM Algorithm': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/13c.EM-algorithm.pdf"} 325 | Notes: 326 | References: 327 | - {'Yes you should understand backprop (Karpathy)': "https://medium.com/@karpathy/yes-you-should-understand-backprop-e2f06eab496b"} 328 | - {'Challenges with backprop (Karpathy Lecture)': "https://youtu.be/gYpoJMlgyXA?t=13m44s"} 329 | - {"Michael Nielsen: How the backpropagation algorithm works": "http://neuralnetworksanddeeplearning.com/chap2.html"} 330 | - "HTF, 13.2.1 (k-means)" 331 | # - "Bishop 9.2,9.3 (GMM/EM)" 332 | # - {"An Alternative to EM for GMM [Optional]": "https://arxiv.org/pdf/1706.03267.pdf"} 333 | 2019-05-01: 334 | Label: Lab 335 | Slides: 336 | - {'Neural Networks Questions': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/neural-network-questions.pdf"} 337 | - 338 | Title: Week 14 339 | Events: 340 | 2019-05-07: 341 | Label: Lecture 342 | Slides: 343 | - {'Gaussian Mixture Models': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/13b.mixture-models.pdf"} 344 | - {'General EM Algorithm': "https://davidrosenberg.github.io/mlcourse/Archive/2019/Lectures/13c.EM-algorithm.pdf"} 345 | Notes: 346 | References: 347 | - "Bishop 9.2,9.3 (GMM/EM)" 348 | - {"An Alternative to EM for GMM [Optional]": "https://arxiv.org/pdf/1706.03267.pdf"} 349 | 2018-05-08: 350 | Label: Course Review 351 | Slides: 352 | - {Review for Final: "https://davidrosenberg.github.io/mlcourse/Archive/2019/Labs/ML_Final_Review.pdf"} 353 | 354 | -------------------------------------------------------------------------------- /data/site-instructions.md: -------------------------------------------------------------------------------- 1 | When this-week.yml has the string "null" in it, it's not included at the top 2 | -------------------------------------------------------------------------------- /data/this-week.yml: -------------------------------------------------------------------------------- 1 | null 2 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ## Run this from project root 3 | 4 | set -e # Exit with nonzero exit code if anything fails 5 | 6 | SOURCE_BRANCH="master" 7 | TARGET_BRANCH="gh-pages" 8 | 9 | function doCompile { 10 | ./build.sh 11 | } 12 | 13 | # Save some useful information 14 | REPO=`git config remote.origin.url` 15 | SSH_REPO=${REPO/https:\/\/github.com\//git@github.com:} 16 | SHA=`git rev-parse --verify HEAD` 17 | 18 | # Clone the existing gh-pages for this repo into out/ 19 | # Create a new empty branch if gh-pages doesn't exist yet (should only happen on first deply) 20 | rm -rf out 21 | git clone $REPO out 22 | cd out 23 | git checkout $TARGET_BRANCH || git checkout --orphan $TARGET_BRANCH 24 | cd .. 25 | 26 | # Clean out existing contents 27 | rm -rf out/**/* || exit 0 28 | 29 | # Run our compile script 30 | doCompile 31 | 32 | # Now let's go have some fun with the cloned repo 33 | cd out 34 | 35 | # Commit the "changes", i.e. the new version. 36 | # The delta will show diffs between new and old versions. 37 | git add --all . 38 | git commit -m "Deploy to GitHub Pages: ${SHA}" 39 | 40 | # Now that we're all set up, we can push. 41 | git push $REPO $TARGET_BRANCH 42 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/favicon.ico -------------------------------------------------------------------------------- /fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /images/barber-1x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/barber-1x.jpg -------------------------------------------------------------------------------- /images/barber-2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/barber-2x.jpg -------------------------------------------------------------------------------- /images/barber-3x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/barber-3x.jpg -------------------------------------------------------------------------------- /images/barber-original.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/barber-original.jpg -------------------------------------------------------------------------------- /images/bishop-1x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/bishop-1x.jpg -------------------------------------------------------------------------------- /images/bishop-2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/bishop-2x.jpg -------------------------------------------------------------------------------- /images/bishop-3x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/bishop-3x.jpg -------------------------------------------------------------------------------- /images/bishop-original.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/bishop-original.jpg -------------------------------------------------------------------------------- /images/boyd-1x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/boyd-1x.jpg -------------------------------------------------------------------------------- /images/boyd-2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/boyd-2x.jpg -------------------------------------------------------------------------------- /images/boyd-original.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/boyd-original.jpg -------------------------------------------------------------------------------- /images/geron-original.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/geron-original.jpg -------------------------------------------------------------------------------- /images/hastie-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/hastie-1x.png -------------------------------------------------------------------------------- /images/hastie-2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/hastie-2x.jpg -------------------------------------------------------------------------------- /images/hastie-3x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/hastie-3x.jpg -------------------------------------------------------------------------------- /images/hastie-original.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/hastie-original.jpg -------------------------------------------------------------------------------- /images/james-1x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/james-1x.jpg -------------------------------------------------------------------------------- /images/james-2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/james-2x.jpg -------------------------------------------------------------------------------- /images/james-3x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/james-3x.jpg -------------------------------------------------------------------------------- /images/james-original.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/james-original.jpg -------------------------------------------------------------------------------- /images/murphy-1x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/murphy-1x.jpg -------------------------------------------------------------------------------- /images/murphy-2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/murphy-2x.jpg -------------------------------------------------------------------------------- /images/murphy-3x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/murphy-3x.jpg -------------------------------------------------------------------------------- /images/murphy-original.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/murphy-original.jpg -------------------------------------------------------------------------------- /images/people/aakash.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/people/aakash.JPG -------------------------------------------------------------------------------- /images/people/david.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/people/david.jpg -------------------------------------------------------------------------------- /images/people/julia.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/people/julia.jpg -------------------------------------------------------------------------------- /images/people/mihir.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/people/mihir.jpg -------------------------------------------------------------------------------- /images/people/mingsi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/people/mingsi.jpg -------------------------------------------------------------------------------- /images/people/sanyam.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/people/sanyam.jpg -------------------------------------------------------------------------------- /images/people/sreyas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/people/sreyas.png -------------------------------------------------------------------------------- /images/people/tingyan.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/people/tingyan.jpeg -------------------------------------------------------------------------------- /images/people/xintian.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/people/xintian.jpeg -------------------------------------------------------------------------------- /images/people/yi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/people/yi.jpg -------------------------------------------------------------------------------- /images/provost-fawcett-original.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/provost-fawcett-original.jpg -------------------------------------------------------------------------------- /images/shalev-shwartz-original.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/images/shalev-shwartz-original.jpg -------------------------------------------------------------------------------- /index.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | DS-GA 1003 / CSCI-GA 2567: Machine Learning, Spring 2019 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 20 | 21 |
22 |

23 | Machine Learning 24 | 25 | DS-GA 1003 · Spring 2019 · 26 | NYU Center for Data Science 27 | 28 |

29 | 30 | 31 | 32 | 33 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 |
Lead InstructorJulia Kempe
Co-InstructorDavid Rosenberg
LectureTuesday 5:20pm–7pm, MEYER 121 (4 Washington Pl)
LabWednesday 6:45pm–7:35pm, MEYER 121 (4 Washington Pl)
Office HoursInstructor: Tuesdays 4:00-5:00pm CDS (60 5th Ave.), 6th floor, Room 620
Section Leaders: Wednesdays 8:00-9:00pm, CDS (60 5th Ave.) Room C-15
Graders: Wed 1:30-2:30pm, Thu 12:30-1:30pm CDS (60 5th Ave.), Room 667
NoteIn Weeks 5, 7 and 11 David Rosenberg will teach and hold office hours -
perhaps not at the usual time or place. We will announce these changes.
68 | 69 | {{> this-week thisWeek }} 70 |
71 |
72 |

About This Course

73 | 74 |
75 |

This course covers a wide variety of topics in machine learning and statistical modeling. While mathematical methods and theoretical aspects will be covered, the primary goal is to provide students with the tools and principles needed to solve the data science problems found in practice. This course also serves as a foundation on which more specialized courses and further independent study can build. A tentative syllabus can be found here.

76 | 77 |

This course was designed as part of the core curriculum for the Center for Data Science's Masters degree in Data Science. Other interested students who satisfy the prerequisites are welcome to take the class as well. This class is intended as a continuation of DS-GA-1001 Intro to Data Science, which covers some important, fundamental data science topics that may not be explicitly covered in this DS-GA class (e.g. data cleaning, cross-validation, and sampling bias).

78 | 79 |

We will use Piazza for class discussion. Rather than emailing questions to the teaching staff, please post your questions on Piazza, where they will be answered by the instructor, TAs, graders, and other students. For questions that are not specific to the class, you are also encouraged to post to Stack Overflow for programming questions and Cross Validated for statistics and machine learning questions. Please also post a link to these postings in Piazza, so others in the class can answer the questions and benefit from the answers. 80 | 81 | 82 | 83 |

Other information:

84 | 92 |
93 | 94 |
95 |

Prerequisites

96 |
    97 |
  • DS-GA-1001: Intro to Data Science or its equivalent
  • 98 |
  • DS-GA-1002: Statistical and Mathematical Methods or its equivalent
  • 99 |
  • Solid mathematical background, equivalent to a 1-semester undergraduate course in each of the following: linear algebra, multivariate calculus (primarily differential calculus), probability theory, and statistics. (The coverage in the 2015 version of DS-GA 1002, linked above, is sufficient.)
  • 100 |
  • Python programming required for most homework assignments.
  • 101 |
  • Recommended: Computer science background up to a "data structures and algorithms" course
  • 102 |
  • Recommended: At least one advanced, proof-based mathematics course
  • 103 |
  • Some prerequisites may be waived with permission of the instructor
  • 104 |
  • You can also self-assess your preparation by filling out the Prerequisite Questionnaire
  • 105 |
106 |
107 |
108 |

Grading

109 |

Homework (40%) + Midterm Exam (30%) + Final Exam (30%)

110 |

111 | Many homework assignments will have problems designated as “optional”. At the end of the semester, strong performance on these problems may lift the final course grade by up to half a letter grade (e.g. B+ to A- or A- to A), especially for borderline grades. You should view the optional problems primarily as a way to engage with more material, if you have the time. Along with the performance on optional problems, we will also consider significant contributions to Piazza and in-class discussions for boosting a borderline grade. 112 |

113 |
114 | 115 |
116 |

Important Dates

117 |
    118 |
  • Midterm Exam (100 min) Tuesday, March 12th, 5:20–7pm.
  • 119 |
  • Final Exam (100 min) Thursday, May 16th, 6-7:50pm (confirmed).
  • 120 |
  • See Assignments section for homework-related deadlines.
  • 121 |
122 |
123 | 124 | 125 |
126 | 127 |
128 |

Resources

129 | 130 |
131 |

Textbooks

132 | 133 | The cover of Elements of Statistical Learning 134 | 135 | The cover of An Introduction to Statistical Learning 136 | 137 | The cover of Understanding Machine Learning: From Theory to Algorithms 138 | 139 | The cover of Pattern Recognition and Machine Learning 140 | 141 | The cover of Bayesian Reasoning and Machine Learning 142 | 143 |
144 | 145 |
The 146 | Elements of Statistical Learning (Hastie, Friedman, and Tibshirani) 147 |
This will be our main textbook for L1 and L2 regularization, trees, bagging, random forests, and boosting. It's written by three statisticians who invented many of the techniques discussed. There's an easier version of this book that covers many of the same topics, described below. (Available for free as a PDF.) 148 | 149 |
An Introduction to Statistical Learning (James, Witten, Hastie, and Tibshirani) 150 |
This book is written by two of the same authors as The Elements of Statistical Learning. It's much less intense mathematically, and it's good for a lighter introduction to the topics. (Available for free as a PDF.) 151 | 152 |
Understanding Machine Learning: From Theory to Algorithms (Shalev-Shwartz and Ben-David) 153 |
Last year this was our primary reference for kernel methods and multiclass classification, and we may use it even more this year. Covers a lot of theory that we don't go into, but it would be a good supplemental resource for a more theoretical course, such as Mohri's Foundations of Machine Learning course. (Available for free as a PDF.) 154 | 155 |
Pattern Recognition and Machine Learning (Christopher Bishop) 156 |
Our primary reference for probabilistic methods, including bayesian regression, latent variable models, and the EM algorithm. It's highly recommended, but unfortunately not free online. 157 | 158 |
Bayesian Reasoning and Machine Learning (David Barber) 159 |
A very nice resource for our topics in probabilistic modeling, and a possible substitute for the Bishop book. Would serve as a good supplemental reference for a more advanced course in probabilistic modeling, such as DS-GA 1005: Inference and Representation (Available for free as a PDF.) 160 |
161 | 162 |
Hands-On Machine Learning with Scikit-Learn and TensorFlow (Aurélien Géron) 163 |
This is a practical guide to machine learning that corresponds fairly well with the content and level of our course. While most of our homework is about coding ML from scratch with numpy, this book makes heavy use of scikit-learn and TensorFlow. Comfort with the first two chapters of this book would be part of the ideal preparation for this course, and it will also be a handy reference for practical projects and work beyond this course, when you'll want to make use of existing ML packages, rather than rolling your own.
164 | 165 |
Data Science for Business (Provost and Fawcett) 166 |
Ideally, this would be everybody's first book on machine learning. The intended audience is both the ML practitioner and the ML product manager. It's full of important core concepts and practical wisdom. The math is so minimal that it's perfect for reading on your phone, and I encourage you to read it in parallel to doing this class, especially if you haven't taken DS-GA 1001.
167 | 168 | 169 | 170 |
171 | 172 |
173 |

Other tutorials and references

174 | 175 | 183 |
184 | 185 |
186 |

Software

187 | 188 |
    189 |
  • NumPy is "the fundamental package for scientific computing with Python." Our homework assignments will use NumPy arrays extensively. 190 |
  • scikit-learn is a comprehensive machine learning toolkit for Python. We won't use this for most of the homework assignments, since we'll be coding things from scratch. However, you may want to run the scikit-learn version of the algorithms to check that your own outputs are correct. Also, studying the source code can be a good learning experience. 191 |
192 |
193 |
194 | 195 |
196 |

Lectures

197 | 198 | 203 | 204 | {{> lectures lectures }} 205 |
206 |
207 |

Assignments

208 | 209 |
210 |

Late Policy: Homeworks are due at {{assignmentsFrontmatter.[Due time]}} on the date specified. Homeworks will still be accepted for 48 hours after this time but will have a 20% penalty.

211 | 212 |

Collaboration Policy: You may discuss problems with your classmates. However, you must write up the homework solutions and the code from scratch, without referring to notes from your joint session. In your solution to each problem, you must write down the names of any person with whom you discussed the problem—this will not affect your grade.

213 | 214 |

Homework Submission: Homework should be submitted through Gradescope. If you have not used Gradescope before, please watch this short video: "For students: submitting homework." At the beginning of the semester, you will be added to the Gradescope class roster. This will give you access to the course page, and the assignment submission form. To submit assignments, you will need to:

215 |
    216 |
  1. Upload a single PDF document containing all the math, code, plots, and exposition required for each problem.
  2. 217 |
  3. Where homework assignments are divided into sections, please begin each section on a new page.
  4. 218 |
  5. You will then select the appropriate page ranges for each homework problem, as described in the "submitting homework" video.
  6. 219 |
220 |

Homework Feedback: Check Gradescope to get your scores on each individual problem, as well as comments on your answers. Since Gradescope cannot distinguish between required and optional problems, final homework scores, separated into required and optional parts, will be posted on NYUClasses.

221 |
222 | 223 | {{> assignments assignments }} 224 |
225 | 226 |
227 |

People

228 | 229 |
230 |

Instructors

231 | 232 | 250 | 251 |
252 | 253 |
254 |

Section Leaders

255 | 256 |
    257 |
    258 | A photo of Sreyas Mohan 259 |
    260 |

    Sreyas Mohan (Head TA)

    261 | 262 |

    Sreyas is a second year PhD student in the Data Science Program at CDS working with Prof. Carlos Fernandez-Granda and Prof. Eero Simoncelli. 263 |

    264 |
    265 |
    266 |
    267 | A photo of Xintian Han 268 |
    269 |

    Xintian Han

    270 | 271 |

    Xintian is a second year PhD student in the Data Science Program at CDS working with Prof. Rajesh Ranganath.

    272 |
    273 |
    274 |
275 |
276 |
277 |

Graders

278 | 279 |
    280 |
  • 281 | A photo of Sanyam Kapur 282 |
    283 |

    Sanyam Kapur (Head Grader)

    284 | 285 |

    Sanyam is a Masters Student in Computer Science at NYU Courant. He is currently working towards improving Markov Chain Monte Carlo methods.

    286 |
    287 |
  • 288 |
  • 289 | A photo of Aakash Kaku 290 |
    291 |

    Aakash Kaku

    292 |

    Aakash is a second-year Masters student in the Data Science program at NYU. He is interested in solving problems in the healthcare domain using machine learning.

    293 |
    294 |
  • 295 |
  • 296 | A photo of Mingsi Long 297 |
    298 |

    Mingsi Long

    299 |

    Mingsi is a second year student in the Data Science Program at NYU CDS.

    300 |
    301 |
  • 302 | 303 |
  • 304 | A photo of Mihir Rana 305 |
    306 |

    Mihir Rana

    307 |

    Mihir is a Master's student in Data Science at the NYU Center for Data Science, interested in computer vision, reinforcement learning, and natural language understanding.

    308 |
    309 |
  • 310 |
  • 311 | A photo of Tingyan Xiang 312 |
    313 |

    Tingyan Xiang

    314 |

    Tingyan is a second-year Masters student in the Data Science program at NYU.

    315 |
    316 |
  • 317 |
  • 318 | A photo of Yi Zhou 319 |
    320 |

    Yi Zhou

    321 |

    Yi is a second year student at the CS department at NYU Tandon.

    322 |
    323 |
  • 324 |
325 |
326 | 327 | 328 |
329 | 330 | 333 | 334 | 335 | 336 | 346 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dsga1003", 3 | "requires": true, 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "balanced-match": { 7 | "version": "1.0.0", 8 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 9 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 10 | "dev": true 11 | }, 12 | "brace-expansion": { 13 | "version": "1.1.11", 14 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 15 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 16 | "dev": true, 17 | "requires": { 18 | "balanced-match": "^1.0.0", 19 | "concat-map": "0.0.1" 20 | } 21 | }, 22 | "concat-map": { 23 | "version": "0.0.1", 24 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 25 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 26 | "dev": true 27 | }, 28 | "debug": { 29 | "version": "2.6.0", 30 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", 31 | "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", 32 | "dev": true, 33 | "requires": { 34 | "ms": "0.7.2" 35 | } 36 | }, 37 | "fs.realpath": { 38 | "version": "1.0.0", 39 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 40 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 41 | "dev": true 42 | }, 43 | "glob": { 44 | "version": "7.1.3", 45 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 46 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 47 | "dev": true, 48 | "requires": { 49 | "fs.realpath": "^1.0.0", 50 | "inflight": "^1.0.4", 51 | "inherits": "2", 52 | "minimatch": "^3.0.4", 53 | "once": "^1.3.0", 54 | "path-is-absolute": "^1.0.0" 55 | } 56 | }, 57 | "handlebars": { 58 | "version": "4.0.11", 59 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", 60 | "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", 61 | "dev": true, 62 | "requires": { 63 | "async": "^1.4.0", 64 | "optimist": "^0.6.1", 65 | "source-map": "^0.4.4", 66 | "uglify-js": "^2.6" 67 | }, 68 | "dependencies": { 69 | "align-text": { 70 | "version": "0.1.4", 71 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 72 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 73 | "dev": true, 74 | "requires": { 75 | "kind-of": "^3.0.2", 76 | "longest": "^1.0.1", 77 | "repeat-string": "^1.5.2" 78 | } 79 | }, 80 | "amdefine": { 81 | "version": "1.0.1", 82 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 83 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 84 | "dev": true 85 | }, 86 | "async": { 87 | "version": "1.5.2", 88 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 89 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 90 | "dev": true 91 | }, 92 | "camelcase": { 93 | "version": "1.2.1", 94 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 95 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 96 | "dev": true, 97 | "optional": true 98 | }, 99 | "center-align": { 100 | "version": "0.1.3", 101 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 102 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 103 | "dev": true, 104 | "optional": true, 105 | "requires": { 106 | "align-text": "^0.1.3", 107 | "lazy-cache": "^1.0.3" 108 | } 109 | }, 110 | "cliui": { 111 | "version": "2.1.0", 112 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 113 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 114 | "dev": true, 115 | "optional": true, 116 | "requires": { 117 | "center-align": "^0.1.1", 118 | "right-align": "^0.1.1", 119 | "wordwrap": "0.0.2" 120 | }, 121 | "dependencies": { 122 | "wordwrap": { 123 | "version": "0.0.2", 124 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 125 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 126 | "dev": true, 127 | "optional": true 128 | } 129 | } 130 | }, 131 | "decamelize": { 132 | "version": "1.2.0", 133 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 134 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 135 | "dev": true, 136 | "optional": true 137 | }, 138 | "is-buffer": { 139 | "version": "1.1.6", 140 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 141 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 142 | "dev": true 143 | }, 144 | "kind-of": { 145 | "version": "3.2.2", 146 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 147 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 148 | "dev": true, 149 | "requires": { 150 | "is-buffer": "^1.1.5" 151 | } 152 | }, 153 | "lazy-cache": { 154 | "version": "1.0.4", 155 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 156 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 157 | "dev": true, 158 | "optional": true 159 | }, 160 | "longest": { 161 | "version": "1.0.1", 162 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 163 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 164 | "dev": true 165 | }, 166 | "minimist": { 167 | "version": "0.0.10", 168 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 169 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", 170 | "dev": true 171 | }, 172 | "optimist": { 173 | "version": "0.6.1", 174 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 175 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 176 | "dev": true, 177 | "requires": { 178 | "minimist": "~0.0.1", 179 | "wordwrap": "~0.0.2" 180 | } 181 | }, 182 | "repeat-string": { 183 | "version": "1.6.1", 184 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 185 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 186 | "dev": true 187 | }, 188 | "right-align": { 189 | "version": "0.1.3", 190 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 191 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 192 | "dev": true, 193 | "optional": true, 194 | "requires": { 195 | "align-text": "^0.1.1" 196 | } 197 | }, 198 | "source-map": { 199 | "version": "0.4.4", 200 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 201 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 202 | "dev": true, 203 | "requires": { 204 | "amdefine": ">=0.0.4" 205 | } 206 | }, 207 | "uglify-js": { 208 | "version": "2.8.29", 209 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 210 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 211 | "dev": true, 212 | "optional": true, 213 | "requires": { 214 | "source-map": "~0.5.1", 215 | "uglify-to-browserify": "~1.0.0", 216 | "yargs": "~3.10.0" 217 | }, 218 | "dependencies": { 219 | "source-map": { 220 | "version": "0.5.7", 221 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 222 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 223 | "dev": true, 224 | "optional": true 225 | } 226 | } 227 | }, 228 | "uglify-to-browserify": { 229 | "version": "1.0.2", 230 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 231 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 232 | "dev": true, 233 | "optional": true 234 | }, 235 | "window-size": { 236 | "version": "0.1.0", 237 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 238 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 239 | "dev": true, 240 | "optional": true 241 | }, 242 | "wordwrap": { 243 | "version": "0.0.3", 244 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 245 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 246 | "dev": true 247 | }, 248 | "yargs": { 249 | "version": "3.10.0", 250 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 251 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 252 | "dev": true, 253 | "optional": true, 254 | "requires": { 255 | "camelcase": "^1.0.2", 256 | "cliui": "^2.1.0", 257 | "decamelize": "^1.0.0", 258 | "window-size": "0.1.0" 259 | } 260 | } 261 | } 262 | }, 263 | "inflight": { 264 | "version": "1.0.6", 265 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 266 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 267 | "dev": true, 268 | "requires": { 269 | "once": "^1.3.0", 270 | "wrappy": "1" 271 | } 272 | }, 273 | "inherits": { 274 | "version": "2.0.3", 275 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 276 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 277 | "dev": true 278 | }, 279 | "js-yaml": { 280 | "version": "3.10.0", 281 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", 282 | "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", 283 | "dev": true, 284 | "requires": { 285 | "argparse": "^1.0.7", 286 | "esprima": "^4.0.0" 287 | }, 288 | "dependencies": { 289 | "argparse": { 290 | "version": "1.0.9", 291 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 292 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 293 | "dev": true, 294 | "requires": { 295 | "sprintf-js": "~1.0.2" 296 | } 297 | }, 298 | "esprima": { 299 | "version": "4.0.0", 300 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 301 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", 302 | "dev": true 303 | }, 304 | "sprintf-js": { 305 | "version": "1.0.3", 306 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 307 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 308 | "dev": true 309 | } 310 | } 311 | }, 312 | "minimatch": { 313 | "version": "3.0.4", 314 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 315 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 316 | "dev": true, 317 | "requires": { 318 | "brace-expansion": "^1.1.7" 319 | } 320 | }, 321 | "moment": { 322 | "version": "2.20.1", 323 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", 324 | "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==", 325 | "dev": true 326 | }, 327 | "ms": { 328 | "version": "0.7.2", 329 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", 330 | "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", 331 | "dev": true 332 | }, 333 | "once": { 334 | "version": "1.4.0", 335 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 336 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 337 | "dev": true, 338 | "requires": { 339 | "wrappy": "1" 340 | } 341 | }, 342 | "path-is-absolute": { 343 | "version": "1.0.1", 344 | "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 345 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 346 | "dev": true 347 | }, 348 | "slugg": { 349 | "version": "1.2.1", 350 | "resolved": "https://registry.npmjs.org/slugg/-/slugg-1.2.1.tgz", 351 | "integrity": "sha1-51KvIkGvPycURjxd4iXOpHYIdAo=", 352 | "dev": true 353 | }, 354 | "stylus": { 355 | "version": "0.54.5", 356 | "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", 357 | "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", 358 | "dev": true, 359 | "requires": { 360 | "css-parse": "1.7.x", 361 | "debug": "*", 362 | "glob": "7.0.x", 363 | "mkdirp": "0.5.x", 364 | "sax": "0.5.x", 365 | "source-map": "0.1.x" 366 | }, 367 | "dependencies": { 368 | "amdefine": { 369 | "version": "1.0.1", 370 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 371 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 372 | "dev": true 373 | }, 374 | "balanced-match": { 375 | "version": "1.0.0", 376 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 377 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 378 | "dev": true 379 | }, 380 | "brace-expansion": { 381 | "version": "1.1.8", 382 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 383 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 384 | "dev": true, 385 | "requires": { 386 | "balanced-match": "^1.0.0", 387 | "concat-map": "0.0.1" 388 | } 389 | }, 390 | "concat-map": { 391 | "version": "0.0.1", 392 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 393 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 394 | "dev": true 395 | }, 396 | "css-parse": { 397 | "version": "1.7.0", 398 | "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", 399 | "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", 400 | "dev": true 401 | }, 402 | "fs.realpath": { 403 | "version": "1.0.0", 404 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 405 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 406 | "dev": true 407 | }, 408 | "glob": { 409 | "version": "7.0.6", 410 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", 411 | "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", 412 | "dev": true, 413 | "requires": { 414 | "fs.realpath": "^1.0.0", 415 | "inflight": "^1.0.4", 416 | "inherits": "2", 417 | "minimatch": "^3.0.2", 418 | "once": "^1.3.0", 419 | "path-is-absolute": "^1.0.0" 420 | } 421 | }, 422 | "inflight": { 423 | "version": "1.0.6", 424 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 425 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 426 | "dev": true, 427 | "requires": { 428 | "once": "^1.3.0", 429 | "wrappy": "1" 430 | } 431 | }, 432 | "inherits": { 433 | "version": "2.0.3", 434 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 435 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 436 | "dev": true 437 | }, 438 | "minimatch": { 439 | "version": "3.0.4", 440 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 441 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 442 | "dev": true, 443 | "requires": { 444 | "brace-expansion": "^1.1.7" 445 | } 446 | }, 447 | "minimist": { 448 | "version": "0.0.8", 449 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 450 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 451 | "dev": true 452 | }, 453 | "mkdirp": { 454 | "version": "0.5.1", 455 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 456 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 457 | "dev": true, 458 | "requires": { 459 | "minimist": "0.0.8" 460 | } 461 | }, 462 | "once": { 463 | "version": "1.4.0", 464 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 465 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 466 | "dev": true, 467 | "requires": { 468 | "wrappy": "1" 469 | } 470 | }, 471 | "path-is-absolute": { 472 | "version": "1.0.1", 473 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 474 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 475 | "dev": true 476 | }, 477 | "sax": { 478 | "version": "0.5.8", 479 | "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", 480 | "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", 481 | "dev": true 482 | }, 483 | "source-map": { 484 | "version": "0.1.43", 485 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 486 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 487 | "dev": true, 488 | "requires": { 489 | "amdefine": ">=0.0.4" 490 | } 491 | }, 492 | "wrappy": { 493 | "version": "1.0.2", 494 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 495 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 496 | "dev": true 497 | } 498 | } 499 | }, 500 | "wrappy": { 501 | "version": "1.0.2", 502 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 503 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 504 | "dev": true 505 | } 506 | } 507 | } 508 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dsga1003", 3 | "private": true, 4 | "scripts": { 5 | "build-in-place": "npm run template && npm run stylus", 6 | "template": "node ./build/templater.js index.hbs index.html", 7 | "stylus": "stylus styles" 8 | }, 9 | "devDependencies": { 10 | "handlebars": "^4.0.6", 11 | "js-yaml": "^3.2.5", 12 | "glob": "^7.1.2", 13 | "moment": "^2.9.0", 14 | "slugg": "^1.0.0", 15 | "stylus": "0.54.5" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /scripts/navigation.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 'use strict'; 3 | var nav = document.querySelector('body > nav'); 4 | var sections = Array.prototype.slice.call(document.querySelectorAll('body > section')); 5 | 6 | window.addEventListener('hashchange', setSelectedLink); 7 | window.addEventListener('scroll', setHashFromScroll); 8 | 9 | if (!window.location.hash) { 10 | setHashFromScroll(); 11 | } 12 | setSelectedLink(); 13 | 14 | function setSelectedLink() { 15 | var selected = nav.querySelector('a.selected'); 16 | if (selected) { 17 | selected.classList.remove('selected'); 18 | } 19 | 20 | nav.querySelector('a[href="' + window.location.hash + '"]').classList.add('selected'); 21 | } 22 | 23 | function setHashFromScroll() { 24 | var bodyScrollTop = document.body.scrollTop || document.documentElement.scrollTop; 25 | var minDifference = +Infinity; 26 | var minSectionId; 27 | 28 | sections.forEach(function (section) { 29 | var difference = Math.abs(section.offsetTop - bodyScrollTop); 30 | if (difference < minDifference) { 31 | minDifference = difference; 32 | minSectionId = section.id; 33 | } 34 | }); 35 | 36 | // Don't want to scroll to the section directly since we are already inside a user scroll handler. 37 | history.replaceState({}, '', '#' + minSectionId); 38 | setSelectedLink(); 39 | } 40 | }()); 41 | -------------------------------------------------------------------------------- /styles/colors.styl: -------------------------------------------------------------------------------- 1 | accent = rgb(87, 7, 142) 2 | accent-hover = lighten(accent, 30%) 3 | gray = #D9D9D9 4 | body-color = #444444 5 | bg-gray = #f8f7f8 6 | -------------------------------------------------------------------------------- /styles/phone.styl: -------------------------------------------------------------------------------- 1 | @import "colors" 2 | 3 | nav-height = 60px 4 | number-of-nav-items = 7 5 | 6 | .phone-only-block 7 | display: block 8 | 9 | body 10 | padding = 10px 11 | padding: padding 12 | padding-bottom: padding + nav-height 13 | 14 | body > nav 15 | width: 100% 16 | height: nav-height 17 | top: initial 18 | bottom: 0 19 | display: flex 20 | 21 | > a 22 | width: auto 23 | flex: 0 0 (100% / number-of-nav-items) 24 | border-bottom: none 25 | border-right: 1px solid accent-hover 26 | touch-action: manipulation 27 | 28 | &:hover 29 | width: auto 30 | 31 | #this-week 32 | display: inline-block 33 | width: initial 34 | 35 | > h1 36 | text-align: center 37 | 38 | .week-summary 39 | display: inline-block 40 | 41 | section 42 | display: block 43 | padding-right: 30px 44 | margin-bottom: 20px 45 | min-width: initial 46 | max-width: initial 47 | 48 | &:last-child 49 | margin-bottom: 0 50 | 51 | #home 52 | padding-top: 20px 53 | 54 | > h1 55 | text-align: center 56 | margin-bottom: 40px 57 | 58 | > span 59 | &, .department 60 | margin-top: 10px 61 | font-size: 12px 62 | .department 63 | margin-top: 5px 64 | display: block 65 | 66 | p 67 | label-width = 145px 68 | span 69 | display: inline-block 70 | width: "calc(100% - %s)" % label-width 71 | 72 | strong 73 | width: label-width 74 | 75 | #textbooks 76 | img 77 | max-width: 30% 78 | width: auto 79 | height: auto 80 | margin-right: 5px 81 | 82 | #lectures > section 83 | > h1 84 | font-size: 24px 85 | 86 | .date 87 | display: inline-block 88 | 89 | .topics, .references 90 | padding-right: 0 91 | 92 | > table 93 | display: block 94 | margin-top: 0 95 | 96 | &:not(:last-child) 97 | margin-bottom: 20px 98 | border-bottom: 2px solid gray 99 | 100 | thead 101 | display: none 102 | 103 | tbody 104 | td, th 105 | display: block 106 | margin-bottom: 25px 107 | padding-top: 0 108 | 109 | // .icon 110 | // &.references, &.slides 111 | // &::before 112 | // top: 0 113 | // left: 0 114 | 115 | // margin-top: -6px 116 | 117 | // font-size: 14px 118 | 119 | #assignments .homework 120 | strong 121 | display: inline-block 122 | 123 | .deadline, .files 124 | width: auto 125 | 126 | .module > * 127 | display: block 128 | padding-bottom: 10px 129 | 130 | .files > * 131 | margin-right: 10px 132 | 133 | #people 134 | ul 135 | display: block 136 | 137 | .person 138 | display: block 139 | width: auto 140 | flex-basis: auto 141 | margin-right: 0 142 | 143 | > img 144 | float: left 145 | -------------------------------------------------------------------------------- /styles/style.styl: -------------------------------------------------------------------------------- 1 | @import "colors" 2 | 3 | nav-width = 60px 4 | body-padding = 40px 5 | body-left = nav-width + body-padding 6 | module-padding = 20px 7 | 8 | font-largest = 9 | font-size: 46px 10 | 11 | @media(max-width: 420px) 12 | font-size: 24px 13 | 14 | font-large = 15 | font-size: 36px 16 | 17 | @media(max-width: 420px) 18 | font-size: 20px 19 | 20 | font-medium = 21 | font-size: 20px 22 | 23 | @media(max-width: 420px) 24 | font-size: 16px 25 | 26 | font-small = 27 | font-size: 16px 28 | 29 | @media(max-width: 420px) 30 | font-size: 14px 31 | 32 | font-smallest = 33 | font-size: 14px 34 | 35 | @font-face 36 | font-family: "Glyphicons Halflings" 37 | src: url("../fonts/glyphicons-halflings-regular.woff2") format("woff2"), 38 | url("../fonts/glyphicons-halflings-regular.woff") format("woff") 39 | 40 | icon-home = 41 | content: "\e021" 42 | icon-info-sign = 43 | content: "\e086" 44 | icon-calendar = 45 | content: "\e109" 46 | icon-list = 47 | content: "\e012" 48 | icon-star = 49 | content: "\e006" 50 | icon-user = 51 | content: "\e008" 52 | icon-book = 53 | content: "\e043" 54 | icon-pencil = 55 | content: "\270f" 56 | icon-envelope = 57 | content: "\2709" 58 | icon-new-window = 59 | content: "\e164" 60 | icon-save = 61 | content: "\e166" 62 | icon-video = 63 | content: "\e059" 64 | 65 | 66 | *, *::before, *::after 67 | margin: 0 68 | padding: 0 69 | box-sizing: border-box 70 | 71 | .phone-only-block 72 | display: none 73 | 74 | body 75 | padding: body-padding 76 | padding-left: body-left 77 | padding-top: 0 78 | line-height: 1.6em 79 | 80 | color: body-color 81 | font-family: Helvetica, Arial, sans-serif 82 | 83 | background-color: bg-gray 84 | 85 | a 86 | text-decoration: none 87 | color: accent 88 | 89 | &:hover 90 | color: accent-hover 91 | 92 | h1 93 | text-transform: uppercase 94 | line-height: normal 95 | 96 | p 97 | margin: 16px 0 98 | 99 | {font-small} 100 | line-height: 1.6em 101 | 102 | &:first-child 103 | margin-top: 0 104 | 105 | &:last-child 106 | margin-bottom: 0 107 | 108 | ul, ol 109 | margin-left: 20px 110 | 111 | .module 112 | background: white 113 | border-radius: 8px 114 | padding: module-padding 115 | box-shadow: 0 0 5px rgba(0,0,0,0.12) 116 | 117 | .icon 118 | &::before 119 | font-family: "Glyphicons Halflings" 120 | opacity: 0.4 121 | margin-right: 10px 122 | vertical-align: middle 123 | color: accent 124 | 125 | &.pdf::before 126 | {icon-new-window} 127 | 128 | &.zip::before 129 | {icon-save} 130 | 131 | body > nav 132 | position: fixed 133 | top: 0 134 | left: 0 135 | z-index: 2 136 | 137 | width: nav-width 138 | height: 100% 139 | 140 | background-color: accent 141 | box-shadow: 0 0 10px rgba(0,0,0,0.3) 142 | 143 | > a 144 | position: relative 145 | 146 | display: block 147 | width: 60px 148 | height: nav-width 149 | padding: 10px 10px 10px 10px 150 | box-sizing: border-box 151 | border-bottom: 1px solid accent-hover 152 | 153 | {font-smallest} 154 | font-weight: bold 155 | letter-spacing: .03em 156 | text-transform: uppercase 157 | text-align: left 158 | color: white 159 | white-space: nowrap 160 | line-height: 42px 161 | 162 | background-color: accent 163 | overflow: hidden 164 | transition: width ease .2s, color ease .2s, background-color ease .2s 165 | 166 | &:hover 167 | width: 200px 168 | box-shadow: 0 0 5px rgba(0,0,0,0.3) 169 | 170 | color: white 171 | 172 | &.selected 173 | border-bottom: none 174 | 175 | color: accent 176 | 177 | background: white 178 | 179 | &::before 180 | float: left 181 | 182 | display: inline-block 183 | width: nav-width 184 | height: nav-width 185 | margin: -10px 15px 0 -10px 186 | 187 | {font-medium} 188 | font-family: "Glyphicons Halflings" 189 | font-style: normal 190 | font-weight: normal 191 | letter-spacing: normal 192 | line-height: 60px 193 | text-align: center 194 | vertical-align: middle 195 | -webkit-font-smoothing: antialiased 196 | -moz-osx-font-smoothing: grayscale 197 | 198 | &[href="#home"]::before 199 | {icon-home} 200 | &[href="#about"]::before 201 | {icon-info-sign} 202 | &[href="#resources"]::before 203 | {icon-book} 204 | &[href="#lectures"]::before 205 | {icon-calendar} 206 | &[href="#assignments"]::before 207 | {icon-list} 208 | &[href="#project"]::before 209 | {icon-star} 210 | &[href="#people"]::before 211 | {icon-user} 212 | 213 | body > section 214 | border-bottom: 1px solid gray 215 | padding-bottom: 70px 216 | padding-top: 20px 217 | 218 | > h1 219 | margin-bottom: 40px 220 | 221 | {font-large} 222 | 223 | > section:not(:last-of-type) 224 | margin-bottom: 30px 225 | 226 | > section > h1 227 | margin-bottom: 10px 228 | 229 | {font-medium} 230 | 231 | #home 232 | text-align: center 233 | padding-top: body-padding 234 | 235 | > h1 236 | {font-largest} 237 | text-align: left 238 | 239 | margin-bottom: 50px 240 | 241 | > span 242 | display: block 243 | margin-top: 5px 244 | 245 | {font-medium} 246 | 247 | .department 248 | {font-small} 249 | vertical-align: middle 250 | 251 | #course-info 252 | margin: 10px auto 253 | text-align: left 254 | 255 | th 256 | font-weight: bold 257 | min-width: 200px 258 | vertical-align: top 259 | 260 | {font-medium} 261 | color: accent 262 | text-transform: uppercase 263 | 264 | opacity: 0.6 265 | 266 | tr:last-of-type 267 | line-height: 1 268 | 269 | .email::before 270 | {icon-envelope} 271 | margin-left: 5px 272 | 273 | #this-week 274 | margin: 30px auto 0 auto 275 | 276 | width: 1220px 277 | @media screen and (max-width: 1340px) 278 | width: 670px 279 | 280 | text-align: left 281 | 282 | li, p 283 | line-height: 1.1 284 | 285 | li 286 | margin-bottom: 10px 287 | 288 | > h1 289 | {font-large} 290 | opacity: 0.6 291 | 292 | .week-summary 293 | display: flex 294 | flex-wrap: wrap 295 | justify-content: center 296 | 297 | padding: 25px 298 | border: 2px solid accent 299 | border-radius: 8px 300 | 301 | {font-small} 302 | 303 | background-color: white 304 | box-shadow: 0 0 5px rgba(0,0,0,0.12) 305 | 306 | h1 307 | font-weight: bold 308 | text-transform: uppercase 309 | padding-bottom: 10px 310 | 311 | ul 312 | list-style-type: none 313 | margin: 0 314 | 315 | section 316 | width: 250px 317 | margin: 5px 20px 318 | 319 | vertical-align: top 320 | 321 | &.assignment 322 | > p 323 | margin-top: 0 324 | 325 | .files 326 | display: flex 327 | justify-content: space-between 328 | flex-wrap: wrap 329 | 330 | #about 331 | .module 332 | margin-bottom: 30px 333 | 334 | #textbooks 335 | img 336 | height: 200px 337 | margin: 0 10px 10px 0 338 | 339 | dd 340 | margin-bottom: 10px 341 | 342 | cite 343 | font-weight: bold 344 | 345 | #references 346 | ul 347 | margin-top: 10px 348 | 349 | #lectures 350 | > .abbreviations 351 | margin-bottom: 20px 352 | list-style-type: none 353 | 354 | #lectures > section 355 | margin-bottom: 20px 356 | {font-smallest} 357 | 358 | > table 359 | width: 100% 360 | margin-top: -50px 361 | border-collapse: collapse 362 | thead 363 | line-height: 50px 364 | 365 | tbody > tr:not(:last-of-type) 366 | border-bottom: 1px solid rgba(accent, 0.2) 367 | 368 | tbody > tr:not(:first-of-type) 369 | td, th 370 | padding-top: 15px 371 | 372 | th 373 | text-align: left 374 | text-transform: uppercase 375 | th, td 376 | vertical-align: top 377 | 378 | .label 379 | width: 20% 380 | .references 381 | width: 25% 382 | .slides 383 | width: 20% 384 | 385 | ul 386 | list-style-type: none 387 | margin: 0 388 | 389 | li 390 | line-height: normal 391 | margin-bottom: 10px 392 | 393 | h1 394 | margin-bottom: 15px 395 | 396 | .date, .video 397 | display: block 398 | margin-top: 5px 399 | 400 | .date 401 | color: accent 402 | font-size: 0.9em 403 | opacity: 0.6 404 | 405 | .video 406 | font-size: 0.85em 407 | 408 | &::after 409 | font-family: "Glyphicons Halflings" 410 | margin-left: 5px 411 | vertical-align: top 412 | {icon-video} 413 | 414 | .references 415 | padding-right: 60px 416 | 417 | // .icon 418 | // &.references, &.slides 419 | // &::before 420 | // position: absolute 421 | // left: -42px 422 | // top: 20px 423 | 424 | // font-size: 30px 425 | 426 | // &.references::before 427 | // {icon-book} 428 | 429 | // &.slides::before 430 | // {icon-pencil} 431 | 432 | // &.video::before 433 | // {icon-video} 434 | 435 | #assignments 436 | .policies 437 | margin-bottom: 30px 438 | 439 | .homework 440 | margin-bottom: 20px 441 | 442 | strong 443 | text-transform: uppercase 444 | display: block 445 | 446 | .module 447 | display: inline-block 448 | vertical-align: middle 449 | max-width: 600px 450 | width: 100% 451 | 452 | > * 453 | display: table-cell 454 | padding-right: 40px 455 | 456 | &:last-of-type 457 | padding-right: 0 458 | 459 | .title 460 | width: 310px 461 | 462 | > h1 463 | line-height: 1.6em 464 | white-space: nowrap 465 | 466 | > p 467 | margin-top: 0 468 | 469 | .deadline 470 | width: 190px 471 | 472 | .files 473 | width: 100px 474 | 475 | .submit, .solutions 476 | display: inline-block 477 | vertical-align: middle 478 | margin-top: 5px 479 | margin-left: 30px 480 | 481 | .submit 482 | text-align: center 483 | 484 | .icon 485 | margin-bottom: 5px 486 | 487 | &::before 488 | {icon-envelope} 489 | font-size: 32px 490 | margin-right: 0 491 | 492 | a:hover 493 | color: accent 494 | 495 | .icon::before 496 | opacity: 1 497 | 498 | #people 499 | > section:not(:last-of-type) 500 | margin-bottom: 50px 501 | 502 | > section.multiple-people 503 | margin-bottom: 30px 504 | max-width: 1300px 505 | 506 | ul 507 | display: flex 508 | flex-flow: row wrap 509 | list-style-type: none 510 | margin: 0 511 | 512 | .person 513 | display: flex 514 | 515 | margin-right: 20px 516 | margin-bottom: 20px 517 | 518 | flex-grow: 0 519 | flex-shrink: 0 520 | flex-basis: 600px 521 | width: 600px 522 | 523 | img-size = 150px 524 | 525 | min-height: img-size + 2 * module-padding 526 | 527 | > img 528 | width: img-size 529 | height: img-size 530 | margin-right: 20px 531 | border-radius: 8px 532 | 533 | flex: 0 0 auto 534 | 535 | > .info 536 | min-width: 0 // bizarre flexbox behavior; https://bugs.webkit.org/show_bug.cgi?id=94584#c2 537 | > p 538 | margin: 0 5px 539 | 540 | &.name 541 | font-weight: bold 542 | 543 | &.email 544 | overflow: hidden 545 | text-overflow: ellipsis 546 | 547 | &.bio 548 | margin-top: 10px 549 | 550 | {font-smallest} 551 | -------------------------------------------------------------------------------- /styles/tablet-and-phone.styl: -------------------------------------------------------------------------------- 1 | body > section 2 | padding-bottom: 50px 3 | 4 | > h1 5 | margin-bottom: 30px 6 | 7 | body > nav > a:hover 8 | width: auto 9 | 10 | #lectures > section 11 | .label, .references, .slides 12 | width: auto 13 | 14 | #assignments 15 | .solutions, .submit 16 | margin-top: 10px 17 | 18 | strong 19 | display: inline-block 20 | margin-right: 5px 21 | 22 | .submit 23 | text-align: left 24 | .icon 25 | display: inline-block 26 | &::before 27 | font-size: 16px 28 | 29 | #this-week 30 | width: 600px 31 | 32 | section 33 | width: 220px 34 | 35 | -------------------------------------------------------------------------------- /syllabusDS-GA1003-Spring2019.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/syllabusDS-GA1003-Spring2019.docx -------------------------------------------------------------------------------- /syllabusDS-GA1003-Spring2019.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidrosenberg/ml2019/1d1caddc04ab07c796560026741d020ea0c80abc/syllabusDS-GA1003-Spring2019.pdf -------------------------------------------------------------------------------- /templates/_assignment-details.hbs: -------------------------------------------------------------------------------- 1 |

Due: {{date Due}}, {{@root.assignmentsFrontmatter.[Due time]}}

2 |
3 | {{#each PDF}} 4 | {{@key}} 5 | {{/each}} 6 | {{#each ZIP}} 7 | {{@key}} 8 | {{/each}} 9 | {{#if noFiles}} 10 |

(Coming soon)

11 | {{/if}} 12 |
13 | -------------------------------------------------------------------------------- /templates/assignments.hbs: -------------------------------------------------------------------------------- 1 | {{#each this}} 2 |
3 |
4 |
5 |

{{Label}}

6 |

{{{Description}}}

7 |
8 | {{> _assignment-details }} 9 |
10 | {{#if Submittable}} 11 | 17 | {{/if}} 18 | {{#each Solutions}} 19 |
20 | Solutions: 21 | {{@key}} 22 |
23 | {{/each}} 24 |
25 | {{/each}} 26 | -------------------------------------------------------------------------------- /templates/lectures.hbs: -------------------------------------------------------------------------------- 1 | {{#each this}} 2 |
3 |

{{Title}}

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | {{#each Events}} 15 | 16 | 25 | 36 | 47 | 58 | 59 | {{/each}} 60 |
SlidesNotesReferences
17 |

18 | {{Label}} 19 | {{shortDate @key}} 20 | {{#if Video}} 21 | Video 22 | {{/if}} 23 |

24 |
26 |

Slides

27 | {{#if Slides}} 28 |
    {{#each Slides}} 29 |
  • {{maybeLink this}}
  • 30 | {{/each}} 31 |
32 | {{else}} 33 | (None) 34 | {{/if}} 35 |
37 |

Notes

38 | {{#if Notes}} 39 |
    {{#each Notes}} 40 |
  • {{maybeLink this}}
  • 41 | {{/each}} 42 |
43 | {{else}} 44 | (None) 45 | {{/if}} 46 |
48 |

References

49 | {{#if References}} 50 |
    {{#each References}} 51 |
  • {{maybeLink this}}
  • 52 | {{/each}} 53 |
54 | {{else}} 55 | (None) 56 | {{/if}} 57 |
61 |
62 | {{/each}} 63 | -------------------------------------------------------------------------------- /templates/this-week.hbs: -------------------------------------------------------------------------------- 1 | {{#if lecture}} 2 |
3 |

This week

4 | 5 |
6 | {{#with lecture}} 7 |
8 |

Slides

9 |
    10 | {{#each Events}} 11 | {{#each Slides}} 12 |
  • {{maybeLink this}}
  • 13 | {{/each}} 14 | {{/each}} 15 |
16 |
17 |
18 |

Notes

19 | 20 |
    21 | {{#each Events}} 22 | {{#each Notes}} 23 |
  • {{maybeLink this}}
  • 24 | {{/each}} 25 | {{/each}} 26 |
27 |
28 |
29 |

References

30 | 31 |
    32 | {{#each Events}} 33 | {{#each References}} 34 |
  • {{maybeLink this}}
  • 35 | {{/each}} 36 | {{/each}} 37 |
38 |
39 | {{/with}} 40 | {{#with assignment}} 41 |
42 |

{{Label}}

43 |

{{{Description}}}

44 | 45 | {{> _assignment-details }} 46 |
47 | {{/with}} 48 | 49 | {{#if Announcement}} 50 |

{{{Announcement}}}

51 | {{/if}} 52 |
53 |
54 | {{/if}} 55 | --------------------------------------------------------------------------------