我想运行一个 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)
这样的权重,并让 Lowess 过程使用它们。我相信这在 R 中是可能的,但我不确定是否可以在 Python 中完成。有办法吗?
首先安装可以执行
Weighted LOESS的软件包
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 与
sklearn
API 有点不同。还有另一个用法示例这里。