Я хотел бы запустить функцию LOWESS, в которой разные точки данных имеют разные веса, но я не понимаю, как передать веса функции lowess
. Вот пример кода использования lowess
без весов.
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
# Create the data
x = np.random.uniform(low=-2*np.pi, high=2*np.pi, size=500)
y = np.sin(x) + np.random.normal(size=len(x))
# Apply LOWESS (Locally Weighted Scatterplot Smoothing)
lowess = sm.nonparametric.lowess
z = lowess(y, x)
w = lowess(y, x, frac=1./3)
# Plotting
plt.figure(figsize=(12, 6))
plt.scatter(x, y, label='Data', alpha=0.5)
plt.plot(z[:, 0], z[:, 1], label='LOWESS', color='red')
Мои точки различаются по значимости, поэтому я хотел бы иметь возможность создавать веса, такие как weights = p.random.randint(1,5,size=500)
, и использовать их в самом низком процессе. Я считаю, что это возможно в R, но не уверен, можно ли это сделать в Python. Есть ли способ?
Спасибо, это выглядит великолепно. Если вы хотите добавить это в качестве ответа, я приму это.
Сначала установите пакет skmisc
, который может выполнять Взвешенный ЛЕСС:
python3 -m pip install scikit-misc --user
Тогда для синтетического набора данных:
import numpy as np
from skmisc.loess import loess
import matplotlib.pyplot as plt
np.random.seed(12345)
x = np.sort(np.random.uniform(low=-2*np.pi, high=2*np.pi, size=500))
y = np.sin(x)
s = np.abs(0.2 * np.random.normal(size=x.size) + 0.01)
n = s * np.random.normal(size=x.size)
yn = y + n
w = 1 / s ** 2
Мы создаем объект LOESS и снабжаем его данными и весами:
regressor = loess(x, y, weights=w, span=0.3)
regressor.fit()
Регрессируем кривую:
prediction = regressor.predict(x)
И отобразите результат:
fig, axe = plt.subplots()
axe.scatter(x, yn)
axe.plot(x, prediction.values, color = "orange")
axe.grid()
Обратите внимание, что API этого пакета немного отличается от API sklearn
. Здесь есть еще один пример использования .
Кажется, этот пакет делает то, что вы ищете has2k1.github.io/scikit-misc/stable/generated/…