Scikit learn: интерполяция с линейной регрессией не работает - PullRequest
2 голосов
/ 23 января 2020

Я пытаюсь выполнить интерполяцию с использованием класса LineaerRegression в Scikit learn, но результат кажется неправильным. Идея состоит в том, чтобы использовать полиномиальное соответствие со степенью, равной количеству наблюдений минус один. Это должно заставить оценщик linearRegression произвести интерполяцию. Однако LinearRegression не дает интерполяционного решения.

Полный код:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# Data
x = np.array([65.44, 65.99, 65.16, 66.24, 66.85, 66.78, 67.52, 65.1 , 62.72,
       63.53, 63.62, 64.23, 64.89, 64.3 , 66.41])
y = np.array([8.5503, 8.5596, 8.4819, 8.505 , 8.5137, 8.5174, 8.5183, 8.5336,
       8.5581, 8.5534, 8.531 , 8.5546, 8.6349, 8.6553, 8.639 ])

# Design matrix with polynomial degree corresponding to the number of points (interpolation)
polyEstimator = PolynomialFeatures(len(x) - 1)
XHat = polyEstimator.fit_transform(x.reshape(-1, 1))

# Regression 
linReg = LinearRegression(fit_intercept=False) #normalize=True, 
linRegFit = linReg.fit(XHat, y)
yPredict = linRegFit.predict(XHat)
plt.figure()
plt.plot(x, yPredict, label='Fit')
plt.plot(x, y, 'x', label='True')
plt.legend()

enter image description here

Я пробовал с normalize = True, но также, что не дал правильный ответ .

1 Ответ

0 голосов
/ 23 января 2020

Вам необходимо прогнозировать в порядке возрастания x. Я решил это, поместив ваши данные в DataFrame, а затем отсортировав по x. Если вы прогнозируете этот фрейм данных, график верный. Вам нужна структура Dataframe, потому что вы не можете сортировать только по x. Это лишит законной силы ваши (x,y) пары.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
import pandas as pd
# Data
x = np.array([65.44, 65.99, 65.16, 66.24, 66.85, 66.78, 67.52, 65.1 , 62.72,
       63.53, 63.62, 64.23, 64.89, 64.3 , 66.41])
y = np.array([8.5503, 8.5596, 8.4819, 8.505 , 8.5137, 8.5174, 8.5183, 8.5336,
       8.5581, 8.5534, 8.531 , 8.5546, 8.6349, 8.6553, 8.639 ])

df = pd.DataFrame({'x': x, 'y': y})
df = df.sort_values(by='x')

# Design matrix with polynomial degree corresponding to the number of points (interpolation)
polyEstimator = PolynomialFeatures(len(x) - 1)
XHat = polyEstimator.fit_transform(np.array(df['x']).reshape(-1, 1))

# Regression
linReg = LinearRegression(fit_intercept=False) #normalize=True,
linRegFit = linReg.fit(XHat, df['y'])
df['yPredict'] = linRegFit.predict(XHat)
plt.figure()
plt.plot(df['x'], df['yPredict'], label='Fit')
plt.plot(df['x'], df['y'], 'x', label='True')
plt.legend()

enter image description here

...