2727# classification problems
2828
2929
30- def sigmoid_function (z ) :
30+ def sigmoid_function (z : float | np . ndarray ) -> float | np . ndarray :
3131 """
3232 Also known as Logistic Function.
3333
@@ -42,11 +42,63 @@ def sigmoid_function(z):
4242
4343 @param z: input to the function
4444 @returns: returns value in the range 0 to 1
45+
46+ Examples:
47+ >>> sigmoid_function(4)
48+ 0.9820137900379085
49+ >>> sigmoid_function(np.array([-3, 3]))
50+ array([0.04742587, 0.95257413])
51+ >>> sigmoid_function(np.array([-3, 3, 1]))
52+ array([0.04742587, 0.95257413, 0.73105858])
53+ >>> sigmoid_function(np.array([-0.01, -2, -1.9]))
54+ array([0.49750002, 0.11920292, 0.13010847])
55+ >>> sigmoid_function(np.array([-1.3, 5.3, 12]))
56+ array([0.21416502, 0.9950332 , 0.99999386])
57+ >>> sigmoid_function(np.array([0.01, 0.02, 4.1]))
58+ array([0.50249998, 0.50499983, 0.9836975 ])
59+ >>> sigmoid_function(np.array([0.8]))
60+ array([0.68997448])
4561 """
4662 return 1 / (1 + np .exp (- z ))
4763
4864
49- def cost_function (h , y ):
65+ def cost_function (h : np .ndarray , y : np .ndarray ) -> float :
66+ """
67+ Cost function quantifies the error between predicted and expected values.
68+ The cost function used in Logistic Regression is called Log Loss
69+ or Cross Entropy Function.
70+
71+ J(θ) = (1/m) * Σ [ -y * log(hθ(x)) - (1 - y) * log(1 - hθ(x)) ]
72+
73+ Where:
74+ - J(θ) is the cost that we want to minimize during training
75+ - m is the number of training examples
76+ - Σ represents the summation over all training examples
77+ - y is the actual binary label (0 or 1) for a given example
78+ - hθ(x) is the predicted probability that x belongs to the positive class
79+
80+ @param h: the output of sigmoid function. It is the estimated probability
81+ that the input example 'x' belongs to the positive class
82+
83+ @param y: the actual binary label associated with input example 'x'
84+
85+ Examples:
86+ >>> estimations = sigmoid_function(np.array([0.3, -4.3, 8.1]))
87+ >>> cost_function(h=estimations,y=np.array([1, 0, 1]))
88+ 0.18937868932131605
89+ >>> estimations = sigmoid_function(np.array([4, 3, 1]))
90+ >>> cost_function(h=estimations,y=np.array([1, 0, 0]))
91+ 1.459999655669926
92+ >>> estimations = sigmoid_function(np.array([4, -3, -1]))
93+ >>> cost_function(h=estimations,y=np.array([1,0,0]))
94+ 0.1266663223365915
95+ >>> estimations = sigmoid_function(0)
96+ >>> cost_function(h=estimations,y=np.array([1]))
97+ 0.6931471805599453
98+
99+ References:
100+ - https://en.wikipedia.org/wiki/Logistic_regression
101+ """
50102 return (- y * np .log (h ) - (1 - y ) * np .log (1 - h )).mean ()
51103
52104
@@ -75,6 +127,10 @@ def logistic_reg(alpha, x, y, max_iterations=70000):
75127# In[68]:
76128
77129if __name__ == "__main__" :
130+ import doctest
131+
132+ doctest .testmod ()
133+
78134 iris = datasets .load_iris ()
79135 x = iris .data [:, :2 ]
80136 y = (iris .target != 0 ) * 1
0 commit comments