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()