Как использовать scikit-learn, чтобы соответствовать полиному высокого порядка через точки данных?
Моя задача: подогнать точечные данные полиномиальной кривой высокой степени (#points = 3458). Контекст: Точки данных представляют собой измеренные яркости звезд и могут следовать переменной синусоидальной кривой, кривой низкой изменчивости, просто плоской кривой или некоторым из вышеперечисленных + неровностей (транзит планеты, вспышка...). Код: я нашел шаблон scikit-learn, который отлично работает для нескольких десятков точек и полинома ~10, но мне нужно применить его к большему количеству точек и с более высокой степенью полинома. Я настроил параметры кода, пытаясь точно настроить poly-fit для данных, но это просто не работает. Смотрите минимальную рабочую версию кода:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
def true_fun(X):
return np.cos(1.5 * np.pi * X)
n_samples = 200
degrees = [14,15, 16, 17,18]
X = 10*np.sort(np.random.rand(n_samples))
y = true_fun(X) + np.random.randn(n_samples) * 0.1
plt.figure(figsize=(20, 14))
for i in range(len(degrees)):
ax = plt.subplot(len(degrees), 1, i + 1)
polynomial_features = PolynomialFeatures(degree=degrees[i],
include_bias=False)
linear_regression = LinearRegression()
pipeline = Pipeline([("polynomial_features", polynomial_features),
("linear_regression", linear_regression)])
pipeline.fit(X[:, np.newaxis], y)
X_test = np.linspace(0, 10, 200)
plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label="Model")
plt.plot(X_test, true_fun(X_test), label="True function")
plt.scatter(X, y, edgecolor='b', s=20, label="Samples")
plt.xlim((0, 12))
plt.ylim((-2, 2))
plt.legend(loc="best")
plt.title("Degree {}".format(
degrees[i]))
plt.show()
Это вывод кода:
В этом примере из числа минимумов и максимумов в данных делается вывод, что многочлен степени 16 должен соответствовать спуску (поправьте меня, если я ошибаюсь). Тем не менее, ни один из них не подходит для данных.
Вопросы: я думаю, что настройка некоторых параметров кода (n_samples
, degrees
, X_test
) следует сделать хорошую посадку - знаете что? Можете ли вы предложить мне, что улучшить в коде, чтобы он работал, или предложить другой код? Должен ли я что-то изменить в pipeline.predict()
? - Я пытался заглянуть в него, но он для меня остается черным ящиком