# -*- coding: utf-8 -*-
"""
Spyder Editor

Ispány Márton

Egy egyszerű lineáris regressziós modell tanítása

"""

# Szükséges Python könyvtárak beolvasása
import numpy as np;
import matplotlib.pyplot as plt;
from sklearn import linear_model;

# Globális paraméterek
n = 100;
a = 7;
b = 9;
sig = 2;

# A regressziós modell
X = np.linspace(1,10,n);
eps = np.random.normal(0,sig,n);
Y = a + b*X + eps;

# Regressziós egyenes és a mintapontok
res = 1000;
xline = np.linspace(1,10,res)
plt.figure(1);
plt.plot(xline,a+b*xline,color="red");
plt.scatter(X,Y,color="blue");
plt.show(); 

# Tanítás scikit-learn osztállyal
reg = linear_model.LinearRegression();
reg.fit(X.reshape(-1, 1),Y.reshape(-1, 1));
ahat = reg.intercept_;
bhat = reg.coef_;

# Tanítás numpy osztállyal
ahat1,bhat1 = np.polynomial.polynomial.polyfit(X,Y,1);

# Tanítás a normál egyenlet megoldásával
Phi = np.zeros((n,2));   # design mátrix
for ind in range(2):
    Phi[:,ind] = X**ind;
#endfor
A = np.dot(np.transpose(Phi),Phi);  # a normál egyenlet mátrixa
v = np.dot(np.transpose(Phi),Y);  # a normál egyenlet vektora
ahat2,bhat2 = np.linalg.solve(A,v);   # a normál egyenlet megoldása

# Teszt adatállomány generálása
ntest = 50;
Xtest = np.random.uniform(1,10,ntest);
Ytest = a + b*Xtest + np.random.normal(0,sig,ntest);

# Predikció a tesztadatállományra a scikit-learnnel
Ypred = reg.predict(Xtest.reshape(-1, 1));

# A predikció ábrázolása
plt.figure(2);
plt.plot(xline,a+b*xline,color="red");
plt.scatter(Xtest,Ytest,color="blue");
plt.scatter(Xtest,Ypred,color="green");
plt.show(); 

# A predikció kézi számolása
Ypred1 = ahat1 + bhat1*Xtest;
