**Homework 5**Working with Tensorflow. Due 12/4. This is the last homework assignment!**Projects**Rubric posted to D2L.- Due finals week
- 8-10 minute video presentation + documented notebook on your analysis
- 3 In-class work periods for the project

- Thursday: Day 19 Perceptron model

- Tuesday 11/24: Project work day 1
- Thursday 11/26: No class

- Tuesday 12/1: Day 20 Neural Networks 1
- Thursday 12/3: Day 21 Neural Networks 2

- Tuesday 12/8: Project work day 2
- Thursday 12/10: Project work day 3

- What is the perceptron model doing?
- How do we take the mathematics and make it into code?
- How is this different from a neural network?

- A perceptron model is trying to find a line to seperate the classes
- Each point in a 2D space has a location $(x_1, x_2)$; basically
`feature_1`

and`feature_2`

- A line in that space would have the normal form $A + Bx_1 + Cx_2 = 0$ or $x_2 = -\dfrac{B}{C}x_1 - \dfrac{A}{C}$
- Using an iterative approach, a Perceptron model tries to find $A$, $B$, and $C$.

`predict()`

¶The perceptron model iteratively determines $A$, $B$, and $C$ by looking at every point in the data it is trained on.

- Take the location of one data point plus a constant (the "bias"; e.g., 1) and take the dot product with an initial guess of the weights (e.g., $\vec{w} = (1,1,1)$). $$ result = \vec{x} \cdot \vec{w} = (x_1, x_2, 1) \cdot (1,1,1) = x_1 + x_2 + 1$$
- If $x_1 = 2$ and $x_2 = 3$, then the $result = (2+3+1) = 6$

**Because this is greater than zero, we predict it to be in class 1**

```
if result > 0:
predict class 1 and return 1;
else:
predict class 2 and return -1
```

For our example, we return 1!

But we know the class (because we are using *supervised learning*)!

- Originally we guessed the weights $\vec{w} = (1,1,1)$, we can use the misclassifications to update the weights.

**Let's assume we were wrong, so the data is actually in class 2.**

That update uses this equation:
$$ \vec{w}_{new} = \vec{w}_{old} + \eta*d*\vec{x}$$
where $\eta$ is the learning rate and $d$ = `actual_class_value`

- `predicted_class_value`

(as long as classes are 1 and -1)

We predicted class 1 (`class_label`

=1), but the data is in class 2 (`class_label`

=-1). So the update to the weights is:

where we choose $\eta$, let's take it to be 0.01. So the update is:

$$update = (-4,-6,-2)*0.01 = (-0.04, -0.06, -0.02)$$We add this to the guessed weights:

$$ \vec{w}_{new} = \vec{w}_{old} + update = (1,1,1) + (-0.04, -0.06, -0.02) = (0.96,0.94,0.98)$$In that case, the predicted and known classes are the same, so the update is:

$$update = \eta*d*\vec{x} = \eta*(-1 - (-1))*(2,3,1)$$$$update = \eta*(0)*(2,3,1) = (-4,-6,-2)*\eta = 0$$And there's no change to the weights because we did ok!

This means perceptrons don't find the "best line" just a line that separates the data.

`fit()`

¶```
for the number of iterations we choose:
for the data we have:
predict the class
update the weights
```