Steps: 1) Download EITHER the Gaussian skeleton OR the aspect skeleton. Rename it to LastName_em_gaussian.py or LastName_em_aspect.py, depending on which you chose (replacing LastName with your last name). 2) Download the archive with the assignment files, and run 'tar xzvf em_smoke_test_files.tar.gz'. 3) Fill in the TODOs in the skeleton file. Assume 2D points for the Gaussian version, and assume 2 discrete outputs from the set {0,1,2,3,4,5,6,7,8,9} for the aspect version. 4) Run the smoke test and make sure that it passes. DO THIS ON THE CSUG MACHINE. 5) Experiment with different values of --cluster_num and --iterations. Take note of trends in both training and development data. If you chose the Gaussian option, implement tied covariances as well as the standard, separate covariance setting. 6) Record what you did, why, and what the results were in your README. Discuss your interpretation of the results. Make sure the README is just plaintext (i.e. you should write it with vim, emacs, gedit, or something similar). 7) With your code on the CSUG machine in directory submit_dir (name is not important), run this: /u/cs446/TURN_IN submit_dir NOTE: For the Gaussian case, Professor Gildea went over two forms of the EM algorithm: the standard form in which the E-step only calculates p(z,n) (he used the variable ksi), and an alternate form where it also accumulates values for the new paramters (he used mu_prime and sigma_prime on the board). DO THE FIRST ONE. These two are not exactly equivalent because the second version uses the previous iteration's value of mu when calculating sigma, and that will slightly change the results when the iteration number is small, which could cause your code to fail the autograder. Follow the pseudocode in Section 17.7 of the notes. Interface: --iterations [int] Stop training after this many iterations through the data. --nodev When present, do NOT use development data. This means that your code should run for exactly the number of iterations specified in that argument (no early stopping). For this assignment, the autograder will always provide this argument, and will also always provide the --clusters_file argument (see below). When this argument isn't provided, you should use the development data to control training. --clusters_file [filename] When present, initializes clusters (either Gaussian or aspect model) from the given file. Not allowed to be provided with --cluster_num (see below). --cluster_num [int] Only provided if --clusters_file is NOT provided. Specifies the number of clusters (hidden variables; K in the notes). You should write code to randomly initialize all parameters of the model. NOTE: the autograder will never use this. This argument is provided to you as a convenience, but note that YOU WILL LOSE POINTS if you do not implement it and use it for your experimentation or fail to report your experimentation in your README. --print_params When present, parameters of the clusters will be printed. The skeleton file does this for you; do not modify the printing code. --data_file [filename] Load data from here. The last 10% will be reserved as dev data (and discarded if --nodev is provided).