PolynomialRegression/Polynomial Regression.ipynb
2021-06-24 13:03:10 +02:00

53 KiB

Algorytm najszybszego spadku dla regresji wielomianowej.

Zakładamy, że dysponujemy zbiorem składającym się z dwóch cech (x i y). Modelujemy zależność y od x za pomocą funkcji wielomianowej. Celem projektu jest implementacja metody najszybszego spadku dla tego problemu. Zakładamy kwadratową funkcję straty. Implementacja powinna umożliwiać podanie stopnia wielomianu, który ma być użyty do modelowania. Implementacja powinna zwracać wektor oszacowanych parametrów oraz pokazywać wizualnie zmiany wartości funkcji straty wraz z postępem uczenia.

Zbiór danych: https://www.kaggle.com/varpit94/apple-stock-data-updated-till-22jun2021?select=AAPL.csv This dataset provides historical data of APPLE INC. stock (AAPL). The data is available at a daily level. Currency is USD.

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
degree = 6
X_plot = np.linspace(0, 150, 1000)
initial_theta = [0] * (degree + 1)
df = pd.read_csv('AAPL.csv')
X = df[['Low']]
Y = df['Volume']
display(df.head(5))
Date Open High Low Close Adj Close Volume
0 1980-12-12 0.128348 0.128906 0.128348 0.128348 0.100751 469033600
1 1980-12-15 0.122210 0.122210 0.121652 0.121652 0.095495 175884800
2 1980-12-16 0.113281 0.113281 0.112723 0.112723 0.088485 105728000
3 1980-12-17 0.115513 0.116071 0.115513 0.115513 0.090676 86441600
4 1980-12-18 0.118862 0.119420 0.118862 0.118862 0.093304 73449600
fig = plt.figure(figsize=(10,5))
chart = fig.add_subplot()
chart.plot(X,Y ,"go")
plt.show()

Metody do regresji wielomianowej

def polynomial_regression(theta, x):
    value = 0
    for i in range(len(theta)):
        value += theta[i] * x**i
    return value 

def mean_squared_error(Y_predicted, Y):
    result = 0
    for i in range(len(Y)):
        result += (Y_predicted[i] - Y[i]) ** 2
    return result/len(Y)

def gradient(theta, X, Y):
    return 1.0 / len(y) * (X.T * (X * theta - Y)) 

def gradient_descent(X, Y, theta, cost_function = mean_squared_error, alpha=0.1, eps=0.001, max_steps = 1000000):
    cost = cost_function([polynomial_regression(theta, x) for x in X], Y)
    logs = [[cost, theta]]
    
    for i in range(max_steps):
        theta = theta - alpha * gradient(theta, X, Y)
        next_cost = cost_function([polynomial_regression(theta, x) for x in X], Y)
        logs.append([next_cost, theta])
        if abs(cost - next_cost) <= eps:
            break
    return theta, logs
    
    
print(polynomial_regression([1,1,0,1], 2))
print(mean_squared_error([1,2,1,1],[1,2,43,1]))
11
441.0

Metody do wykresów

def plot_polynomial_regression(theta):
    fig = plt.figure(figsize=(10,5))
    Y_plot = [polynomial_regression(theta, x) for x in X_plot]
    chart = fig.add_subplot()
    chart.plot(X_plot, Y_plot, color="red", lw=2, label=f"degree {len(theta)}")
    chart.plot(X,Y ,"go")
    plt.show()
    
plot_polynomial_regression([1,100,0,1000])    

Wyniki za pomocą gotowej biblioteki

from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import Ridge, LinearRegression
model = make_pipeline(PolynomialFeatures(degree=degree, include_bias=True), 
                       LinearRegression())
model.fit(X,Y)
Pipeline(steps=[('polynomialfeatures', PolynomialFeatures(degree=6)),
                ('linearregression', LinearRegression())])
Y_plot = model.predict([[x] for x in X_plot])

fig = plt.figure(figsize=(10,5))
chart = fig.add_subplot()
chart.plot(X,Y ,"go")
chart.plot(X_plot, Y_plot, color="red", lw=2, label=f"degree {degree}")
degree
6