Q1. (Base Conversion) [15 marks] Note:- Please take inputs as command line arguments
You might be familiar with converting a given number in binary (base, b = 2) into its decimal equivalent. This question requires you to generalise it to any base b, and the program should be written in Python.
Given a string of a fractional number Nb in base b, convert it into its decimal equivalent ND. You need to check if the input is a valid number and get rid of leading zeros from the input.
-999999999 < = ND <= 999999999, ND ∈ ℝ
2 <= b <= 36
Example-
For Nb = HELLO.PY & b = 35; output, ND = 26137359.742041. For Nb = 00101.101 & b = 2; output, ND = 5.625. For Nb = GJDGXR & b = 36; output, ND = 999999999. For Nb = -4G & b = 17; output, ND = -84. For Nb = HELLO.PY & b = 10; output, “Invalid Input”. Important Note: You are NOT allowed to use built in functions like int() etc.
Q2. (Intro to ML) [15 marks] In this question, we will code a 1-D linear regression problem. We will provide pseudocode here, the students are required to transform it into a python code. Use numpy library for array/vector/matrices etc.
The data files are train.csv and test.csv.
File structure:
The structure of both files are similar. Train.csv has n_train = 10^4 rows and test.csv has n_test = 10^3 rows, each row corresponding to one data point. Each row has two values separated by comma. The first value is feature and second value is label of the data point.
Note:- z^T : transpose of z
Example-
If one row of train.txt is :
4,7
Then feature, x = 4 and label, y = 7.
Pseudo-code
Step-1: [1.5 marks] - Read files train.csv
- Create vector - X_train (dim - n_train x 1) and vector - y_train (dim - n_train x 1)
- Add a column to X_train so that its dimension becomes n_train x 2. First column of X_train should be all 1 and 2nd column is the same as before adding extra column.
Example -
X_train = [
2
3
4
]
New X_train = [
1 2
1 3
1 4 ]
Step-2: [0.5 marks]
Generate a 2-D vector w (dim: 2 x 1) initialised randomly with floating point numbers.
Step-3: [1.5 marks] Plot y vs x using matplotlib where x is the feature and y is the label read from the file train.csv.
Consider x’ = [1 x]^T (prepending 1 to x to generate 2-dimensional x-vector, which is nothing but a row of X_train transposed)
On the same figure plot the line w^T*x’ vs x.
Your figure should have a dot corresponding to each datapoint (x,y) and a straight line on the plot corresponding to w^T*x’.
Step-4: [2.5 marks] Set w_direct = (X_train^T * X_train)^(-1)* X_train^T*y_train
X_train is the n_train x 2 matrix defined earlier and y_train is the corresponding label vector.
Plot y vs x using matplotlib where x is the feature and y is the label read from the file train.csv.
Consider x’ = [1 x]^T (prepending 1 to x to generate 2-dimensional x-vector) On the same figure plot the line w_direct^T*x’ vs x.
Your figure should have a dot corresponding to each datapoint (x,y) and a straight line on the plot corresponding to w_direct^T*x’.
- Create vector - X_test (dim - n_test x 1) and vector - y_test (dim - n_test x 1)
- Add a column to X_test so that its dimension becomes n_test x 2. First column of X_test should be all 1 and 2nd column is the same as before adding extra column.
- Let y_pred1 = X_test*w (w is the final value after doing step 5) - Calculate root mean squared error between y_pred1 and y_test.
- Let y_pred2 = X_test*w_direct
- Calculate root mean squared error between y_pred2 and y_test.
Derivation of Updates (optional reading) In the loop of step 5 we did the following w ← w – eta*(w^T*x’ - y)*x’
The objective of the above step is to reduce the least squared error.
Let error = 0.5(w^T*x’-y)^2
So, derivative w.r.t. w gives: (w^T*x’-y)x’
We need to descend down the gradient to reach the minima, so we subtract eta times the above derivative from w to gradually reach minima. We set eta to small value because otherwise, w may overshoot the minima. w_direct can also be computed on the same line by setting derivative to zero (Google it!).