
"""simple docstring"""



from __future__ import annotations

from numpy import array, cos, cross, floataa, radians, sin
from numpy.typing import NDArray
def 					_UpperCAmelCase      ( __lowerCamelCase   :       float ,					__lowerCamelCase   :       float ,					__lowerCamelCase   :       bool = False		)     ->					list[float]:
  if radian_mode:
    return [magnitude * cos(__lowerCamelCase		), magnitude * sin(__lowerCamelCase		)]
  return [magnitude * cos(radians(__lowerCamelCase		)		), magnitude * sin(radians(__lowerCamelCase		)		)]
def 					_UpperCAmelCase      ( __lowerCamelCase   :       NDArray[floataa] ,					__lowerCamelCase   :       NDArray[floataa] ,					__lowerCamelCase   :       float = 10**-1		)     ->					bool:
  _snake_case					     =       cross(__lowerCamelCase ,					__lowerCamelCase		)
  _snake_case					     =       sum(__lowerCamelCase		)
  return abs(__lowerCamelCase		) < eps


if __name__ == "__main__":
 # Test to check if it works
 UpperCAmelCase__          = array(
     [
         polar_force(7_18.4, 180 - 30),
         polar_force(8_79.54, 45),
         polar_force(100, -90),
     ]
 )

 UpperCAmelCase__          = array([[0, 0], [0, 0], [0, 0]])

 assert in_static_equilibrium(forces, location)

 # Problem 1 in image_data/2D_problems.jpg
 UpperCAmelCase__          = array(
     [
         polar_force(30 * 9.81, 15),
         polar_force(215, 180 - 45),
         polar_force(264, 90 - 30),
     ]
 )

 UpperCAmelCase__          = array([[0, 0], [0, 0], [0, 0]])

 assert in_static_equilibrium(forces, location)

 # Problem in image_data/2D_problems_1.jpg
 UpperCAmelCase__          = array([[0, -2000], [0, -1200], [0, 15600], [0, -12400]])

 UpperCAmelCase__          = array([[0, 0], [6, 0], [10, 0], [12, 0]])

 assert in_static_equilibrium(forces, location)

 import doctest

 doctest.testmod()





"""simple docstring"""



# Logistic Regression from scratch

# In[62]:

# In[63]:

# importing all the required libraries

import numpy as np
from matplotlib import pyplot as plt
from sklearn import datasets
def 					_UpperCAmelCase      ( __lowerCamelCase   :       str		)     ->					List[Any]:
  return 1 / (1 + np.exp(-z		))
def 					_UpperCAmelCase      ( __lowerCamelCase   :       Optional[Any] ,					__lowerCamelCase   :       List[str]		)     ->					Optional[Any]:
  return (-y * np.log(__lowerCamelCase		) - (1 - y) * np.log(1 - h		)).mean()
def 					_UpperCAmelCase      ( __lowerCamelCase   :       Dict ,					__lowerCamelCase   :       Dict ,					__lowerCamelCase   :       Dict		)     ->					List[str]:
  _snake_case					     =       np.dot(__lowerCamelCase ,					__lowerCamelCase		)
  return np.sum(y * scores - np.log(1 + np.exp(__lowerCamelCase		)		)		)
def 					_UpperCAmelCase      ( __lowerCamelCase   :       List[str] ,					__lowerCamelCase   :       List[str] ,					__lowerCamelCase   :       Union[str, Any] ,					__lowerCamelCase   :       str=7_00_00		)     ->					Optional[Any]:
  _snake_case					     =       np.zeros(x.shape[1]		)

  for iterations in range(__lowerCamelCase		):
    _snake_case					     =       np.dot(__lowerCamelCase ,					__lowerCamelCase		)
    _snake_case					     =       sigmoid_function(__lowerCamelCase		)
    _snake_case					     =       np.dot(x.T ,					h - y		) / y.size
    _snake_case					     =       theta - alpha * gradient  # updating the weights
    _snake_case					     =       np.dot(__lowerCamelCase ,					__lowerCamelCase		)
    _snake_case					     =       sigmoid_function(__lowerCamelCase		)
    _snake_case					     =       cost_function(__lowerCamelCase ,					__lowerCamelCase		)
    if iterations % 1_00 == 0:
      print(f'''loss: {j} \t'''		)  # printing the loss after every 100 iterations
  return theta


# In[68]:

if __name__ == "__main__":
 UpperCAmelCase__          = datasets.load_iris()
 UpperCAmelCase__          = iris.data[:, :2]
 UpperCAmelCase__          = (iris.target != 0) * 1

 UpperCAmelCase__          = 0.1
 UpperCAmelCase__          = logistic_reg(alpha, x, y, max_iterations=70000)
 print('theta: ', theta)  # printing the theta i.e our weights vector
 def 					_UpperCAmelCase      ( __lowerCamelCase   :       Tuple		)     ->					Union[str, Any]:
   return sigmoid_function(
       np.dot(__lowerCamelCase ,					__lowerCamelCase		)		)  # predicting the value of probability from the logistic regression algorithm

 plt.figure(figsize=(10, 6))
 plt.scatter(x[y == 0][:, 0], x[y == 0][:, 1], color='b', label='0')
 plt.scatter(x[y == 1][:, 0], x[y == 1][:, 1], color='r', label='1')
 ((UpperCAmelCase__)      ,	(UpperCAmelCase__))          = (x[:, 0].min(), x[:, 0].max())
 ((UpperCAmelCase__)      ,	(UpperCAmelCase__))          = (x[:, 1].min(), x[:, 1].max())
 ((UpperCAmelCase__)      ,	(UpperCAmelCase__))          = np.meshgrid(np.linspace(xa_min, xa_max), np.linspace(xa_min, xa_max))
 UpperCAmelCase__          = np.c_[xxa.ravel(), xxa.ravel()]
 UpperCAmelCase__          = predict_prob(grid).reshape(xxa.shape)
 plt.contour(xxa, xxa, probs, [0.5], linewidths=1, colors='black')

 plt.legend()

 plt.show()



