# Implement a Radial Basis Function Neural Network for function approximation.
# pip install numpy matplotlib
import numpy as np
import matplotlib.pyplot as plt

X = np.linspace(-5, 5, 100)
Y = np.sin(X)

centers = np.linspace(-5, 5, 10)
sigma = 1

# Hidden layer
H = np.exp(-((X[:, None]-centers)**2)/(2*sigma**2))

# Output weights
W = np.linalg.pinv(H) @ Y

# Prediction
pred = H @ W

print("Output Weights:", W)
print("MSE:", np.mean((Y-pred)**2))

# Graph
plt.plot(X, Y, label="Actual")
plt.plot(X, pred, label="Predicted")
plt.title("RBF Neural Network")
plt.xlabel("X")
plt.ylabel("Y")
plt.legend()
plt.show()