-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuitwerkingen.py
161 lines (119 loc) · 5.93 KB
/
uitwerkingen.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# https://stackoverflow.com/questions/17784587/gradient-descent-using-python-and-numpy
# https://atmamani.github.io/projects/ml/gradient-descent-in-python/
from operator import mul
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.mlab as mlab
def draw_graph(data):
#OPGAVE 1
# Maak een scatter-plot van de data die als parameter aan deze functie wordt meegegeven. Deze data
# is een twee-dimensionale matrix met in de eerste kolom de grootte van de steden, in de tweede
# kolom de winst van de vervoerder. Zet de eerste kolom op de x-as en de tweede kolom op de y-as.
# Je kunt hier gebruik maken van de mogelijkheid die Python biedt om direct een waarde toe te kennen
# aan meerdere variabelen, zoals in het onderstaande voorbeeld:
# l = [ 3, 4 ]
# x,y = l -> x = 3, y = 4
# Om deze constructie in dit specifieke geval te kunnen gebruiken, moet de data-matrix wel eerst
# roteren (waarom?).
# Maak gebruik van pytplot.scatter om dit voor elkaar te krijgen.
#YOUR CODE HERE
x, y = np.rot90(data)
plt.scatter(y, x)
plt.show()
def compute_cost(X, y, theta):
#OPGAVE 2
# Deze methode berekent de kosten van de huidige waarden van theta, dat wil zeggen de mate waarin de
# voorspelling (gegeven de specifieke waarde van theta) correspondeert met de werkelijke waarde (die
# is gegeven in y).
# Elk datapunt in X wordt hierin vermenigvuldigd met theta (welke dimensies hebben X en dus theta?)
# en het resultaat daarvan wordt vergeleken met de werkelijke waarde (dus met y). Het verschil tussen
# deze twee waarden wordt gekwadrateerd en het totaal van al deze kwadraten wordt gedeeld door het
# aantal data-punten om het gemiddelde te krijgen. Dit gemiddelde moet je retourneren (de variabele
# J: een getal, kortom).
# Een stappenplan zou het volgende kunnen zijn:
# 1. bepaal het aantal datapunten
# 2. bepaal de voorspelling (dus elk punt van X maal de huidige waarden van theta)
# 3. bereken het verschil tussen deze voorspelling en de werkelijke waarde
# 4. kwadrateer dit verschil
# 5. tel al deze kwadraten bij elkaar op en deel dit door twee keer het aantal datapunten
J = 0
# YOUR CODE HERE
# 1. Aantal datapunten
m = y.shape[0]
# 2. Voorspellingen
predictions = X.dot(theta)
# 3 & 4. Verschil voorspellingen en werkelijke waarde, vervolgens kwadrateren
errors = (predictions - y) ** 2
# 5. Tel het aantal op en deel het door het aantal datapunten
J = sum(errors)/(2 * m)
# print(J)
return J
def gradient_descent(X, y, theta, alpha, num_iters):
#OPGAVE 3a
# In deze opgave wordt elke parameter van theta num_iter keer geüpdate om de optimale waarden
# voor deze parameters te vinden. Per iteratie moet je alle parameters van theta update.
# Elke parameter van theta wordt verminderd met de som van de fout van alle datapunten
# vermenigvuldigd met het datapunt zelf (zie Blackboard voor de formule die hierbij hoort).
# Deze som zelf wordt nog vermenigvuldigd met de 'learning rate' alpha.
# Een mogelijk stappenplan zou zijn:
#
# Voor elke iteratie van 1 tot num_iters:
# 1. bepaal de voorspelling voor het datapunt, gegeven de huidige waarde van theta
# 2. bepaal het verschil tussen deze voorspelling en de werkelijke waarde
# 3. vermenigvuldig dit verschil met de i-de waarde van X
# 4. update de i-de parameter van theta, namelijk door deze te verminderen met
# alpha keer het gemiddelde van de som van de vermenigvuldiging uit 3
m,n = X.shape
costs = []
# YOUR CODE HERE
theta = theta.T
# Iterereer 1500 keer
for i in range (num_iters):
# 1. Bepaal de voorspelling
predictions = np.dot(X, theta)
# 2. Verschil met de daadwerkelijke waarde
diff = (predictions - y)
# 3. vermenigvuldig dit met X
multipliedDiff = X * diff
for index, _ in enumerate(theta):
totalSum = sum([value[index] for value in multipliedDiff])
theta[index] = theta[index] - alpha * (totalSum / m)
costs.append([i, compute_cost(X, y, theta)[0]])
# aan het eind van deze loop retourneren we de nieuwe waarde van theta
# (wat is de dimensionaliteit van theta op dit moment?).
# Dat zou theta = np.zeros( (1,2) ) -> (1,2) moeten zijn
return theta, costs
def draw_costs(data):
# OPGAVE 3b
# YOUR CODE HERE
y, x = np.rot90(data)
plt.plot(x, y)
plt.show()
def contour_plot(X, y):
#OPGAVE 4
# Deze methode tekent een contour plot voor verschillende waarden van theta_0 en theta_1.
# De infrastructuur en algemene opzet is al gegeven; het enige wat je hoeft te doen is
# de matrix J_vals vullen met waarden die je berekent aan de hand van de methode computeCost,
# die je hierboven hebt gemaakt.
# Je moet hiervoor door de waarden van t1 en t2 itereren, en deze waarden in een ndarray
# zetten. Deze ndarray kun je vervolgens meesturen aan de functie computeCost. Bedenk of je nog een
# transformatie moet toepassen of niet. Let op: je moet computeCost zelf *niet* aanpassen.
fig = plt.figure()
ax = fig.gca(projection = '3d')
jet = plt.get_cmap('jet')
t1 = np.linspace(-10, 10, 100)
t2 = np.linspace(-1, 4, 100)
T1, T2 = np.meshgrid(t1, t2)
J_vals = np.zeros( (len(t2), len(t2)) )
#YOUR CODE HERE
for i, val_t1 in enumerate(t1):
for j, val_t2 in enumerate(t2):
J_vals[i][j] = compute_cost(X, y, [[val_t1], [val_t2]])
surf = ax.plot_surface(T1, T2, J_vals, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)
xLabel = ax.set_xlabel(r'$\theta_0$', linespacing=3.2)
yLabel = ax.set_ylabel(r'$\theta_1$', linespacing=3.1)
zLabel = ax.set_zlabel(r'$J(\theta_0, \theta_1)$', linespacing=3.4)
ax.dist = 10
plt.show()