在Python中做LOESS/LOWESS时有没有办法衡量数据点

问题描述 投票:0回答:1

我想运行一个 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 中完成。有办法吗?

python statistics statsmodels
1个回答
0
投票

首先安装可以执行

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 有点不同。还有另一个用法示例这里

© www.soinside.com 2019 - 2024. All rights reserved.