Final Projects for CSU-P Math 242, Spring 2014:
General Information and Possible Project Topics
Introduction
The final project for this course should be a fairly significant program you
write to tackle a problem of your choosing.
The steps your will follow for this project process are:
- select a topic
- do appropriate research
- assemble data (if necessary)
- write (and debug) code
- put together some nice output (perhaps with the corresponding input or a
description thereof)
- write a report (and hand it in)
- give a presentation to the class on your project
By the way, if you wish to work with one or more of your fellow-students, that
is a possibility. You should make this clear very early in the process, and it
will be necessary for an equitable division of labor to be devised and clearly
demonstrated.
Finding a Topic
This is the first step, but an important one: your project will be much more
fun to do, will have better results, and will almost certainly earn you a
better grade, if you choose a topic about something you are interested in.
You should start here by thinking of something that provokes your curiousity:
something in another class you really liked and made you ask more questions,
something you do outside of class that you think could be done better (or at
least differently), something you've read or heard about somewhere that seems
interesting or really makes you want to know more.
Get in the habit of reading a tech magazine (Wired, Scientific
American, Communications of the ACM, The American Mathematical
Monthly, or some other discipline-specific journal in an area you care
about) and see which stories leave you wanting to know more.
If all else fails, start the sentence I wonder ... and see where
it takes you.
You project can be one to answer some scientific (or other) question with a
program, or it could be more oriented to creating a tool which could be used for
certain applications.
Consult your instructor early and often, either to ask for suggestions or simply
to announce what you topic will be.
Example topics
Here are some example topics you might consider:
- Write code which does facial recognition on digital images. There are a
variety of ways to do this, often to do with smoothing the image a bit,
putting it in some standard form, and then finding the smallest square
deviation from model images of known faces. Other techniques use basically
eigenvalue methods (looking for eigenfaces, this is called).
- Take some global climate data and look for overall patters and trends,
using techniques like the polynomial interpolation and Fourer transform
weekly projects we've done so far.
- Do some statistical analysis of texts, such as the "vocabulary richness"
weekly project we did. There is a lot of data and many statistical methods
are easy in Octave.
- Make some pretty pictures using Octave of some interesting
scientific data. How about a periodic table of electron orbitals,
geting functions from a book of physical chemistry for the equations of the
electron could around each element, then making nice 3-d plots of them with
Octave?
- Make a simulation of an interesting experiment, reaction, mathematical
problem, or whatever interests you. This could be a simulation of the
preditor-prey equations in population biology, or the rate of infections
of different viruses spreading through different kinds of populations (hey,
how about simulating a zombie apocalypse in different places, like New York
City vs Pueblo, CO, vs the entire North American continent vs the
European continent (smaller than North America and better public
transportation, so probably good for zombies)), or a chemistry experiment
you like, or the future evolution of a solare system with some number of
bodies in it, etc., etc.
- Implement some real, modern cryptographic tools, such as
- the RSA public-key cryptosystem, or Diffie-Helman key exchange, or
an elliptic curve cryptosystem;
- a digital signature system for producing electronic documents that
can be verified as coming from the claimed author; or
- a program to do steganography: hiding secret information in
other electronic files in such a way that it doesn't seem to be there
at all — e.g., part your program might take as input a
jpg image file and a piece of text and produce as output
another image file which had the text hidden in it (to the naked eye,
the new image would look just like the old one, except with a tiny
bit of increased fuzziness); you could then e-mail the file to a
friend or post it on a social media site, knowing that no one would
realize it was anything other than a regular image; someone who had
the rest of your program could run it on the new image through and it
would extract the hidden text.
- Do something with analysis of actual acoustic signals. You could surely
get them off the Internet in a standard file format like wav
which Octave would know how to read in (just they way it knew how
to read in jpg files for our image processing work in the Fourier
transform project). Then do analysis of them: take fft, see if
you can read off the fundamental tone (what a musician would say was
"the note they were playing"), and the higher Fourier coefficients which
give that instrument its characteristic flavor (what musicians call the
"overtones"). At that point, see if you could write something which
would take the signal from one instrument and make it sound as if it
were on another instrument.
- Play similar games with acoustic signals but for human voices. Or how
about some sort of analysis of whalesong?
- There are great datasets available in astronomy, play with some of them:
e.g.:
- make a map of this part of the galaxy, with known exoplanets shown;
- do Fourier analysis of the cosmic microwave background to find the
"fundamental frequency" of the universe — see if you can also
hear the overtones, make a recording which could be played out of the
speakers of a computer;
- take the cosmic ray data from our very own Dr. Brown and see if it
correlates with the cosmic microwave background;
- see if you can find any repetitive pattern in the cosmic microwave
background that might indicate some over-all shape of the universe,
the way the repetitive patter of images you see if you stand between
two mirrors tells you something about the room you're in;
- make a virtual orrey, something that tells where various
planets will be (or were) on arbitrary dates, both where they would
be in some external view of the solar system and where they would
appear to be in our night sky here on earth (at a certain location and
time);
- etc.
- Try to make a chatbot which would pass the
Turing test. Do
this by downloading lots of text from one of the sites we used for the
frequency analysis weekly project, break texts into "phrases", and then
collect data on which phrases tend to follow with other ones -- then, use
this compiled data to have your chatbot make reasonable-sounding responses
what whatever the user types in.
- Your own favorite!
Research
In consultation with your instructor, seek out and read appropriate texts and/or
articles which lay out theoretical or computational issues in your topic
Data
If your project involves experimental data, make sure you get the data early
and have enough of it, in a useful form, to do what you need.
Code
Write code to solve your problem. Please, before you are finished with it, make
sure you heavily comment and document your code. It should be efficient and
do all appropriate input sanity checks.
You will need to hand in to your instructor a draft (early version) of your code
at an intermediate stage of the project, to get feedback and to help you avoid
getting stuck.
Output
It is a very good idea to make a range of runs of a program for various
simplified examples or on simple (called "toy") data. Also collect outputs of
the program which answer the question (or make some progress towards answering
it) if that is you type of project, or which show off its functionality if
your project is more oriented towards functionality rather than a conclusion.
Graphs should always have very complete labels, and numbers or other information
printed to the screen should also be fully self-explanatory.
Report
You will need to describe you project in a report to be handed in. It should
explain the problem, the approach to solution, any details of the approach which
turned out to be important/surprising/tricky, and where you got data (if you
did). It should have a bibliography citing sources you used for theory or data,
if any. It should have the nice outputs mentioned above attached, along with
the code you have written, fully commented as mentioned above.
It would be very hard for this report to be fewer than a few pages; excluding
the bibliography and code, it should be at least a 1-5 pages.
The gold standard on writing a good report is something in the well-tested and
-loved standard format scientific paper. There are many guides to
writing such papers — here is a pretty good example of such a guide, please
read it.
Papers in mathematics and computer science have some difference with the
standard form in physical sciences. In particular, there is general no
"materials and methods" section. Instead, frequently the whole paper is
structured much more like a story, with an introduction and then a
narrative starting with a question and introducing some characters who then
are involved in the resolution of the question. Sort of a non-fiction
bildungsroman.
In any case, your paper should include at least the following parts:
- Title, author.
- Abstract: a short (one paragraph) description of the problem and
then something about your solution, at a very high level. (Really,
one paragraph.)
- Introduction/Background: some background on your problem, why it
interests you and where it comes from. This might be a good place to
make clear and complete definitions of terms in your problem. You can
give also background on the rules of the game, structure of the tournaments,
possible uses for the cryptographic technique you are implementing, history
of the physical and computer-simulated orrery, other approaches to numerical
solution of differential equations, etc., whichever is
relevant to your problem. (This should be at least a page, probably 2-5.)
- Methods/Solution Description: Give a fairly detailed high-level
description of your approach to a solution. This should include detailed
explanation of the structure of your code, naming programs and explaining
what they do and what their inputs and outputs are as well as what their
most important data structure (variables, be they scalars or matrices or
whatever) represent and how they are used. (This will be 2-5 pages,
probably.)
- Results: Examples of your code's best inputs and/or outputs,
showing its most interesting behavior with special attention and detail.
(Could be a couple or 10 still images, a movie, or other specific output.)
- Code: All your code will be an appendix to your report.
- References: If you used references for theorical ideas, please
have complete bibliographic citations for them (and/or 'net links). If
you got data from some particular sources, also refernce that here.
You may use whichever text processing program you like: your favorite word
processor, a tool for writing web pages, whatever. (Personally, I would use the
TeX typesetting program.) If you can send me an electronic form of the
paper in addition to handing one in physically, please do so.
Presentation
You will do a short (10-15 minute) report on your project to the class during
exam period, explaining the problem, your strategy in solving it, any issues
which came up during implementation, and showing off some of your nice output.
Note you will be expected to be attentive and involved in your classmates
presentations as well. You should try to retain some of the important points in
those other presentations and be able to ask reasonable questions and/or make
suggestions.
It is not easy to give good presentations.
Here is some
advice on important things to keep in mind, excerpted from the writings of
Edward Tufte ("The Leonardo Da Vinci of data," in the words of the New York
Times).
Please read the Tufte rules. Beyond that, some things I like to keep in mind
for a good talk are:
- Try to leave your audience with the big picture of what you are doing.
- Try to leave your audience also with at least one specific, concrete
result of your work.
- Make sure you talk a lot about the why, and the big idea of the
how.
- Make sure it is clear to your audience how to get more information on your
topic, should it be desired: how to contact you, how to find your results,
or where to find similar results.
- Don't waste your audience's time with irrelevancies, nor put distractions
on your slides.
- Slides should have information. Decoration on slides is optional
and should almost always be avoided. Tufte's term is "chartjunk." He
suggests that you think of the fraction of pixels devoted to actual
information and try to maximize it.
- Powerpoint (and its ilk) is almost certainly a tool which will make
your presentation worse. See this funny slide deck and Tufte's Cognitive Style of Powerpoint. You are almost
certainly better off with a PDF projected on the screen, or working at a
black- or white-board and giving a useful paper handout.