import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv("Salary_Data.csv")
X = data["x"].values
Y = data["y"].values 

W = 0.5
b = 0.2
lr = 0.0001
epochs = 5000
loss = []

# Training
for i in range(epochs):
    output = W*X + b
    error = Y - output

    W += lr*np.mean(error*X)
    b += lr*np.mean(error)

    mse = np.mean((Y-(W*X+b))**2)
    loss.append(mse)

    if i % 100 == 0:
        print("Epoch:", i, "MSE:", round(mse, 4))

print("Weight:", W)
print("Bias:", b)
print("MSE:", loss[-1])

# Predictions
pred = W*X + b

# Graphs
plt.figure(figsize=(10, 4))

plt.subplot(1, 2, 1)
plt.plot(loss)
plt.title("Training Loss")
plt.xlabel("Epochs")
plt.ylabel("MSE")

plt.subplot(1, 2, 2)
plt.scatter(X, Y, label="Actual")
idx = np.argsort(X)
plt.plot(X[idx], pred[idx], "r", label="Predicted")
plt.title("Linear Regression")
plt.xlabel("X")
plt.ylabel("Y")
plt.legend()

plt.tight_layout()
plt.show()
