import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
def generuj_zbior(n, seed, stromosc_krzywej, sukces_50_procent):
gen_liczb = np.random.default_rng(seed)
czas = gen_liczb.uniform(0,60,n)
prawdopodobienstwo_sukcesu = 1/(1+np.exp(-stromosc_krzywej*(czas-sukces_50_procent)))
wynik = gen_liczb.binomial(1, prawdopodobienstwo_sukcesu)
return czas, wynik
zbiory = [
{"n":100 , "seed":1, "stromosc": 0.2, "sukces50":30, "etykieta":"Zbiór 1" },
{"n":100 , "seed":1, "stromosc": 0.15, "sukces50":25, "etykieta":"Zbiór 2" },
{"n":100 , "seed":1, "stromosc": 0.25, "sukces50":35, "etykieta":"Zbiór 3" },
{"n":100 , "seed":1, "stromosc": 0.1, "sukces50":28, "etykieta":"Zbiór 4" }
]
siatka = np.linspace(0,60,500).reshape(-1,1)
fig, axs = plt.subplots(2,2, figsize=(12,10))
axs = axs.ravel()
for i, zbior in enumerate(zbiory):
czas, wynik = generuj_zbior(zbior["n"], zbior["seed"], zbior["stromosc"], zbior["sukces50"])
osX = czas.reshape(-1,1)
model = LogisticRegression()
model.fit(osX,wynik)
predykacja = model.predict_proba(siatka)[:,1] * 100
# dodanie do zbioru krzywych
axs[i].scatter(czas[wynik==0], wynik[wynik==0]*100 , c="red", alpha=0.6, label = "Porażka")
axs[i].scatter(czas[wynik==1], wynik[wynik==1]*100 , c="green", alpha=0.6, label = "Sukces")
axs[i].plot(siatka, predykacja, "b-",linewidth = 2, label="Regresja logistyczna")
axs[i].set_title(zbior["etykieta"])
axs[i].set_xlabel("Czas trwania gry [min]")
axs[i].set_ylabel("Prawdopodobieństwo sukcesu [%]")
axs[i].grid(True, alpha= 0.3)
axs[i].legend()
plt.suptitle("Regresja logistyczna", fontsize=14)
plt.tight_layout()
plt.show()