import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# Load dataset
data = pd.read_csv("data.csv")
X = data.iloc[:, :-1].values
Y = data.iloc[:, -1].values

# Normalize data
scaler = StandardScaler()
X = scaler.fit_transform(X)

# RBF centers
kmeans = KMeans(n_clusters=10, random_state=42, n_init=10)
kmeans.fit(X)
centers = kmeans.cluster_centers_

# Calculate sigma
sigma = np.mean(np.linalg.norm(centers[:, None]-centers, axis=2))
sigma = max(sigma, 0.001)

# Gaussian activation
H = np.exp(-np.linalg.norm(X[:, None]-centers, axis=2)**2/(2*sigma**2))

# Train output layer
W = np.linalg.pinv(H) @ Y

# Prediction
pred = H @ W

print("Actual:", Y[:10])
print("Predicted:", pred[:10])
print("MSE:", np.mean((Y-pred)**2))

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