import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression

def generuj_zbior (n, seed, k_true, x0_true):
    rng = np.random.default_rng(seed)
    czas = rng.uniform(0,60,n)
    prawd = 1/ (1 + np.exp(-k_true * (czas - x0_true)))
    wynik = rng.binomial(1,prawd)
    return czas, wynik

#Definicje 4 zestawów

zbiory = [
    {"n": 100, "seed": 1, "k_true": 0.2, "x0_true": 30, "etykieta":"Zbiór 1"},
    {"n": 100, "seed": 2, "k_true": 0.15, "x0_true": 25, "etykieta":"Zbiór 2"},
    {"n": 100, "seed": 3, "k_true": 0.25, "x0_true": 35, "etykieta":"Zbiór 3"},
    {"n": 100, "seed": 4, "k_true": 0.1, "x0_true": 28, "etykieta":"Zbiór 4"},
]

# Siatka do rysowania krzywej 
siatka = np.linspace(0,60,500).reshape(-1,1)

#4 Oddzielne wykresy
fig, axs = plt.subplots(2,2, figsize=(12,10))
axs = axs.ravel()
krzywe = [] # Tu zapiszemy krzywe do 5. wykresu

for i, zbior in enumerate(zbiory):
    #Dane
    czas, wynik = generuj_zbior(zbior["n"], zbior["seed"], zbior["k_true"], zbior["x0_true"])
    X = czas.reshape(-1,1)
    #Model
    model = LogisticRegression()
    model.fit(X, wynik)
    #Przewidywania
    przewidywanie = model.predict_proba(siatka) [:,1] * 100
    krzywe.append((przewidywanie, zbior["etykieta"])) # Zapisujemy do 5 wykresu
    #Punkty uczące
    axs[i].scatter(czas[wynik == 0], wynik[wynik == 0] * 100, c="red", alpha = 0.6, label = "Porażka (0)")
    axs[i].scatter(czas[wynik == 1], wynik[wynik == 1] * 100, c="green", alpha = 0.6, label = "Sukces (1)")
    #Krzywa
    axs[i].plot(siatka, przewidywanie, "b-", linewidth=2, label="Regresja logistyczna")
    #Opisy
    axs[i].set_title(zbior["etykieta"])
    axs[i].set_xlabel("Czas trening [min]")
    axs[i].set_ylabel("Sukces [%] (0/100)")
    axs[i].grid(True, alpha=0.3)
    axs[i].legend()

plt.suptitle("Regresja logiczna: 4 róźne zestawy danych", fontsize=14)
plt.tight_layout(rect=[0,0,1,0.97])
plt.show()