Вопрос или проблема
У меня есть набор данных x, y и ошибки по y, для которых я хочу выполнить взвешенную интерполяцию LOWESS. К сожалению, я застрял на Python 3.7.
Я пробовал пакет lowess
из statsmodels.api.nonparametric
, но он не поддерживает взвешивание.
Я пробовал пакет loess
из skmisc.loess
, который поддерживает взвешивание, но, судя по всему, он просто отсутствует в skmisc-0.1.4
. То есть, skmisc.loess
похоже существует, но функции loess
внутри него нет? Я получаю ошибку отсутствия DLL.
Есть ли еще какой-то вариант, который я пропустил, или я застрял, пытаясь создать свой собственный алгоритм регрессии LOWESS с весами вручную? Или, может быть, я просто что-то упускаю, когда дело доходит до skmisc
?
Traceback (most recent call last):
File "c:/Users/atomg/OneDrive - Thermochron Systems LLC/heman_code/Pro/misc_tools/asdf.py", line 2, in <module>
from skmisc.loess import loess
File "C:\Users\atomg\OneDrive - Thermochron Systems LLC\heman_code\Pro\.venv\lib\site-packages\skmisc\loess\__init__.py", line 51, in <module>
from ._loess import (loess, loess_model, loess_inputs, loess_control,
ImportError: DLL загрузка не удалась: Указанный модуль не найден.
Ответ или решение
Для выполнения взвешенной LOWESS интерполяции в Python 3.7, вы можете рассмотреть несколько альтернативных подходов, так как statsmodels
и skmisc
могут не удовлетворять вашим требованиям. В данной ситуации можно попробовать следующие методы:
-
Использование библиотеки
pygam
:
Библиотекаpygam
предоставляет методы для работы с обобщёнными аддитивными моделями и поддерживает взвешенные функции. Установите её с помощью команды:pip install pygam
Пример кода для взвешенной LOWESS интерполяции:
import numpy as np import matplotlib.pyplot as plt from pygam import LinearGAM, s # Ваши данные x = np.array([...]) # ваши значения x y = np.array([...]) # ваши значения y weights = np.array([...]) # ваши ошибки или веса # Подгонка GAM, используя s() для сигмоидальных (или LOWESS-подобных) функций gam = LinearGAM(s(0, n_splines=10)).fit(x, y, weights=weights) # Прогнозирование x_pred = np.linspace(min(x), max(x), 100) y_pred = gam.predict(x_pred) # Визуализация plt.scatter(x, y, c='blue', label='Данные') plt.plot(x_pred, y_pred, color='red', label='LOWESS интерполяция') plt.legend() plt.show()
-
Использование библиотеки
numpy
для реализации LOWESS:
Можно настроить свою собственную версию LOWESS с использованием базовых библиотекnumpy
иscipy
. Вот пример реализации:import numpy as np import matplotlib.pyplot as plt from statsmodels.nonparametric.smoothers_lowess import lowess # Ваши данные x = np.array([...]) # ваши значения x y = np.array([...]) # ваши значения y errors = np.array([...]) # ваши ошибки # Вычисление весов, основанных на ошибках weights = 1 / errors**2 # инверсные квадраты ошибок # Выполнение LOWESS с весами lowess_result = lowess(y, x, frac=0.3, weights=weights) # Визуализация plt.scatter(x, y, c='blue', label='Данные') plt.plot(lowess_result[:, 0], lowess_result[:, 1], color='red', label='LOWESS интерполяция') plt.legend() plt.show()
-
Переопределение функции
loess
изskmisc
:
Если у вас возникают ошибки DLL, убедитесь, что все зависимости установлены корректно. Попробуйте переустановитьskmisc
:pip uninstall skmisc pip install skmisc
Если проблема сохраняется, рассмотрите возможность использования виртуального окружения с другой версией Python или обновите свою текущую библиотеку, если это возможно.
Каждый из предложенных методов имеет свои особенности. Выбор подхода зависит от конкретных требований вашего проекта и данных, с которыми вы работаете.