53 KiB
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