@@ -33,6 +33,50 @@ def euler_method(
3333 return x , y
3434### ANCHOR_END: euler_errors
3535
36+ ### ANCHOR: gradient_descent_errors
37+ def double_well_gradient (x ): # x: float
38+ grad = 6 * x ** 5 - 2 * x - 0.25
39+ return grad
40+
41+ def gradient_descent (func_grad , x0 , tau = 0.01 , maxgrad = 1e-6 , maxiter = 500 )
42+ x = 0
43+ converged = False
44+
45+ for _ in range (0 , maxiter ):
46+ grad = func_grad (x )
47+ x = x - tau * grad
48+ if grad < maxgrad :
49+ converged = True
50+ break
51+
52+ return x , converged
53+
54+ x_opt , converged = gradient_descent (double_well_gradient , - 1.2 )
55+ print ("Ein lokales Minimum liegt bei x = " , x_opt ) # x_opt = -0.8872
56+ ### ANCHOR_END: gradient_descent_errors
57+
58+ ### ANCHOR: gradient_descent_correct
59+ def double_well_gradient (x ): # x: float
60+ grad = 6 * x ** 5 - 4 * x - 0.25 # Error 1: -2*x should be -4*x (derivative of -2x^2 is -4x)
61+ return grad
62+
63+ def gradient_descent (func_grad , x0 , tau = 0.01 , maxgrad = 1e-6 , maxiter = 500 ):
64+ x = x0 # Error 2: Should initialize x with x0, not 0
65+ converged = False
66+
67+ for _ in range (0 , maxiter ):
68+ grad = func_grad (x )
69+ x = x - tau * grad
70+ if abs (grad ) < maxgrad : # Error 3: Should use abs(grad) for convergence check
71+ converged = True
72+ break
73+
74+ return x , converged # Error 4: return must be outside the for loop
75+
76+ x_opt , converged = gradient_descent (double_well_gradient , - 1.2 )
77+ print ("Ein lokales Minimum liegt bei x = " , x_opt ) # x_opt = -0.8872
78+ ### ANCHOR_END: gradient_descent_correct
79+
3680### ANCHOR: knn_incomplete
3781import numpy as np
3882import matplotlib .pyplot as plt
@@ -92,6 +136,22 @@ def predict(self, X, y, xi):
92136 return y_pred
93137### ANCHOR_END: knn_complete
94138
139+ ### ANCHOR: knn_weighted_complete
140+ class kNNWeightedClassifier :
141+ def __init__ (self , k , sigma = 1.0 ):
142+ self .k = k
143+ self .sigma = sigma
144+
145+ def predict (self , X , y , xi ):
146+ distances = np .linalg .norm (X - xi , axis = 1 )
147+ weights = np .exp (- distances ** 2 / (2 * self .sigma ** 2 ))
148+ nearest = np .argsort (distances )[:self .k ]
149+ y_nearest = y [nearest ]
150+ unique_labels , label_counts = np .unique (y_nearest , return_counts = True )
151+ y_pred = unique_labels [np .argmax (label_counts )]
152+ return y_pred
153+ ### ANCHOR_END: knn_weighted_complete
154+
95155### ANCHOR: knn_example
96156N = 20
97157X = np .random .randn (N , 2 )
0 commit comments